diff --git a/.hgignore b/.hgignore index 4d98acf5d974d722bab5b39ecb8d9400a519a8d5..53ddf71bb79ecb63c743d8f67bd5f8271400142a 100644 --- a/.hgignore +++ b/.hgignore @@ -13,6 +13,7 @@ LICENSES indra/.distcc indra/build-darwin-* indra/build-vc[0-9]* +indra/CMakeFiles indra/lib/mono/1.0/*.dll indra/lib/mono/indra/*.dll indra/lib/mono/indra/*.exe @@ -31,6 +32,7 @@ indra/newview/mozilla-universal-darwin.tgz indra/newview/res-sdl indra/newview/vivox-runtime indra/server-linux-* +indra/temp indra/test/linden_file.dat indra/test_apps/llmediatest/dependencies/i686-win32 indra/test_apps/terrain_mule/*.dll @@ -53,3 +55,8 @@ glob:*.cpp.orig glob:*.cpp.bak glob:*.h.bak glob:*.h.orig +glob:indra/newview/typed_locations.txt +glob:indra/newview/teleport_history.txt +glob:indra/newview/search_history.txt +glob:indra/newview/filters.xml +glob:indra/newview/avatar_icons_cache.txt diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index db5495091e5b826eb14cf5433d6ecf2b16d3d650..b159092592bac2022512dfaa82b3ffa793225c44 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -35,13 +35,13 @@ if (WINDOWS) # Don't build DLLs. set(BUILD_SHARED_LIBS OFF) - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd" + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP" CACHE STRING "C++ compiler debug options" FORCE) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD" + "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP" CACHE STRING "C++ compiler release-with-debug options" FORCE) set(CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD" + "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP" CACHE STRING "C++ compiler release options" FORCE) set(CMAKE_CXX_STANDARD_LIBRARIES "") diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 4563b59ad2b5d1fff9e92af864fbae909742ce8b..4fc25dcc241224de7beab5eee8c964a031ae7db8 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -16,7 +16,7 @@ set(cmake_SOURCE_FILES CARes.cmake CURL.cmake CMakeCopyIfDifferent.cmake - CopyWinLibs.cmake + Copy3rdPartyLibs.cmake CSharpMacros.cmake DBusGlib.cmake DirectX.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake new file mode 100644 index 0000000000000000000000000000000000000000..bbf31f92972b1c8f4c8664f0a69b70964882fc2e --- /dev/null +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -0,0 +1,389 @@ +# -*- cmake -*- + +# The copy_win_libs folder contains file lists and a script used to +# copy dlls, exes and such needed to run the SecondLife from within +# VisualStudio. + +include(CMakeCopyIfDifferent) + +################################################################### +# set up platform specific lists of files that need to be copied +################################################################### +if(WINDOWS) + set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug") + set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo") + set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release") + + #******************************* + # VIVOX - *NOTE: no debug version + set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32") + set(vivox_files + SLVoice.exe + alut.dll + vivoxsdk.dll + ortp.dll + wrap_oal.dll + ) + + #******************************* + # Misc shared libs + + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") + set(debug_files + openjpegd.dll + libtcmalloc_minimal-debug.dll + libapr-1.dll + libaprutil-1.dll + libapriconv-1.dll + ) + + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") + set(release_files + openjpeg.dll + libtcmalloc_minimal.dll + libapr-1.dll + libaprutil-1.dll + libapriconv-1.dll + ) + + if (FMOD_SDK_DIR) + set(fmod_files fmod.dll) + endif (FMOD_SDK_DIR) + + #******************************* + # LLKDU + set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu") + if(NOT EXISTS ${internal_llkdu_path}) + if (EXISTS "${debug_src_dir}/llkdu.dll") + set(debug_llkdu_src "${debug_src_dir}/llkdu.dll") + set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/llkdu.dll") + endif (EXISTS "${debug_src_dir}/llkdu.dll") + + if (EXISTS "${release_src_dir}/llkdu.dll") + set(release_llkdu_src "${release_src_dir}/llkdu.dll") + set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/llkdu.dll") + set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/llkdu.dll") + endif (EXISTS "${release_src_dir}/llkdu.dll") + endif (NOT EXISTS ${internal_llkdu_path}) + +#******************************* +# Copy MS C runtime dlls, required for packaging. +# *TODO - Adapt this to support VC9 +if (MSVC80) + FIND_PATH(debug_msvc8_redist_path msvcr80d.dll + PATHS + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT + NO_DEFAULT_PATH + NO_DEFAULT_PATH + ) + + if(EXISTS ${debug_msvc8_redist_path}) + set(debug_msvc8_files + msvcr80d.dll + msvcp80d.dll + Microsoft.VC80.DebugCRT.manifest + ) + + copy_if_different( + ${debug_msvc8_redist_path} + "${SHARED_LIB_STAGING_DIR_DEBUG}" + out_targets + ${debug_msvc8_files} + ) + set(third_party_targets ${third_party_targets} ${out_targets}) + + endif (EXISTS ${debug_msvc8_redist_path}) + + FIND_PATH(release_msvc8_redist_path msvcr80.dll + PATHS + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT + NO_DEFAULT_PATH + NO_DEFAULT_PATH + ) + + if(EXISTS ${release_msvc8_redist_path}) + set(release_msvc8_files + msvcr80.dll + msvcp80.dll + Microsoft.VC80.CRT.manifest + ) + + copy_if_different( + ${release_msvc8_redist_path} + "${SHARED_LIB_STAGING_DIR_RELEASE}" + out_targets + ${release_msvc8_files} + ) + set(third_party_targets ${third_party_targets} ${out_targets}) + + copy_if_different( + ${release_msvc8_redist_path} + "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" + out_targets + ${release_msvc8_files} + ) + set(third_party_targets ${third_party_targets} ${out_targets}) + + endif (EXISTS ${release_msvc8_redist_path}) +endif (MSVC80) + +elseif(DARWIN) + set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug/Resources") + set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Resources") + set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release/Resources") + + set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin") + set(vivox_files + SLVoice + libalut.dylib + libopenal.dylib + libortp.dylib + libvivoxsdk.dylib + ) + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_debug") + set(debug_files + ) + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release") + set(release_files + libapr-1.0.3.7.dylib + libapr-1.dylib + libaprutil-1.0.3.8.dylib + libaprutil-1.dylib + libexpat.0.5.0.dylib + libexpat.dylib + libllqtwebkit.dylib + libndofdev.dylib + ) + + # fmod is statically linked on darwin + set(fmod_files "") + + #******************************* + # LLKDU + set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu") + if(NOT EXISTS ${internal_llkdu_path}) + if (EXISTS "${debug_src_dir}/libllkdu.dylib") + set(debug_llkdu_src "${debug_src_dir}/libllkdu.dylib") + set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.dylib") + endif (EXISTS "${debug_src_dir}/libllkdu.dylib") + + if (EXISTS "${release_src_dir}/libllkdu.dylib") + set(release_llkdu_src "${release_src_dir}/libllkdu.dylib") + set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.dylib") + set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.dylib") + endif (EXISTS "${release_src_dir}/libllkdu.dylib") + endif (NOT EXISTS ${internal_llkdu_path}) +elseif(LINUX) + # linux is weird, multiple side by side configurations aren't supported + # and we don't seem to have any debug shared libs built yet anyways... + set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}") + set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}") + set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}") + + set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux") + set(vivox_files + libalut.so + libopenal.so.1 + libortp.so + libvivoxsdk.so + SLVoice + ) + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_debug") + set(debug_files + ) + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_release_client") + # *FIX - figure out what to do with duplicate libalut.so here -brad + set(release_files + libapr-1.so.0 + libaprutil-1.so.0 + libatk-1.0.so + libcrypto.so.0.9.7 + libdb-4.2.so + libexpat.so + libgmock_main.so + libgmock.so.0 + libgmodule-2.0.so + libgobject-2.0.so + libgtest_main.so + libgtest.so.0 + libopenal.so + libopenjpeg.so + libssl.so + libstacktrace.so + libtcmalloc.so + libuuid.so.1 + libz.so + libssl.so.0.9.7 + ) + + if (FMOD_SDK_DIR) + set(fmod_files "libfmod-3.75.so") + endif (FMOD_SDK_DIR) + + #******************************* + # LLKDU + set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu") + if(NOT EXISTS ${internal_llkdu_path}) + if (EXISTS "${debug_src_dir}/libllkdu.so") + set(debug_llkdu_src "${debug_src_dir}/libllkdu.so") + set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.so") + endif (EXISTS "${debug_src_dir}/libllkdu.so") + + if (EXISTS "${release_src_dir}/libllkdu.so") + set(release_llkdu_src "${release_src_dir}/libllkdu.so") + set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.so") + set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.so") + endif (EXISTS "${release_src_dir}/libllkdu.so") + endif(NOT EXISTS ${internal_llkdu_path}) +else(WINDOWS) + message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...") + set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux") + set(vivox_files "") + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug") + set(debug_files "") + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release") + set(release_files "") + + set(fmod_files "") + + set(debug_llkdu_src "") + set(debug_llkdu_dst "") + set(release_llkdu_src "") + set(release_llkdu_dst "") + set(relwithdebinfo_llkdu_dst "") +endif(WINDOWS) + + +################################################################ +# Done building the file lists, now set up the copy commands. +################################################################ + +copy_if_different( + ${vivox_src_dir} + "${SHARED_LIB_STAGING_DIR_DEBUG}" + out_targets + ${vivox_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${vivox_src_dir} + "${SHARED_LIB_STAGING_DIR_RELEASE}" + out_targets + ${vivox_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${vivox_src_dir} + "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" + out_targets + ${vivox_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + + + +copy_if_different( + ${debug_src_dir} + "${SHARED_LIB_STAGING_DIR_DEBUG}" + out_targets + ${debug_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${release_src_dir} + "${SHARED_LIB_STAGING_DIR_RELEASE}" + out_targets + ${release_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${release_src_dir} + "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" + out_targets + ${release_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +if (FMOD_SDK_DIR) + copy_if_different( + ${FMOD_SDK_DIR} + "${CMAKE_CURRENT_BINARY_DIR}/Debug" + out_targets + ${fmod_files} + ) + set(all_targets ${all_targets} ${out_targets}) + copy_if_different( + ${FMOD_SDK_DIR} + "${CMAKE_CURRENT_BINARY_DIR}/Release" + out_targets + ${fmod_files} + ) + set(all_targets ${all_targets} ${out_targets}) + copy_if_different( + ${FMOD_SDK_DIR} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDbgInfo" + out_targets + ${fmod_files} + ) + set(all_targets ${all_targets} ${out_targets}) +endif (FMOD_SDK_DIR) + +#******************************* +# LLKDU +set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu") +if(NOT EXISTS ${internal_llkdu_path}) + if (EXISTS "${debug_llkdu_src}") + ADD_CUSTOM_COMMAND( + OUTPUT ${debug_llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst} + DEPENDS ${debug_llkdu_src} + COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_DEBUG}" + ) + set(third_party_targets ${third_party_targets} $} ${debug_llkdu_dst}) + endif (EXISTS "${debug_llkdu_src}") + + if (EXISTS "${release_llkdu_src}") + ADD_CUSTOM_COMMAND( + OUTPUT ${release_llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst} + DEPENDS ${release_llkdu_src} + COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELEASE}" + ) + set(third_party_targets ${third_party_targets} ${release_llkdu_dst}) + + ADD_CUSTOM_COMMAND( + OUTPUT ${relwithdebinfo_llkdu_dst} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst} + DEPENDS ${release_llkdu_src} + COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" + ) + set(third_party_targets ${third_party_targets} ${relwithdebinfo_llkdu_dst}) + endif (EXISTS "${release_llkdu_src}") + +endif (NOT EXISTS ${internal_llkdu_path}) + + +add_custom_target(stage_third_party_libs ALL + DEPENDS + ${third_party_targets} + ) diff --git a/indra/cmake/DeploySharedLibs.cmake b/indra/cmake/DeploySharedLibs.cmake index a7e772bd7501e3d67c9fb58b779bfc57be88f137..663c272e502ffca8e33b2e7c7784e672a85bf687 100644 --- a/indra/cmake/DeploySharedLibs.cmake +++ b/indra/cmake/DeploySharedLibs.cmake @@ -6,8 +6,14 @@ # BIN_NAME= The full path the the binary to search for dependecies. # SEARCH_DIRS= The full paths to dirs to search for dependencies. # DST_PATH= The full path where the dependecies will be copied. -include(GetPrerequisites) + +# *FIX:Mani - I pulled in the CMake 2.8 GetPrerequisites.cmake script here, because it works on windows where 2.6 did not. +# Once we have officially upgraded to 2.8 we can just use that version of GetPrerequisites.cmake. +get_filename_component(current_dir ${CMAKE_CURRENT_LIST_FILE} PATH) +include(${current_dir}/GetPrerequisites_2_8.cmake) + message("Getting recursive dependencies for file: ${BIN_NAME}") + set(EXCLUDE_SYSTEM 1) set(RECURSE 1) get_filename_component(EXE_PATH ${BIN_NAME} PATH) @@ -26,42 +32,42 @@ endif(DEP_FILES) foreach(DEP_FILE ${DEP_FILES}) if(FOUND_FILES) - list(FIND FOUND_FILES ${DEP_FILE} FOUND) + list(FIND FOUND_FILES ${DEP_FILE} FOUND) else(FOUND_FILES) - set(FOUND -1) + set(FOUND -1) endif(FOUND_FILES) if(FOUND EQUAL -1) - find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH) - if(DEP_PATH) - set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}") - set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call. - else(DEP_PATH) - set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE}) - endif(DEP_PATH) + find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH) + if(DEP_PATH) + set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}") + set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call. + else(DEP_PATH) + set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE}) + endif(DEP_PATH) endif(FOUND EQUAL -1) endforeach(DEP_FILE) if(MISSING_FILES) message("Missing:") foreach(FILE ${MISSING_FILES}) - message(" ${FILE}") + message(" ${FILE}") endforeach(FILE) message("Searched in:") foreach(SEARCH_DIR ${SEARCH_DIRS}) - message(" ${SEARCH_DIR}") + message(" ${SEARCH_DIR}") endforeach(SEARCH_DIR) message(FATAL_ERROR "Failed") endif(MISSING_FILES) if(FOUND_FILES) foreach(FILE ${FOUND_FILES}) - get_filename_component(DST_FILE ${FILE} NAME) - set(DST_FILE "${DST_PATH}/${DST_FILE}") - message("Copying ${FILE} to ${DST_FILE}") - execute_process( - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE} - ) + get_filename_component(DST_FILE ${FILE} NAME) + set(DST_FILE "${DST_PATH}/${DST_FILE}") + message("Copying ${FILE} to ${DST_FILE}") + execute_process( + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE} + ) endforeach(FILE ${FOUND_FILES}) endif(FOUND_FILES) message("Success!") diff --git a/indra/cmake/GetPrerequisites_2_8.cmake b/indra/cmake/GetPrerequisites_2_8.cmake new file mode 100644 index 0000000000000000000000000000000000000000..5a24842c896af36c13b8897a0285222dbffa2d12 --- /dev/null +++ b/indra/cmake/GetPrerequisites_2_8.cmake @@ -0,0 +1,786 @@ +# GetPrerequisites.cmake +# +# This script provides functions to list the .dll, .dylib or .so files that an +# executable or shared library file depends on. (Its prerequisites.) +# +# It uses various tools to obtain the list of required shared library files: +# dumpbin (Windows) +# ldd (Linux/Unix) +# otool (Mac OSX) +# +# The following functions are provided by this script: +# gp_append_unique +# is_file_executable +# gp_item_default_embedded_path +# (projects can override with gp_item_default_embedded_path_override) +# gp_resolve_item +# (projects can override with gp_resolve_item_override) +# gp_resolved_file_type +# gp_file_type +# get_prerequisites +# list_prerequisites +# list_prerequisites_by_glob +# +# Requires CMake 2.6 or greater because it uses function, break, return and +# PARENT_SCOPE. + +#============================================================================= +# Copyright 2008-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + +# gp_append_unique list_var value +# +# Append value to the list variable ${list_var} only if the value is not +# already in the list. +# +function(gp_append_unique list_var value) + set(contains 0) + + foreach(item ${${list_var}}) + if("${item}" STREQUAL "${value}") + set(contains 1) + break() + endif("${item}" STREQUAL "${value}") + endforeach(item) + + if(NOT contains) + set(${list_var} ${${list_var}} "${value}" PARENT_SCOPE) + endif(NOT contains) +endfunction(gp_append_unique) + + +# is_file_executable file result_var +# +# Return 1 in ${result_var} if ${file} is a binary executable. +# +# Return 0 in ${result_var} otherwise. +# +function(is_file_executable file result_var) + # + # A file is not executable until proven otherwise: + # + set(${result_var} 0 PARENT_SCOPE) + + get_filename_component(file_full "${file}" ABSOLUTE) + string(TOLOWER "${file_full}" file_full_lower) + + # If file name ends in .exe on Windows, *assume* executable: + # + if(WIN32) + if("${file_full_lower}" MATCHES "\\.exe$") + set(${result_var} 1 PARENT_SCOPE) + return() + endif("${file_full_lower}" MATCHES "\\.exe$") + + # A clause could be added here that uses output or return value of dumpbin + # to determine ${result_var}. In 99%+? practical cases, the exe name + # match will be sufficient... + # + endif(WIN32) + + # Use the information returned from the Unix shell command "file" to + # determine if ${file_full} should be considered an executable file... + # + # If the file command's output contains "executable" and does *not* contain + # "text" then it is likely an executable suitable for prerequisite analysis + # via the get_prerequisites macro. + # + if(UNIX) + if(NOT file_cmd) + find_program(file_cmd "file") + endif(NOT file_cmd) + + if(file_cmd) + execute_process(COMMAND "${file_cmd}" "${file_full}" + OUTPUT_VARIABLE file_ov + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Replace the name of the file in the output with a placeholder token + # (the string " _file_full_ ") so that just in case the path name of + # the file contains the word "text" or "executable" we are not fooled + # into thinking "the wrong thing" because the file name matches the + # other 'file' command output we are looking for... + # + string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}") + string(TOLOWER "${file_ov}" file_ov) + + #message(STATUS "file_ov='${file_ov}'") + if("${file_ov}" MATCHES "executable") + #message(STATUS "executable!") + if("${file_ov}" MATCHES "text") + #message(STATUS "but text, so *not* a binary executable!") + else("${file_ov}" MATCHES "text") + set(${result_var} 1 PARENT_SCOPE) + return() + endif("${file_ov}" MATCHES "text") + endif("${file_ov}" MATCHES "executable") + else(file_cmd) + message(STATUS "warning: No 'file' command, skipping execute_process...") + endif(file_cmd) + endif(UNIX) +endfunction(is_file_executable) + + +# gp_item_default_embedded_path item default_embedded_path_var +# +# Return the path that others should refer to the item by when the item +# is embedded inside a bundle. +# +# Override on a per-project basis by providing a project-specific +# gp_item_default_embedded_path_override function. +# +function(gp_item_default_embedded_path item default_embedded_path_var) + + # On Windows and Linux, "embed" prerequisites in the same directory + # as the executable by default: + # + set(path "@executable_path") + set(overridden 0) + + # On the Mac, relative to the executable depending on the type + # of the thing we are embedding: + # + if(APPLE) + # + # The assumption here is that all executables in the bundle will be + # in same-level-directories inside the bundle. The parent directory + # of an executable inside the bundle should be MacOS or a sibling of + # MacOS and all embedded paths returned from here will begin with + # "@executable_path/../" and will work from all executables in all + # such same-level-directories inside the bundle. + # + + # By default, embed things right next to the main bundle executable: + # + set(path "@executable_path/../../Contents/MacOS") + + # Embed .dylibs right next to the main bundle executable: + # + if(item MATCHES "\\.dylib$") + set(path "@executable_path/../MacOS") + set(overridden 1) + endif(item MATCHES "\\.dylib$") + + # Embed frameworks in the embedded "Frameworks" directory (sibling of MacOS): + # + if(NOT overridden) + if(item MATCHES "[^/]+\\.framework/") + set(path "@executable_path/../Frameworks") + set(overridden 1) + endif(item MATCHES "[^/]+\\.framework/") + endif(NOT overridden) + endif() + + # Provide a hook so that projects can override the default embedded location + # of any given library by whatever logic they choose: + # + if(COMMAND gp_item_default_embedded_path_override) + gp_item_default_embedded_path_override("${item}" path) + endif(COMMAND gp_item_default_embedded_path_override) + + set(${default_embedded_path_var} "${path}" PARENT_SCOPE) +endfunction(gp_item_default_embedded_path) + + +# gp_resolve_item context item exepath dirs resolved_item_var +# +# Resolve an item into an existing full path file. +# +# Override on a per-project basis by providing a project-specific +# gp_resolve_item_override function. +# +function(gp_resolve_item context item exepath dirs resolved_item_var) + set(resolved 0) + set(resolved_item "${item}") + + # Is it already resolved? + # + if(EXISTS "${resolved_item}") + set(resolved 1) + endif(EXISTS "${resolved_item}") + + if(NOT resolved) + if(item MATCHES "@executable_path") + # + # @executable_path references are assumed relative to exepath + # + string(REPLACE "@executable_path" "${exepath}" ri "${item}") + get_filename_component(ri "${ri}" ABSOLUTE) + + if(EXISTS "${ri}") + #message(STATUS "info: embedded item exists (${ri})") + set(resolved 1) + set(resolved_item "${ri}") + else(EXISTS "${ri}") + message(STATUS "warning: embedded item does not exist '${ri}'") + endif(EXISTS "${ri}") + endif(item MATCHES "@executable_path") + endif(NOT resolved) + + if(NOT resolved) + if(item MATCHES "@loader_path") + # + # @loader_path references are assumed relative to the + # PATH of the given "context" (presumably another library) + # + get_filename_component(contextpath "${context}" PATH) + string(REPLACE "@loader_path" "${contextpath}" ri "${item}") + get_filename_component(ri "${ri}" ABSOLUTE) + + if(EXISTS "${ri}") + #message(STATUS "info: embedded item exists (${ri})") + set(resolved 1) + set(resolved_item "${ri}") + else(EXISTS "${ri}") + message(STATUS "warning: embedded item does not exist '${ri}'") + endif(EXISTS "${ri}") + endif(item MATCHES "@loader_path") + endif(NOT resolved) + + if(NOT resolved) + set(ri "ri-NOTFOUND") + find_file(ri "${item}" ${exepath} ${dirs} NO_DEFAULT_PATH) + find_file(ri "${item}" ${exepath} ${dirs} /usr/lib) + if(ri) + #message(STATUS "info: 'find_file' in exepath/dirs (${ri})") + set(resolved 1) + set(resolved_item "${ri}") + set(ri "ri-NOTFOUND") + endif(ri) + endif(NOT resolved) + + if(NOT resolved) + if(item MATCHES "[^/]+\\.framework/") + set(fw "fw-NOTFOUND") + find_file(fw "${item}" + "~/Library/Frameworks" + "/Library/Frameworks" + "/System/Library/Frameworks" + ) + if(fw) + #message(STATUS "info: 'find_file' found framework (${fw})") + set(resolved 1) + set(resolved_item "${fw}") + set(fw "fw-NOTFOUND") + endif(fw) + endif(item MATCHES "[^/]+\\.framework/") + endif(NOT resolved) + + # Using find_program on Windows will find dll files that are in the PATH. + # (Converting simple file names into full path names if found.) + # + if(WIN32) + if(NOT resolved) + set(ri "ri-NOTFOUND") + find_program(ri "${item}" PATHS "${exepath};${dirs}" NO_DEFAULT_PATH) + find_program(ri "${item}" PATHS "${exepath};${dirs}") + if(ri) + #message(STATUS "info: 'find_program' in exepath/dirs (${ri})") + set(resolved 1) + set(resolved_item "${ri}") + set(ri "ri-NOTFOUND") + endif(ri) + endif(NOT resolved) + endif(WIN32) + + # Provide a hook so that projects can override item resolution + # by whatever logic they choose: + # + if(COMMAND gp_resolve_item_override) + gp_resolve_item_override("${context}" "${item}" "${exepath}" "${dirs}" resolved_item resolved) + endif(COMMAND gp_resolve_item_override) + + if(NOT resolved) + message(STATUS " +warning: cannot resolve item '${item}' + + possible problems: + need more directories? + need to use InstallRequiredSystemLibraries? + run in install tree instead of build tree? +") +# message(STATUS " +#****************************************************************************** +#warning: cannot resolve item '${item}' +# +# possible problems: +# need more directories? +# need to use InstallRequiredSystemLibraries? +# run in install tree instead of build tree? +# +# context='${context}' +# item='${item}' +# exepath='${exepath}' +# dirs='${dirs}' +# resolved_item_var='${resolved_item_var}' +#****************************************************************************** +#") + endif(NOT resolved) + + set(${resolved_item_var} "${resolved_item}" PARENT_SCOPE) +endfunction(gp_resolve_item) + + +# gp_resolved_file_type original_file file exepath dirs type_var +# +# Return the type of ${file} with respect to ${original_file}. String +# describing type of prerequisite is returned in variable named ${type_var}. +# +# Use ${exepath} and ${dirs} if necessary to resolve non-absolute ${file} +# values -- but only for non-embedded items. +# +# Possible types are: +# system +# local +# embedded +# other +# +function(gp_resolved_file_type original_file file exepath dirs type_var) + #message(STATUS "**") + + if(NOT IS_ABSOLUTE "${original_file}") + message(STATUS "warning: gp_resolved_file_type expects absolute full path for first arg original_file") + endif() + + set(is_embedded 0) + set(is_local 0) + set(is_system 0) + + set(resolved_file "${file}") + + if("${file}" MATCHES "^@(executable|loader)_path") + set(is_embedded 1) + endif() + + if(NOT is_embedded) + if(NOT IS_ABSOLUTE "${file}") + gp_resolve_item("${original_file}" "${file}" "${exepath}" "${dirs}" resolved_file) + endif() + + string(TOLOWER "${original_file}" original_lower) + string(TOLOWER "${resolved_file}" lower) + + if(UNIX) + if(resolved_file MATCHES "^(/lib/|/lib32/|/lib64/|/usr/lib/|/usr/lib32/|/usr/lib64/|/usr/X11R6/)") + set(is_system 1) + endif() + endif() + + if(APPLE) + if(resolved_file MATCHES "^(/System/Library/|/usr/lib/)") + set(is_system 1) + endif() + endif() + + if(WIN32) + string(TOLOWER "$ENV{SystemRoot}" sysroot) + string(REGEX REPLACE "\\\\" "/" sysroot "${sysroot}") + + string(TOLOWER "$ENV{windir}" windir) + string(REGEX REPLACE "\\\\" "/" windir "${windir}") + + if(lower MATCHES "^(${sysroot}/system|${windir}/system|${sysroot}/syswow|${windir}/syswow|(.*/)*msvc[^/]+dll)") + set(is_system 1) + endif() + endif() + + if(NOT is_system) + get_filename_component(original_path "${original_lower}" PATH) + get_filename_component(path "${lower}" PATH) + if("${original_path}" STREQUAL "${path}") + set(is_local 1) + endif() + endif() + endif() + + # Return type string based on computed booleans: + # + set(type "other") + + if(is_system) + set(type "system") + elseif(is_embedded) + set(type "embedded") + elseif(is_local) + set(type "local") + endif() + + #message(STATUS "gp_resolved_file_type: '${file}' '${resolved_file}'") + #message(STATUS " type: '${type}'") + + if(NOT is_embedded) + if(NOT IS_ABSOLUTE "${resolved_file}") + if(lower MATCHES "^msvc[^/]+dll" AND is_system) + message(STATUS "info: non-absolute msvc file '${file}' returning type '${type}'") + else() + message(STATUS "warning: gp_resolved_file_type non-absolute file '${file}' returning type '${type}' -- possibly incorrect") + endif() + endif() + endif() + + set(${type_var} "${type}" PARENT_SCOPE) + + #message(STATUS "**") +endfunction() + + +# gp_file_type original_file file type_var +# +# Return the type of ${file} with respect to ${original_file}. String +# describing type of prerequisite is returned in variable named ${type_var}. +# +# Possible types are: +# system +# local +# embedded +# other +# +function(gp_file_type original_file file type_var) + if(NOT IS_ABSOLUTE "${original_file}") + message(STATUS "warning: gp_file_type expects absolute full path for first arg original_file") + endif() + + get_filename_component(exepath "${original_file}" PATH) + + set(type "") + gp_resolved_file_type("${original_file}" "${file}" "${exepath}" "" type) + + set(${type_var} "${type}" PARENT_SCOPE) +endfunction(gp_file_type) + + +# get_prerequisites target prerequisites_var exclude_system recurse dirs +# +# Get the list of shared library files required by ${target}. The list in +# the variable named ${prerequisites_var} should be empty on first entry to +# this function. On exit, ${prerequisites_var} will contain the list of +# required shared library files. +# +# target is the full path to an executable file +# +# prerequisites_var is the name of a CMake variable to contain the results +# +# exclude_system is 0 or 1: 0 to include "system" prerequisites , 1 to +# exclude them +# +# recurse is 0 or 1: 0 for direct prerequisites only, 1 for all prerequisites +# recursively +# +# exepath is the path to the top level executable used for @executable_path +# replacment on the Mac +# +# dirs is a list of paths where libraries might be found: these paths are +# searched first when a target without any path info is given. Then standard +# system locations are also searched: PATH, Framework locations, /usr/lib... +# +function(get_prerequisites target prerequisites_var exclude_system recurse exepath dirs) + set(verbose 0) + set(eol_char "E") + + if(NOT IS_ABSOLUTE "${target}") + message("warning: target '${target}' is not absolute...") + endif(NOT IS_ABSOLUTE "${target}") + + if(NOT EXISTS "${target}") + message("warning: target '${target}' does not exist...") + endif(NOT EXISTS "${target}") + + # <setup-gp_tool-vars> + # + # Try to choose the right tool by default. Caller can set gp_tool prior to + # calling this function to force using a different tool. + # + if("${gp_tool}" STREQUAL "") + set(gp_tool "ldd") + if(APPLE) + set(gp_tool "otool") + endif(APPLE) + if(WIN32) + set(gp_tool "dumpbin") + endif(WIN32) + endif("${gp_tool}" STREQUAL "") + + set(gp_tool_known 0) + + if("${gp_tool}" STREQUAL "ldd") + set(gp_cmd_args "") + set(gp_regex "^[\t ]*[^\t ]+ => ([^\t ]+).*${eol_char}$") + set(gp_regex_cmp_count 1) + set(gp_tool_known 1) + endif("${gp_tool}" STREQUAL "ldd") + + if("${gp_tool}" STREQUAL "otool") + set(gp_cmd_args "-L") + set(gp_regex "^\t([^\t]+) \\(compatibility version ([0-9]+.[0-9]+.[0-9]+), current version ([0-9]+.[0-9]+.[0-9]+)\\)${eol_char}$") + set(gp_regex_cmp_count 3) + set(gp_tool_known 1) + endif("${gp_tool}" STREQUAL "otool") + + if("${gp_tool}" STREQUAL "dumpbin") + set(gp_cmd_args "/dependents") + set(gp_regex "^ ([^ ].*[Dd][Ll][Ll])${eol_char}$") + set(gp_regex_cmp_count 1) + set(gp_tool_known 1) + set(ENV{VS_UNICODE_OUTPUT} "") # Block extra output from inside VS IDE. + endif("${gp_tool}" STREQUAL "dumpbin") + + if(NOT gp_tool_known) + message(STATUS "warning: gp_tool='${gp_tool}' is an unknown tool...") + message(STATUS "CMake function get_prerequisites needs more code to handle '${gp_tool}'") + message(STATUS "Valid gp_tool values are dumpbin, ldd and otool.") + return() + endif(NOT gp_tool_known) + + set(gp_cmd_paths ${gp_cmd_paths} + "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin" + "C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin" + "C:/Program Files/Microsoft Visual Studio 8/VC/BIN" + "C:/Program Files (x86)/Microsoft Visual Studio 8/VC/BIN" + "C:/Program Files/Microsoft Visual Studio .NET 2003/VC7/BIN" + "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/VC7/BIN" + "/usr/local/bin" + "/usr/bin" + ) + + find_program(gp_cmd ${gp_tool} PATHS ${gp_cmd_paths}) + + if(NOT gp_cmd) + message(STATUS "warning: could not find '${gp_tool}' - cannot analyze prerequisites...") + return() + endif(NOT gp_cmd) + + if("${gp_tool}" STREQUAL "dumpbin") + # When running dumpbin, it also needs the "Common7/IDE" directory in the + # PATH. It will already be in the PATH if being run from a Visual Studio + # command prompt. Add it to the PATH here in case we are running from a + # different command prompt. + # + get_filename_component(gp_cmd_dir "${gp_cmd}" PATH) + get_filename_component(gp_cmd_dlls_dir "${gp_cmd_dir}/../../Common7/IDE" ABSOLUTE) + if(EXISTS "${gp_cmd_dlls_dir}") + # only add to the path if it is not already in the path + if(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}") + set(ENV{PATH} "$ENV{PATH};${gp_cmd_dlls_dir}") + endif(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}") + endif(EXISTS "${gp_cmd_dlls_dir}") + endif("${gp_tool}" STREQUAL "dumpbin") + # + # </setup-gp_tool-vars> + + if("${gp_tool}" STREQUAL "ldd") + set(old_ld_env "$ENV{LD_LIBRARY_PATH}") + foreach(dir ${exepath} ${dirs}) + set(ENV{LD_LIBRARY_PATH} "${dir}:$ENV{LD_LIBRARY_PATH}") + endforeach(dir) + endif("${gp_tool}" STREQUAL "ldd") + + + # Track new prerequisites at each new level of recursion. Start with an + # empty list at each level: + # + set(unseen_prereqs) + + # Run gp_cmd on the target: + # + execute_process( + COMMAND ${gp_cmd} ${gp_cmd_args} ${target} + OUTPUT_VARIABLE gp_cmd_ov + ) + + if("${gp_tool}" STREQUAL "ldd") + set(ENV{LD_LIBRARY_PATH} "${old_ld_env}") + endif("${gp_tool}" STREQUAL "ldd") + + if(verbose) + message(STATUS "<RawOutput cmd='${gp_cmd} ${gp_cmd_args} ${target}'>") + message(STATUS "gp_cmd_ov='${gp_cmd_ov}'") + message(STATUS "</RawOutput>") + endif(verbose) + + get_filename_component(target_dir "${target}" PATH) + + # Convert to a list of lines: + # + string(REGEX REPLACE ";" "\\\\;" candidates "${gp_cmd_ov}") + string(REGEX REPLACE "\n" "${eol_char};" candidates "${candidates}") + + # Analyze each line for file names that match the regular expression: + # + foreach(candidate ${candidates}) + if("${candidate}" MATCHES "${gp_regex}") + # Extract information from each candidate: + string(REGEX REPLACE "${gp_regex}" "\\1" raw_item "${candidate}") + + if(gp_regex_cmp_count GREATER 1) + string(REGEX REPLACE "${gp_regex}" "\\2" raw_compat_version "${candidate}") + string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" compat_major_version "${raw_compat_version}") + string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" compat_minor_version "${raw_compat_version}") + string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" compat_patch_version "${raw_compat_version}") + endif(gp_regex_cmp_count GREATER 1) + + if(gp_regex_cmp_count GREATER 2) + string(REGEX REPLACE "${gp_regex}" "\\3" raw_current_version "${candidate}") + string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" current_major_version "${raw_current_version}") + string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" current_minor_version "${raw_current_version}") + string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" current_patch_version "${raw_current_version}") + endif(gp_regex_cmp_count GREATER 2) + + # Use the raw_item as the list entries returned by this function. Use the + # gp_resolve_item function to resolve it to an actual full path file if + # necessary. + # + set(item "${raw_item}") + + # Add each item unless it is excluded: + # + set(add_item 1) + + if(${exclude_system}) + set(type "") + gp_resolved_file_type("${target}" "${item}" "${exepath}" "${dirs}" type) + if("${type}" STREQUAL "system") + set(add_item 0) + endif("${type}" STREQUAL "system") + endif(${exclude_system}) + + if(add_item) + list(LENGTH ${prerequisites_var} list_length_before_append) + gp_append_unique(${prerequisites_var} "${item}") + list(LENGTH ${prerequisites_var} list_length_after_append) + + if(${recurse}) + # If item was really added, this is the first time we have seen it. + # Add it to unseen_prereqs so that we can recursively add *its* + # prerequisites... + # + # But first: resolve its name to an absolute full path name such + # that the analysis tools can simply accept it as input. + # + if(NOT list_length_before_append EQUAL list_length_after_append) + gp_resolve_item("${target}" "${item}" "${exepath}" "${dirs}" resolved_item) + set(unseen_prereqs ${unseen_prereqs} "${resolved_item}") + endif(NOT list_length_before_append EQUAL list_length_after_append) + endif(${recurse}) + endif(add_item) + else("${candidate}" MATCHES "${gp_regex}") + if(verbose) + message(STATUS "ignoring non-matching line: '${candidate}'") + endif(verbose) + endif("${candidate}" MATCHES "${gp_regex}") + endforeach(candidate) + + list(LENGTH ${prerequisites_var} prerequisites_var_length) + if(prerequisites_var_length GREATER 0) + list(SORT ${prerequisites_var}) + endif(prerequisites_var_length GREATER 0) + if(${recurse}) + set(more_inputs ${unseen_prereqs}) + foreach(input ${more_inputs}) + get_prerequisites("${input}" ${prerequisites_var} ${exclude_system} ${recurse} "${exepath}" "${dirs}") + endforeach(input) + endif(${recurse}) + + set(${prerequisites_var} ${${prerequisites_var}} PARENT_SCOPE) +endfunction(get_prerequisites) + + +# list_prerequisites target all exclude_system verbose +# +# ARGV0 (target) is the full path to an executable file +# +# optional ARGV1 (all) is 0 or 1: 0 for direct prerequisites only, +# 1 for all prerequisites recursively +# +# optional ARGV2 (exclude_system) is 0 or 1: 0 to include "system" +# prerequisites , 1 to exclude them +# +# optional ARGV3 (verbose) is 0 or 1: 0 to print only full path +# names of prerequisites, 1 to print extra information +# +function(list_prerequisites target) + if("${ARGV1}" STREQUAL "") + set(all 1) + else("${ARGV1}" STREQUAL "") + set(all "${ARGV1}") + endif("${ARGV1}" STREQUAL "") + + if("${ARGV2}" STREQUAL "") + set(exclude_system 0) + else("${ARGV2}" STREQUAL "") + set(exclude_system "${ARGV2}") + endif("${ARGV2}" STREQUAL "") + + if("${ARGV3}" STREQUAL "") + set(verbose 0) + else("${ARGV3}" STREQUAL "") + set(verbose "${ARGV3}") + endif("${ARGV3}" STREQUAL "") + + set(count 0) + set(count_str "") + set(print_count "${verbose}") + set(print_prerequisite_type "${verbose}") + set(print_target "${verbose}") + set(type_str "") + + get_filename_component(exepath "${target}" PATH) + + set(prereqs "") + get_prerequisites("${target}" prereqs ${exclude_system} ${all} "${exepath}" "") + + if(print_target) + message(STATUS "File '${target}' depends on:") + endif(print_target) + + foreach(d ${prereqs}) + math(EXPR count "${count} + 1") + + if(print_count) + set(count_str "${count}. ") + endif(print_count) + + if(print_prerequisite_type) + gp_file_type("${target}" "${d}" type) + set(type_str " (${type})") + endif(print_prerequisite_type) + + message(STATUS "${count_str}${d}${type_str}") + endforeach(d) +endfunction(list_prerequisites) + + +# list_prerequisites_by_glob glob_arg glob_exp +# +# glob_arg is GLOB or GLOB_RECURSE +# +# glob_exp is a globbing expression used with "file(GLOB" to retrieve a list +# of matching files. If a matching file is executable, its prerequisites are +# listed. +# +# Any additional (optional) arguments provided are passed along as the +# optional arguments to the list_prerequisites calls. +# +function(list_prerequisites_by_glob glob_arg glob_exp) + message(STATUS "=============================================================================") + message(STATUS "List prerequisites of executables matching ${glob_arg} '${glob_exp}'") + message(STATUS "") + file(${glob_arg} file_list ${glob_exp}) + foreach(f ${file_list}) + is_file_executable("${f}" is_f_executable) + if(is_f_executable) + message(STATUS "=============================================================================") + list_prerequisites("${f}" ${ARGN}) + message(STATUS "") + endif(is_f_executable) + endforeach(f) +endfunction(list_prerequisites_by_glob) diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake index 355ecb58f09474e8db97e3621a75f748e7735dfc..946fc6b375edc1599712b4bde9f2fda19876b4ec 100644 --- a/indra/cmake/GooglePerfTools.cmake +++ b/indra/cmake/GooglePerfTools.cmake @@ -23,12 +23,11 @@ else (STANDALONE) endif (STANDALONE) if (GOOGLE_PERFTOOLS_FOUND) - set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.") + # XXX Disable temporarily, until we have compilation issues on 64-bit + # Etch sorted. + set(USE_GOOGLE_PERFTOOLS OFF CACHE BOOL "Build with Google PerfTools support.") endif (GOOGLE_PERFTOOLS_FOUND) -# XXX Disable temporarily, until we have compilation issues on 64-bit -# Etch sorted. -set(USE_GOOGLE_PERFTOOLS OFF) if (WINDOWS) # *TODO -reenable this once we get server usage sorted out #set(USE_GOOGLE_PERFTOOLS ON) diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index d8f64199cf63abdcd92219d6b21a6e8e282a1a52..bf4d9b72a9fe8036ea1196b629bdf650a0dec54c 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -107,6 +107,8 @@ INCLUDE(GoogleMock) # Setup target ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES}) + SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR}) + # # Per-codefile additional / external project dep and lib dep property extraction # @@ -142,8 +144,10 @@ INCLUDE(GoogleMock) 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 ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib) + set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib) ENDIF(WINDOWS) LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${TEST_CMD}) @@ -200,6 +204,7 @@ FUNCTION(LL_ADD_INTEGRATION_TEST message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})") endif(TEST_DEBUG) ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files}) + SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR}) # Add link deps to the executable if(TEST_DEBUG) @@ -230,8 +235,10 @@ FUNCTION(LL_ADD_INTEGRATION_TEST 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 ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib) + set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib) ENDIF(WINDOWS) LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${test_command}) @@ -250,4 +257,4 @@ FUNCTION(LL_ADD_INTEGRATION_TEST # Use CTEST? Not sure how to yet... # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD}) -ENDFUNCTION(LL_ADD_INTEGRATION_TEST) \ No newline at end of file +ENDFUNCTION(LL_ADD_INTEGRATION_TEST) diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake index a8c81609bb90cc3d1946ce80e7dcce563800322e..6f602680f49df4eeceff40e5610ccc6b19ed36c8 100644 --- a/indra/cmake/LLSharedLibs.cmake +++ b/indra/cmake/LLSharedLibs.cmake @@ -1,31 +1,74 @@ # ll_deploy_sharedlibs_command # target_exe: the cmake target of the executable for which the shared libs will be deployed. -# search_dirs: a list of dirs to search for the dependencies -# dst_path: path to copy deps to, relative to the output location of the target_exe -macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path) - get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION) - +macro(ll_deploy_sharedlibs_command target_exe) + get_target_property(TARGET_LOCATION ${target_exe} LOCATION) + get_filename_component(OUTPUT_PATH ${TARGET_LOCATION} PATH) + if(DARWIN) + set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources") get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE) if(IS_BUNDLE) - get_filename_component(TARGET_FILE ${OUTPUT_LOCATION} NAME) - set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS) - set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE}) + # 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) endif(IS_BUNDLE) - else(DARWIN) - message(FATAL_ERROR "Only darwin currently supported!") + elseif(WINDOWS) + set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" "$ENV{SystemRoot}/system32") + elseif(LINUX) + set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}") + set(OUTPUT_PATH ${OUTPUT_PATH}/lib) endif(DARWIN) - + add_custom_command( TARGET ${target_exe} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS - "-DBIN_NAME=\"${OUTPUT_LOCATION}\"" - "-DSEARCH_DIRS=\"${search_dirs}\"" - "-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\"" + "-DBIN_NAME=\"${TARGET_LOCATION}\"" + "-DSEARCH_DIRS=\"${SEARCH_DIRS}\"" + "-DDST_PATH=\"${OUTPUT_PATH}\"" "-P" "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake" ) endmacro(ll_deploy_sharedlibs_command) +# ll_stage_sharedlib +# Performs config and adds a copy command for a sharedlib target. +macro(ll_stage_sharedlib DSO_TARGET) + if(SHARED_LIB_STAGING_DIR) + # target gets written to the DLL staging directory. + # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests. + set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR}) + if(NOT WINDOWS) + get_target_property(DSO_PATH ${DSO_TARGET} LOCATION) + get_filename_component(DSO_FILE ${DSO_PATH} NAME) + if(DARWIN) + set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources) + 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 + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${DSO_PATH} + ${SHARED_LIB_STAGING_DIR_CONFIG}/${DSO_FILE} + COMMENT "Copying llcommon to the staging folder." + ) + endif(NOT WINDOWS) + endif(SHARED_LIB_STAGING_DIR) + + if (DARWIN) + set_target_properties(${DSO_TARGET} PROPERTIES + BUILD_WITH_INSTALL_RPATH 1 + INSTALL_NAME_DIR "@executable_path/../Resources" + ) + endif(DARWIN) + +endmacro(ll_stage_sharedlib) \ No newline at end of file diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake index 1f3553539f718b878fead3974b693590ef29f215..bca99caf2a521b0c4284c6cb36c449262f5a1857 100644 --- a/indra/cmake/Linking.cmake +++ b/indra/cmake/Linking.cmake @@ -6,6 +6,7 @@ if (NOT STANDALONE) set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/release) set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/debug) set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs") + set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged executables") elseif (LINUX) if (VIEWER) set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client) @@ -14,12 +15,14 @@ if (NOT STANDALONE) endif (VIEWER) set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS}) set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS}) - set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged .sos") + set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib CACHE FILEPATH "Location of staged .sos") + set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin CACHE FILEPATH "Location of staged executables") elseif (DARWIN) set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release) set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE}) set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE}) set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs") + set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)" CACHE FILEPATH "Location of staged executables") endif (WINDOWS) endif (NOT STANDALONE) diff --git a/indra/develop.py b/indra/develop.py index 7836c97473b1f46236e8c6e480d4f1e4cac1501b..05ad12f20e2b46a883e0633ced2330f435ff8d3e 100755 --- a/indra/develop.py +++ b/indra/develop.py @@ -239,6 +239,7 @@ def arch(self): def run(self, command, name=None): '''Run a program. If the program fails, raise an exception.''' + sys.stdout.flush() ret = os.system(command) if ret: if name is None: @@ -456,7 +457,7 @@ def run_build(self, opts, targets): targets = ' '.join(['-target ' + repr(t) for t in targets]) else: targets = '' - cmd = ('xcodebuild -configuration %s %s %s' % + cmd = ('xcodebuild -configuration %s %s %s | grep -v "^[[:space:]]*setenv" ; exit ${PIPESTATUS[0]}' % (self.build_type, ' '.join(opts), targets)) for d in self.build_dirs(): try: @@ -577,12 +578,16 @@ def get_build_cmd(self): # devenv.com is CLI friendly, devenv.exe... not so much. return ('"%sdevenv.com" %s.sln /build %s' % (self.find_visual_studio(), self.project_name, self.build_type)) + #return ('devenv.com %s.sln /build %s' % + # (self.project_name, self.build_type)) def run(self, command, name=None, retry_on=None, retries=1): '''Run a program. If the program fails, raise an exception.''' while retries: retries = retries - 1 + print "develop.py tries to run:", command ret = os.system(command) + print "got ret", ret, "from", command if ret: if name is None: name = command.split(None, 1)[0] diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 59c84e571b6d6c5470f635cad3c4866e07afe704..8c0521061899a96c59a92e1b257b3ba3e51e6c57 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -120,9 +120,8 @@ def get_channel(srctree): default=""), dict(name='build', description='Build directory.', default=DEFAULT_SRCTREE), dict(name='configuration', - description="""The build configuration used. Only used on OS X for - now, but it could be used for other platforms as well.""", - default="Universal"), + description="""The build configuration used.""", + default="Release"), dict(name='dest', description='Destination directory.', default=DEFAULT_SRCTREE), dict(name='grid', description="""Which grid the client will try to connect to. Even diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index e68672d46f9a4017bf60fdd3ad8ccdff6f528a4e..528a7bb4a5f51f9b11b29739502a6738e9f08b8b 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -273,13 +273,13 @@ void LLCharacter::removeAnimationData(std::string name) //----------------------------------------------------------------------------- // setVisualParamWeight() //----------------------------------------------------------------------------- -BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL set_by_user) +BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL upload_bake) { S32 index = which_param->getID(); visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index); if (index_iter != mVisualParamIndexMap.end()) { - index_iter->second->setWeight(weight, set_by_user); + index_iter->second->setWeight(weight, upload_bake); return TRUE; } return FALSE; @@ -288,7 +288,7 @@ BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, B //----------------------------------------------------------------------------- // setVisualParamWeight() //----------------------------------------------------------------------------- -BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user) +BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake) { std::string tname(param_name); LLStringUtil::toLower(tname); @@ -296,7 +296,7 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL visual_param_name_map_t::iterator name_iter = mVisualParamNameMap.find(tableptr); if (name_iter != mVisualParamNameMap.end()) { - name_iter->second->setWeight(weight, set_by_user); + name_iter->second->setWeight(weight, upload_bake); return TRUE; } llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter: " << param_name << llendl; @@ -306,12 +306,12 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL //----------------------------------------------------------------------------- // setVisualParamWeight() //----------------------------------------------------------------------------- -BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user) +BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake) { visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index); if (index_iter != mVisualParamIndexMap.end()) { - index_iter->second->setWeight(weight, set_by_user); + index_iter->second->setWeight(weight, upload_bake); return TRUE; } llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter index: " << index << llendl; diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index cb44a32e8af07c8dce9ba71946b2c646c8505db1..27e2a51c626d460707c1993665fc96562d216823 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -203,9 +203,9 @@ class LLCharacter void addVisualParam(LLVisualParam *param); void addSharedVisualParam(LLVisualParam *param); - virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE ); - virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE ); - virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE ); + virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE ); + virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE ); + virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE ); // get visual param weight by param or name F32 getVisualParamWeight(LLVisualParam *distortion); diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp index 6232c7588bb38321c19908919965e31e79880193..297322fe58e51f1457651ffe01c129bdd1dbd134 100644 --- a/indra/llcharacter/llvisualparam.cpp +++ b/indra/llcharacter/llvisualparam.cpp @@ -225,7 +225,7 @@ BOOL LLVisualParam::parseData(LLXmlTreeNode *node) //----------------------------------------------------------------------------- // setWeight() //----------------------------------------------------------------------------- -void LLVisualParam::setWeight(F32 weight, BOOL set_by_user) +void LLVisualParam::setWeight(F32 weight, BOOL upload_bake) { if (mIsAnimating) { @@ -243,19 +243,19 @@ void LLVisualParam::setWeight(F32 weight, BOOL set_by_user) if (mNext) { - mNext->setWeight(weight, set_by_user); + mNext->setWeight(weight, upload_bake); } } //----------------------------------------------------------------------------- // setAnimationTarget() //----------------------------------------------------------------------------- -void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user) +void LLVisualParam::setAnimationTarget(F32 target_value, BOOL upload_bake) { // don't animate dummy parameters if (mIsDummy) { - setWeight(target_value, set_by_user); + setWeight(target_value, upload_bake); return; } @@ -274,7 +274,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user) if (mNext) { - mNext->setAnimationTarget(target_value, set_by_user); + mNext->setAnimationTarget(target_value, upload_bake); } } @@ -291,24 +291,24 @@ void LLVisualParam::setNextParam( LLVisualParam *next ) //----------------------------------------------------------------------------- // animate() //----------------------------------------------------------------------------- -void LLVisualParam::animate( F32 delta, BOOL set_by_user ) +void LLVisualParam::animate( F32 delta, BOOL upload_bake ) { if (mIsAnimating) { F32 new_weight = ((mTargetWeight - mCurWeight) * delta) + mCurWeight; - setWeight(new_weight, set_by_user); + setWeight(new_weight, upload_bake); } } //----------------------------------------------------------------------------- // stopAnimating() //----------------------------------------------------------------------------- -void LLVisualParam::stopAnimating(BOOL set_by_user) +void LLVisualParam::stopAnimating(BOOL upload_bake) { if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) { mIsAnimating = FALSE; - setWeight(mTargetWeight, set_by_user); + setWeight(mTargetWeight, upload_bake); } } diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h index eec56d78443d010db7df8b1e2f05b39ecd241a63..12b45e6ebe64e712af6dc45ac301521d3fe395e2 100644 --- a/indra/llcharacter/llvisualparam.h +++ b/indra/llcharacter/llvisualparam.h @@ -113,10 +113,10 @@ class LLVisualParam //virtual BOOL parseData( LLXmlTreeNode *node ) = 0; virtual void apply( ESex avatar_sex ) = 0; // Default functions - virtual void setWeight(F32 weight, BOOL set_by_user); - virtual void setAnimationTarget( F32 target_value, BOOL set_by_user ); - virtual void animate(F32 delta, BOOL set_by_user); - virtual void stopAnimating(BOOL set_by_user); + virtual void setWeight(F32 weight, BOOL upload_bake); + virtual void setAnimationTarget( F32 target_value, BOOL upload_bake ); + virtual void animate(F32 delta, BOOL upload_bake); + virtual void stopAnimating(BOOL upload_bake); virtual BOOL linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params); virtual void resetDrivenParams(); diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index f7856986121958e39e123447888cab3bd6d1c377..416303342a544afc781a7758defdce579823fdd4 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -1,3 +1,4 @@ + # -*- cmake -*- project(llcommon) @@ -6,11 +7,10 @@ include(00-Common) include(LLCommon) include(Linking) include(Boost) -include (Pth) - -if (WINDOWS) - include(CopyWinLibs) -endif (WINDOWS) +include(Pth) +include(LLSharedLibs) +include(GooglePerfTools) +include(Copy3rdPartyLibs) include_directories( ${EXPAT_INCLUDE_DIRS} @@ -42,6 +42,7 @@ set(llcommon_SOURCE_FILES llerror.cpp llerrorthread.cpp llevent.cpp + lleventapi.cpp lleventcoro.cpp lleventdispatcher.cpp lleventfilter.cpp @@ -141,6 +142,7 @@ set(llcommon_HEADER_FILES llerrorlegacy.h llerrorthread.h llevent.h + lleventapi.h lleventcoro.h lleventdispatcher.h lleventfilter.h @@ -243,35 +245,7 @@ list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) if(LLCOMMON_LINK_SHARED) add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) - - if(SHARED_LIB_STAGING_DIR) - # *FIX:Mani --- - # llcommon.dll get written to the DLL staging directory. - # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests. - set_target_properties(llcommon PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR}) - if(NOT WINDOWS) - get_target_property(LLCOMMON_PATH llcommon LOCATION) - get_filename_component(LLCOMMON_FILE ${LLCOMMON_PATH} NAME) - add_custom_command( - TARGET llcommon POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${LLCOMMON_PATH} - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/${LLCOMMON_FILE} - COMMENT "Copying llcommon to the staging folder." - ) - endif(NOT WINDOWS) - endif(SHARED_LIB_STAGING_DIR) - - if (DARWIN) - set_target_properties(llcommon PROPERTIES - BUILD_WITH_INSTALL_RPATH 1 - INSTALL_NAME_DIR "@executable_path/../Resources" - ) - endif(DARWIN) - + ll_stage_sharedlib(llcommon) else(LLCOMMON_LINK_SHARED) add_library (llcommon ${llcommon_SOURCE_FILES}) endif(LLCOMMON_LINK_SHARED) @@ -286,6 +260,7 @@ target_link_libraries( ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} ${PTH_LIBRARIES} + ${GOOGLE_PERFTOOLS_LIBRARIES} ) add_dependencies(llcommon stage_third_party_libs) @@ -305,6 +280,7 @@ LL_ADD_INTEGRATION_TEST(lldate "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lldependencies "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llerror "" "${test_libs}") 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(llrand "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}") diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index ec2290d30e80c77e9b66b56c03cea8ea94a5faf8..c7bbc2e74aa2dec81f7cd8197b0484b879448e30 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -78,11 +78,6 @@ class LL_COMMON_API LLAssetType // Holds a collection of inventory items. // It's treated as an item in the inventory and therefore needs a type. - AT_ROOT_CATEGORY = 9, - // A user's root inventory category. - // We decided to expose it visually, so it seems logical to fold - // it into the asset types. - AT_LSL_TEXT = 10, AT_LSL_BYTECODE = 11, // The LSL is the scripting language. diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h index acd0da61a4bf2d0049577089490eeddeebd16f9b..5af79910068c584d7d6ded09864d165c1a17c0b9 100644 --- a/indra/llcommon/llchat.h +++ b/indra/llcommon/llchat.h @@ -84,6 +84,7 @@ class LLChat mAudible(CHAT_AUDIBLE_FULLY), mMuted(FALSE), mTime(0.0), + mTimeStr(), mPosAgent(), mURL(), mChatStyle(CHAT_STYLE_NORMAL) @@ -97,6 +98,7 @@ class LLChat EChatAudible mAudible; BOOL mMuted; // pass muted chat to maintain list of chatters F64 mTime; // viewer only, seconds from viewer start + std::string mTimeStr; LLVector3 mPosAgent; std::string mURL; EChatStyle mChatStyle; diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h index 80487245757e82585100a19477687562020e4d39..d4ffbf8634541f9351d31cddb3621b2fe1522f5d 100644 --- a/indra/llcommon/llclickaction.h +++ b/indra/llcommon/llclickaction.h @@ -33,7 +33,7 @@ #ifndef LL_LLCLICKACTION_H #define LL_LLCLICKACTION_H - +// DO NOT CHANGE THE SEQUENCE OF THIS LIST!! const U8 CLICK_ACTION_NONE = 0; const U8 CLICK_ACTION_TOUCH = 0; const U8 CLICK_ACTION_SIT = 1; @@ -42,5 +42,6 @@ const U8 CLICK_ACTION_PAY = 3; const U8 CLICK_ACTION_OPEN = 4; const U8 CLICK_ACTION_PLAY = 5; const U8 CLICK_ACTION_OPEN_MEDIA = 6; - +const U8 CLICK_ACTION_ZOOM = 7; +// DO NOT CHANGE THE SEQUENCE OF THIS LIST!! #endif diff --git a/indra/llcommon/lleventapi.cpp b/indra/llcommon/lleventapi.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1dd104da8f631ce4702f2446cc5910d8fd828fbb --- /dev/null +++ b/indra/llcommon/lleventapi.cpp @@ -0,0 +1,30 @@ +/** + * @file lleventapi.cpp + * @author Nat Goodspeed + * @date 2009-11-10 + * @brief Implementation for lleventapi. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "lleventapi.h" +// STL headers +// std headers +// external library headers +// other Linden headers + +LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field): + lbase(name, field), + ibase(name), + mDesc(desc) +{ +} + +LLEventAPI::~LLEventAPI() +{ +} diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h new file mode 100644 index 0000000000000000000000000000000000000000..96d1b03be85e259403e61fc24cf41abce2f5cbb9 --- /dev/null +++ b/indra/llcommon/lleventapi.h @@ -0,0 +1,66 @@ +/** + * @file lleventapi.h + * @author Nat Goodspeed + * @date 2009-10-28 + * @brief LLEventAPI is the base class for every class that wraps a C++ API + * in an event API + * (see https://wiki.lindenlab.com/wiki/Incremental_Viewer_Automation/Event_API). + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLEVENTAPI_H) +#define LL_LLEVENTAPI_H + +#include "lleventdispatcher.h" +#include "llinstancetracker.h" +#include <string> + +/** + * LLEventAPI not only provides operation dispatch functionality, inherited + * from LLDispatchListener -- it also gives us event API introspection. + * Deriving from LLInstanceTracker lets us enumerate instances. + */ +class LL_COMMON_API LLEventAPI: public LLDispatchListener, + public LLInstanceTracker<LLEventAPI, std::string> +{ + typedef LLDispatchListener lbase; + typedef LLInstanceTracker<LLEventAPI, std::string> ibase; + +public: + /** + * @param name LLEventPump name on which this LLEventAPI will listen. This + * also serves as the LLInstanceTracker instance key. + * @param desc Documentation string shown to a client trying to discover + * available event APIs. + * @param field LLSD::Map key used by LLDispatchListener to look up the + * subclass method to invoke [default "op"]. + */ + LLEventAPI(const std::string& name, const std::string& desc, const std::string& field="op"); + virtual ~LLEventAPI(); + + /// Get the string name of this LLEventAPI + std::string getName() const { return ibase::getKey(); } + /// Get the documentation string + std::string getDesc() const { return mDesc; } + + /** + * Publish only selected add() methods from LLEventDispatcher. + * Every LLEventAPI add() @em must have a description string. + */ + template <typename CALLABLE> + void add(const std::string& name, + const std::string& desc, + CALLABLE callable, + const LLSD& required=LLSD()) + { + LLEventDispatcher::add(name, desc, callable, required); + } + +private: + std::string mDesc; +}; + +#endif /* ! defined(LL_LLEVENTAPI_H) */ diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp index 6b1413d05494851ca76373a91ed5f3569e93df1b..5fa6059718ce2c9d2993c177b35c6e04c20f9af6 100644 --- a/indra/llcommon/lleventdispatcher.cpp +++ b/indra/llcommon/lleventdispatcher.cpp @@ -36,9 +36,11 @@ LLEventDispatcher::~LLEventDispatcher() } /// Register a callable by name -void LLEventDispatcher::add(const std::string& name, const Callable& callable, const LLSD& required) +void LLEventDispatcher::add(const std::string& name, const std::string& desc, + const Callable& callable, const LLSD& required) { - mDispatch[name] = DispatchMap::mapped_type(callable, required); + mDispatch.insert(DispatchMap::value_type(name, + DispatchMap::mapped_type(callable, desc, required))); } void LLEventDispatcher::addFail(const std::string& name, const std::string& classname) const @@ -98,14 +100,14 @@ bool LLEventDispatcher::attemptCall(const std::string& name, const LLSD& event) } // Found the name, so it's plausible to even attempt the call. But first, // validate the syntax of the event itself. - std::string mismatch(llsd_matches(found->second.second, event)); + std::string mismatch(llsd_matches(found->second.mRequired, event)); if (! mismatch.empty()) { LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << ") calling '" << name << "': bad request: " << mismatch << LL_ENDL; } // Event syntax looks good, go for it! - (found->second.first)(event); + (found->second.mFunc)(event); return true; // tell caller we were able to call } @@ -116,7 +118,21 @@ LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) cons { return Callable(); } - return found->second.first; + return found->second.mFunc; +} + +LLSD LLEventDispatcher::getMetadata(const std::string& name) const +{ + DispatchMap::const_iterator found = mDispatch.find(name); + if (found == mDispatch.end()) + { + return LLSD(); + } + LLSD meta; + meta["name"] = name; + meta["desc"] = found->second.mDesc; + meta["required"] = found->second.mRequired; + return meta; } LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key): diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h index 5a86b90bff1924a5357b843f3dab622df4262a39..c8c4fe0c3ca38935be3e6ebd8ad44889602f420e 100644 --- a/indra/llcommon/lleventdispatcher.h +++ b/indra/llcommon/lleventdispatcher.h @@ -19,6 +19,7 @@ #include <map> #include <boost/function.hpp> #include <boost/bind.hpp> +#include <boost/iterator/transform_iterator.hpp> #include <typeinfo> #include "llevents.h" @@ -44,7 +45,10 @@ class LL_COMMON_API LLEventDispatcher * is used to validate the structure of each incoming event (see * llsd_matches()). */ - void add(const std::string& name, const Callable& callable, const LLSD& required=LLSD()); + void add(const std::string& name, + const std::string& desc, + const Callable& callable, + const LLSD& required=LLSD()); /** * Special case: a subclass of this class can pass an unbound member @@ -52,18 +56,32 @@ class LL_COMMON_API LLEventDispatcher * <tt>boost::bind()</tt> expression. */ template <class CLASS> - void add(const std::string& name, void (CLASS::*method)(const LLSD&), + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)(const LLSD&), const LLSD& required=LLSD()) { - addMethod<CLASS>(name, method, required); + addMethod<CLASS>(name, desc, method, required); } /// Overload for both const and non-const methods template <class CLASS> - void add(const std::string& name, void (CLASS::*method)(const LLSD&) const, + void add(const std::string& name, + const std::string& desc, + void (CLASS::*method)(const LLSD&) const, const LLSD& required=LLSD()) { - addMethod<CLASS>(name, method, required); + addMethod<CLASS>(name, desc, method, required); + } + + /// Convenience: for LLEventDispatcher, not every callable needs a + /// documentation string. + template <typename CALLABLE> + void add(const std::string& name, + CALLABLE callable, + const LLSD& required=LLSD()) + { + add(name, "", callable, required); } /// Unregister a callable @@ -80,13 +98,51 @@ class LL_COMMON_API LLEventDispatcher /// @a required prototype specified at add() time, die with LL_ERRS. void operator()(const LLSD& event) const; + /// @name Iterate over defined names + //@{ + typedef std::pair<std::string, std::string> NameDesc; + +private: + struct DispatchEntry + { + DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required): + mFunc(func), + mDesc(desc), + mRequired(required) + {} + Callable mFunc; + std::string mDesc; + LLSD mRequired; + }; + typedef std::map<std::string, DispatchEntry> DispatchMap; + +public: + /// We want the flexibility to redefine what data we store per name, + /// therefore our public interface doesn't expose DispatchMap iterators, + /// or DispatchMap itself, or DispatchEntry. Instead we explicitly + /// transform each DispatchMap item to NameDesc on dereferencing. + typedef boost::transform_iterator<NameDesc(*)(const DispatchMap::value_type&), DispatchMap::const_iterator> const_iterator; + const_iterator begin() const + { + return boost::make_transform_iterator(mDispatch.begin(), makeNameDesc); + } + const_iterator end() const + { + return boost::make_transform_iterator(mDispatch.end(), makeNameDesc); + } + //@} + /// Fetch the Callable for the specified name. If no such name was /// registered, return an empty() Callable. Callable get(const std::string& name) const; + /// Get information about a specific Callable + LLSD getMetadata(const std::string& name) const; + private: template <class CLASS, typename METHOD> - void addMethod(const std::string& name, const METHOD& method, const LLSD& required) + void addMethod(const std::string& name, const std::string& desc, + const METHOD& method, const LLSD& required) { CLASS* downcast = dynamic_cast<CLASS*>(this); if (! downcast) @@ -95,7 +151,7 @@ class LL_COMMON_API LLEventDispatcher } else { - add(name, boost::bind(method, downcast, _1), required); + add(name, desc, boost::bind(method, downcast, _1), required); } } void addFail(const std::string& name, const std::string& classname) const; @@ -103,8 +159,12 @@ class LL_COMMON_API LLEventDispatcher bool attemptCall(const std::string& name, const LLSD& event) const; std::string mDesc, mKey; - typedef std::map<std::string, std::pair<Callable, LLSD> > DispatchMap; DispatchMap mDispatch; + + static NameDesc makeNameDesc(const DispatchMap::value_type& item) + { + return NameDesc(item.first, item.second.mDesc); + } }; /** diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h index 192d79b27ddb2658c4fda32c1fdc1d83d8502588..f52cf33fd8df6898651e967f3d4770169c637720 100644 --- a/indra/llcommon/llevents.h +++ b/indra/llcommon/llevents.h @@ -45,10 +45,12 @@ #include "llsingleton.h" #include "lldependencies.h" +/*==========================================================================*| // override this to allow binding free functions with more parameters #ifndef LLEVENTS_LISTENER_ARITY #define LLEVENTS_LISTENER_ARITY 10 #endif +|*==========================================================================*/ // hack for testing #ifndef testable diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp index 9107b11597e8df4427dc1481a3d86b0ae8d9a8ce..079e670b1ab8d0adcc69cdd19a3d7d576e970f77 100644 --- a/indra/llcommon/llfoldertype.cpp +++ b/indra/llcommon/llfoldertype.cpp @@ -72,8 +72,7 @@ LLFolderDictionary::LLFolderDictionary() addEntry(LLFolderType::FT_CLOTHING, new FolderEntry("clothing", TRUE)); addEntry(LLFolderType::FT_OBJECT, new FolderEntry("object", TRUE)); addEntry(LLFolderType::FT_NOTECARD, new FolderEntry("notecard", TRUE)); - addEntry(LLFolderType::FT_CATEGORY, new FolderEntry("category", TRUE)); - addEntry(LLFolderType::FT_ROOT_CATEGORY, new FolderEntry("root", TRUE)); + addEntry(LLFolderType::FT_ROOT_INVENTORY, new FolderEntry("root_inv", TRUE)); addEntry(LLFolderType::FT_LSL_TEXT, new FolderEntry("lsltext", TRUE)); addEntry(LLFolderType::FT_BODYPART, new FolderEntry("bodypart", TRUE)); addEntry(LLFolderType::FT_TRASH, new FolderEntry("trash", TRUE)); diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h index 5374ffd829aae75dbc607b30e2d429d9aa6fc131..7aa77f7f7e43fac7144c045f083ed15772a0737f 100644 --- a/indra/llcommon/llfoldertype.h +++ b/indra/llcommon/llfoldertype.h @@ -52,23 +52,18 @@ class LL_COMMON_API LLFolderType FT_LANDMARK = 3, - // FT_SCRIPT = 4, - FT_CLOTHING = 5, FT_OBJECT = 6, FT_NOTECARD = 7, - FT_CATEGORY = 8, - - FT_ROOT_CATEGORY = 9, + FT_ROOT_INVENTORY = 8, + // We'd really like to change this to 9 since AT_CATEGORY is 8, + // but "My Inventory" has been type 8 for a long time. FT_LSL_TEXT = 10, - // FT_LSL_BYTECODE = 11, - // FT_TEXTURE_TGA = 12, - FT_BODYPART = 13, FT_TRASH = 14, @@ -77,16 +72,10 @@ class LL_COMMON_API LLFolderType FT_LOST_AND_FOUND = 16, - // FT_SOUND_WAV = 17, - // FT_IMAGE_TGA = 18, - // FT_IMAGE_JPEG = 19, - FT_ANIMATION = 20, FT_GESTURE = 21, - // FT_SIMSTATE = 22, - FT_FAVORITE = 23, FT_ENSEMBLE_START = 26, diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index ea50acbbc5e08008c241eb34d188ba9cbc0a1280..11fe5236519f3e35f6bbfc720e06b8c15c6e80d3 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -38,42 +38,73 @@ #include "string_table.h" #include <boost/utility.hpp> - -// This mix-in class adds support for tracking all instances of the specified class parameter T -// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup -// If KEY is not provided, then instances are stored in a simple set -// *NOTE: see explicit specialization below for default KEY==T* case +#include <boost/function.hpp> +#include <boost/bind.hpp> +#include <boost/iterator/transform_iterator.hpp> +#include <boost/iterator/indirect_iterator.hpp> + +/// This mix-in class adds support for tracking all instances of the specified class parameter T +/// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup +/// If KEY is not provided, then instances are stored in a simple set +/// @NOTE: see explicit specialization below for default KEY==T* case template<typename T, typename KEY = T*> class LLInstanceTracker : boost::noncopyable { + typedef typename std::map<KEY, T*> InstanceMap; + typedef boost::function<const KEY&(typename InstanceMap::value_type&)> KeyGetter; + typedef boost::function<T*(typename InstanceMap::value_type&)> InstancePtrGetter; public: - typedef typename std::map<KEY, T*>::iterator instance_iter; - typedef typename std::map<KEY, T*>::const_iterator instance_const_iter; - - static T* getInstance(const KEY& k) { instance_iter found = getMap().find(k); return (found == getMap().end()) ? NULL : found->second; } + /// Dereferencing key_iter gives you a const KEY& + typedef boost::transform_iterator<KeyGetter, typename InstanceMap::iterator> key_iter; + /// Dereferencing instance_iter gives you a T& + typedef boost::indirect_iterator< boost::transform_iterator<InstancePtrGetter, typename InstanceMap::iterator> > instance_iter; + + static T* getInstance(const KEY& k) + { + typename InstanceMap::const_iterator found = getMap_().find(k); + return (found == getMap_().end()) ? NULL : found->second; + } - static instance_iter beginInstances() { return getMap().begin(); } - static instance_iter endInstances() { return getMap().end(); } - static S32 instanceCount() { return getMap().size(); } + static key_iter beginKeys() + { + return boost::make_transform_iterator(getMap_().begin(), + boost::bind(&InstanceMap::value_type::first, _1)); + } + static key_iter endKeys() + { + return boost::make_transform_iterator(getMap_().end(), + boost::bind(&InstanceMap::value_type::first, _1)); + } + static instance_iter beginInstances() + { + return instance_iter(boost::make_transform_iterator(getMap_().begin(), + boost::bind(&InstanceMap::value_type::second, _1))); + } + static instance_iter endInstances() + { + return instance_iter(boost::make_transform_iterator(getMap_().end(), + boost::bind(&InstanceMap::value_type::second, _1))); + } + static S32 instanceCount() { return getMap_().size(); } protected: - LLInstanceTracker(KEY key) { add(key); } - virtual ~LLInstanceTracker() { remove(); } - virtual void setKey(KEY key) { remove(); add(key); } + LLInstanceTracker(KEY key) { add_(key); } + virtual ~LLInstanceTracker() { remove_(); } + virtual void setKey(KEY key) { remove_(); add_(key); } virtual const KEY& getKey() const { return mKey; } private: - void add(KEY key) + void add_(KEY key) { mKey = key; - getMap()[key] = static_cast<T*>(this); + getMap_()[key] = static_cast<T*>(this); } - void remove() { getMap().erase(mKey); } + void remove_() { getMap_().erase(mKey); } - static std::map<KEY, T*>& getMap() + static InstanceMap& getMap_() { if (! sInstances) { - sInstances = new std::map<KEY, T*>; + sInstances = new InstanceMap; } return *sInstances; } @@ -81,41 +112,48 @@ class LLInstanceTracker : boost::noncopyable private: KEY mKey; - static std::map<KEY, T*>* sInstances; + static InstanceMap* sInstances; }; -// explicit specialization for default case where KEY is T* -// use a simple std::set<T*> +/// explicit specialization for default case where KEY is T* +/// use a simple std::set<T*> template<typename T> class LLInstanceTracker<T, T*> { + typedef typename std::set<T*> InstanceSet; public: - typedef typename std::set<T*>::iterator instance_iter; - typedef typename std::set<T*>::const_iterator instance_const_iter; - - static instance_iter beginInstances() { return getSet().begin(); } - static instance_iter endInstances() { return getSet().end(); } - static S32 instanceCount() { return getSet().size(); } + /// Dereferencing key_iter gives you a T* (since T* is the key) + typedef typename InstanceSet::iterator key_iter; + /// Dereferencing instance_iter gives you a T& + typedef boost::indirect_iterator<key_iter> instance_iter; + + /// 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(); } protected: - LLInstanceTracker() { getSet().insert(static_cast<T*>(this)); } - virtual ~LLInstanceTracker() { getSet().erase(static_cast<T*>(this)); } + LLInstanceTracker() { getSet_().insert(static_cast<T*>(this)); } + virtual ~LLInstanceTracker() { getSet_().erase(static_cast<T*>(this)); } - LLInstanceTracker(const LLInstanceTracker& other) { getSet().insert(static_cast<T*>(this)); } + LLInstanceTracker(const LLInstanceTracker& other) { getSet_().insert(static_cast<T*>(this)); } - static std::set<T*>& getSet() // called after getReady() but before go() + static InstanceSet& getSet_() // called after getReady() but before go() { if (! sInstances) { - sInstances = new std::set<T*>; + sInstances = new InstanceSet; } return *sInstances; } - static std::set<T*>* sInstances; + static InstanceSet* sInstances; }; -template <typename T, typename KEY> std::map<KEY, T*>* LLInstanceTracker<T, KEY>::sInstances = NULL; -template <typename T> std::set<T*>* LLInstanceTracker<T, T*>::sInstances = NULL; +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; #endif diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 48244480b1276e271669fbfb406db8d97d03098f..bb3301df9ff3c6516e6eb44167d05dc34851f69c 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -122,6 +122,7 @@ #pragma warning( 3 : 4264 ) // "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden" #pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual" #pragma warning( 3 : 4266 ) // 'function' : no override available for virtual member function from base 'type'; function is hidden +#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored #pragma warning( disable : 4284 ) // silly MS warning deep inside their <map> include file #pragma warning( disable : 4503 ) // 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation. #pragma warning( disable : 4800 ) // 'BOOL' : forcing value to bool 'true' or 'false' (performance warning) diff --git a/indra/llcommon/llprocesslauncher.h b/indra/llcommon/llprocesslauncher.h index 880562157fbcdb6f4f6cd8a8481ec6e4993d71c6..929d547f6edbd43bc54262a976be787dd9ef1294 100644 --- a/indra/llcommon/llprocesslauncher.h +++ b/indra/llcommon/llprocesslauncher.h @@ -70,6 +70,14 @@ class LL_COMMON_API LLProcessLauncher // This needs to be called periodically on Mac/Linux to clean up zombie processes. static void reap(void); + + // Accessors for platform-specific process ID +#if LL_WINDOWS + HANDLE getProcessHandle() { return mProcessHandle; }; +#else + pid_t getProcessID() { return mProcessID; }; +#endif + private: std::string mExecutable; std::string mWorkingDir; diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp index e7ad571a905d793031be93686b6b368a5ba06ec5..eacbbb3ee0bd793b5ee6ae993ad13cc02f194e9c 100644 --- a/indra/llcommon/llqueuedthread.cpp +++ b/indra/llcommon/llqueuedthread.cpp @@ -96,6 +96,7 @@ void LLQueuedThread::shutdown() if (req->getStatus() == STATUS_QUEUED || req->getStatus() == STATUS_INPROGRESS) { ++active_count; + req->setStatus(STATUS_ABORTED); // avoid assert in deleteRequest } req->deleteRequest(); } diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 3652eeba729a282be83c6561fc7edbd9a42aae7a..cba8cf85b02fbfa5e5ec328ab4d91da264cb3099 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -76,6 +76,75 @@ extern int errno; static const S32 CPUINFO_BUFFER_SIZE = 16383; LLCPUInfo gSysCPU; +#if LL_WINDOWS +#ifndef DLLVERSIONINFO +typedef struct _DllVersionInfo +{ + DWORD cbSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformID; +}DLLVERSIONINFO; +#endif + +#ifndef DLLGETVERSIONPROC +typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *); +#endif + +bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number) +{ + bool result = false; + const U32 BUFF_SIZE = 32767; + WCHAR tempBuf[BUFF_SIZE]; + if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE)) + { + + std::basic_string<WCHAR> shell32_path(tempBuf); + + // Shell32.dll contains the DLLGetVersion function. + // according to msdn its not part of the API + // so you have to go in and get it. + // http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx + shell32_path += TEXT("\\shell32.dll"); + + HMODULE hDllInst = LoadLibrary(shell32_path.c_str()); //load the DLL + if(hDllInst) + { // Could successfully load the DLL + DLLGETVERSIONPROC pDllGetVersion; + /* + You must get this function explicitly because earlier versions of the DLL + don't implement this function. That makes the lack of implementation of the + function a version marker in itself. + */ + pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst, + "DllGetVersion"); + + if(pDllGetVersion) + { + // DLL supports version retrieval function + DLLVERSIONINFO dvi; + + ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + HRESULT hr = (*pDllGetVersion)(&dvi); + + if(SUCCEEDED(hr)) + { // Finally, the version is at our hands + major = dvi.dwMajorVersion; + minor = dvi.dwMinorVersion; + build_number = dvi.dwBuildNumber; + result = true; + } + } + + FreeLibrary(hDllInst); // Release DLL + } + } + return result; +} +#endif // LL_WINDOWS + LLOSInfo::LLOSInfo() : mMajorVer(0), mMinorVer(0), mBuild(0) { @@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() : mMinorVer = osvi.dwMinorVersion; mBuild = osvi.dwBuildNumber; + DWORD shell32_major, shell32_minor, shell32_build; + bool got_shell32_version = get_shell32_dll_version(shell32_major, + shell32_minor, + shell32_build); + switch(osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: @@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() : else mOSStringSimple = "Microsoft Windows Server 2003 "; } - else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) + else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1) { + if(osvi.dwMinorVersion == 0) + { + mOSStringSimple = "Microsoft Windows Vista "; + } + else if(osvi.dwMinorVersion == 1) + { + mOSStringSimple = "Microsoft Windows 7 "; + } + + if(osvi.wProductType != VER_NT_WORKSTATION) + { + mOSStringSimple += "Server "; + } + ///get native system info if available.. typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo SYSTEM_INFO si; //System Info object file contains architecture info @@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() : //of windows than this code does (in case it is needed for the future) if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit { - if(osvi.wProductType == VER_NT_WORKSTATION) - mOSStringSimple = "Microsoft Windows Vista 64-bit "; - else - mOSStringSimple = "Microsoft Windows Vista Server 64-bit "; + mOSStringSimple += "64-bit "; } else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL ) { - if(osvi.wProductType == VER_NT_WORKSTATION) - mOSStringSimple = "Microsoft Windows Vista 32-bit "; - else - mOSStringSimple = "Microsoft Windows Vista Server 32-bit "; - } - else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked - { - if(osvi.wProductType == VER_NT_WORKSTATION) - mOSStringSimple = "Microsoft Windows Vista "; - else - mOSStringSimple = "Microsoft Windows Vista Server "; + mOSStringSimple += "32-bit "; } } - else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1) - { - if(osvi.wProductType == VER_NT_WORKSTATION) - mOSStringSimple = "Microsoft Windows 7 "; - else mOSStringSimple = "Microsoft Windows 7 Server "; - } else // Use the registry on early versions of Windows NT. { mOSStringSimple = "Microsoft Windows (unrecognized) "; @@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() : csdversion.c_str(), (osvi.dwBuildNumber & 0xffff)); } + mOSString = mOSStringSimple + tmpstr; } break; @@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() : mOSString = mOSStringSimple; break; } + + std::string compatibility_mode; + if(got_shell32_version) + { + if(osvi.dwMajorVersion != shell32_major + || osvi.dwMinorVersion != shell32_minor) + { + compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)", + shell32_major, + shell32_minor, + shell32_build); + } + } + mOSString += compatibility_mode; + #else struct utsname un; if(uname(&un) != -1) diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 920d8c09777d0b0c148150e01216b5db443b7a41..37370e44e785c8f44f7265673e66b99d2806de08 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -291,8 +291,8 @@ LLMutex::LLMutex(apr_pool_t *poolp) : LLMutex::~LLMutex() { -#if _DEBUG - llassert(!isLocked()); // better not be locked! +#if MUTEX_DEBUG + llassert_always(!isLocked()); // better not be locked! #endif apr_thread_mutex_destroy(mAPRMutexp); mAPRMutexp = NULL; @@ -306,10 +306,24 @@ LLMutex::~LLMutex() void LLMutex::lock() { apr_thread_mutex_lock(mAPRMutexp); +#if MUTEX_DEBUG + // Have to have the lock before we can access the debug info + U32 id = LLThread::currentID(); + if (mIsLocked[id] != FALSE) + llerrs << "Already locked in Thread: " << id << llendl; + mIsLocked[id] = TRUE; +#endif } void LLMutex::unlock() { +#if MUTEX_DEBUG + // Access the debug info while we have the lock + U32 id = LLThread::currentID(); + if (mIsLocked[id] != TRUE) + llerrs << "Not locked in Thread: " << id << llendl; + mIsLocked[id] = FALSE; +#endif apr_thread_mutex_unlock(mAPRMutexp); } diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index 932d96d9406b8e3bdd1ee97eacaf1b78430e6011..d8aa90de2e8a1e876de3719893431968e3ee003c 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -128,6 +128,8 @@ class LL_COMMON_API LLThread //============================================================================ +#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO) + class LL_COMMON_API LLMutex { public: @@ -142,6 +144,9 @@ class LL_COMMON_API LLMutex apr_thread_mutex_t *mAPRMutexp; apr_pool_t *mAPRPoolp; BOOL mIsLocalPool; +#if MUTEX_DEBUG + std::map<U32, BOOL> mIsLocked; +#endif }; // Actually a condition/mutex pair (since each condition needs to be associated with a mutex). diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp index ea5b0c03ef18e8cadf136d85d5cfbd4d2f0d1284..ef3e8dbc946396353fa014978d3898900cba06a5 100644 --- a/indra/llcommon/lltimer.cpp +++ b/indra/llcommon/lltimer.cpp @@ -583,13 +583,13 @@ 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(); - if ( timer->tick() ) + 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 ); + completed_timers.push_back( &timer ); } } } diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7415f2d33b1eb31eb27853c3abe103b781b9103b --- /dev/null +++ b/indra/llcommon/tests/llinstancetracker_test.cpp @@ -0,0 +1,160 @@ +/** + * @file llinstancetracker_test.cpp + * @author Nat Goodspeed + * @date 2009-11-10 + * @brief Test for llinstancetracker. + * + * $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 +#include <string> +#include <vector> +#include <set> +#include <algorithm> // std::sort() +// std headers +// external library headers +#include <boost/scoped_ptr.hpp> +// other Linden headers +#include "../test/lltut.h" + +struct Keyed: public LLInstanceTracker<Keyed, std::string> +{ + Keyed(const std::string& name): + LLInstanceTracker<Keyed, std::string>(name), + mName(name) + {} + std::string mName; +}; + +struct Unkeyed: public LLInstanceTracker<Unkeyed> +{ +}; + +/***************************************************************************** +* TUT +*****************************************************************************/ +namespace tut +{ + struct llinstancetracker_data + { + }; + typedef test_group<llinstancetracker_data> llinstancetracker_group; + typedef llinstancetracker_group::object object; + llinstancetracker_group llinstancetrackergrp("llinstancetracker"); + + template<> template<> + void object::test<1>() + { + ensure_equals(Keyed::instanceCount(), 0); + { + Keyed one("one"); + ensure_equals(Keyed::instanceCount(), 1); + Keyed* found = Keyed::getInstance("one"); + ensure("couldn't find stack Keyed", found); + ensure_equals("found wrong Keyed instance", found, &one); + { + boost::scoped_ptr<Keyed> two(new Keyed("two")); + ensure_equals(Keyed::instanceCount(), 2); + Keyed* found = Keyed::getInstance("two"); + ensure("couldn't find heap Keyed", found); + ensure_equals("found wrong Keyed instance", found, two.get()); + } + ensure_equals(Keyed::instanceCount(), 1); + } + Keyed* found = Keyed::getInstance("one"); + ensure("Keyed key lives too long", ! found); + ensure_equals(Keyed::instanceCount(), 0); + } + + template<> template<> + void object::test<2>() + { + ensure_equals(Unkeyed::instanceCount(), 0); + { + Unkeyed one; + ensure_equals(Unkeyed::instanceCount(), 1); + Unkeyed* found = Unkeyed::getInstance(&one); + ensure_equals(found, &one); + { + boost::scoped_ptr<Unkeyed> two(new Unkeyed); + ensure_equals(Unkeyed::instanceCount(), 2); + Unkeyed* found = Unkeyed::getInstance(two.get()); + ensure_equals(found, two.get()); + } + ensure_equals(Unkeyed::instanceCount(), 1); + } + ensure_equals(Unkeyed::instanceCount(), 0); + } + + template<> template<> + void object::test<3>() + { + Keyed one("one"), two("two"), three("three"); + // We don't want to rely on the underlying container delivering keys + // in any particular order. That allows us the flexibility to + // reimplement LLInstanceTracker using, say, a hash map instead of a + // std::map. We DO insist that every key appear exactly once. + typedef std::vector<std::string> StringVector; + StringVector keys(Keyed::beginKeys(), Keyed::endKeys()); + std::sort(keys.begin(), keys.end()); + StringVector::const_iterator ki(keys.begin()); + ensure_equals(*ki++, "one"); + ensure_equals(*ki++, "three"); + ensure_equals(*ki++, "two"); + // Use ensure() here because ensure_equals would want to display + // mismatched values, and frankly that wouldn't help much. + ensure("didn't reach end", ki == keys.end()); + + // Use a somewhat different approach to order independence with + // beginInstances(): explicitly capture the instances we know in a + // set, and delete them as we iterate through. + typedef std::set<Keyed*> InstanceSet; + InstanceSet instances; + instances.insert(&one); + instances.insert(&two); + instances.insert(&three); + for (Keyed::instance_iter ii(Keyed::beginInstances()), iend(Keyed::endInstances()); + ii != iend; ++ii) + { + Keyed& ref = *ii; + ensure_equals("spurious instance", instances.erase(&ref), 1); + } + ensure_equals("unreported instance", instances.size(), 0); + } + + template<> template<> + void object::test<4>() + { + Unkeyed one, two, three; + typedef std::set<Unkeyed*> KeySet; + KeySet keys; + 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); + } + 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); + } + ensure_equals("unreported instance", instances.size(), 0); + } +} // namespace tut diff --git a/indra/llcommon/tests/lltreeiterators_test.cpp b/indra/llcommon/tests/lltreeiterators_test.cpp index d6d9f681103d31956f1488e880336657be8a6327..31c70b4daa7c8bb61935ca3f80bacd22b2682fbb 100644 --- a/indra/llcommon/tests/lltreeiterators_test.cpp +++ b/indra/llcommon/tests/lltreeiterators_test.cpp @@ -35,9 +35,6 @@ // Precompiled header #include "linden_common.h" -#if LL_WINDOWS -#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored -#endif // STL headers // std headers diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 3de9d14f5424303cda07f3615b8d7ce1f46a6a0c..9faecbea85735d8904300ff99c8ec5f75f9cf403 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -35,7 +35,6 @@ #include <functional> -#include "llassetstorage.h" #include "lldarray.h" #include "llfoldertype.h" #include "llinventorytype.h" @@ -45,7 +44,6 @@ #include "llsaleinfo.h" #include "llsd.h" #include "lluuid.h" -#include "llxmlnode.h" // consts for Key field in the task inventory update message extern const U8 TASK_INVENTORY_ITEM_KEY; @@ -357,7 +355,7 @@ class LLInventoryCategory : public LLInventoryObject typedef std::list<LLPointer<LLInventoryObject> > InventoryObjectList; -// These functions convert between structured data and an inventroy +// 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); diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp index 0e71c0d12d81227e5e2e272eba0e66c2a0ce65b1..4ef5df0b2897fc429ff47d15bddbc6f9b8526a49 100644 --- a/indra/llinventory/llinventorytype.cpp +++ b/indra/llinventory/llinventorytype.cpp @@ -106,7 +106,7 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] = LLInventoryType::IT_OBJECT, // AT_OBJECT LLInventoryType::IT_NOTECARD, // AT_NOTECARD LLInventoryType::IT_CATEGORY, // AT_CATEGORY - LLInventoryType::IT_ROOT_CATEGORY, // AT_ROOT_CATEGORY + LLInventoryType::IT_NONE, // (null entry) LLInventoryType::IT_LSL, // AT_LSL_TEXT LLInventoryType::IT_LSL, // AT_LSL_BYTECODE LLInventoryType::IT_TEXTURE, // AT_TEXTURE_TGA diff --git a/indra/llmath/llinterp.h b/indra/llmath/llinterp.h index 8beeef480b5dabd0fe80dfb6aa986974df0ef6b1..36ca2e98655716df965324273568f0cfd80f3b45 100644 --- a/indra/llmath/llinterp.h +++ b/indra/llmath/llinterp.h @@ -32,6 +32,13 @@ #ifndef LL_LLINTERP_H #define LL_LLINTERP_H +#if defined(LL_WINDOWS) +// macro definitions for common math constants (e.g. M_PI) are declared under the _USE_MATH_DEFINES +// on Windows system. +// So, let's define _USE_MATH_DEFINES before including math.h + #define _USE_MATH_DEFINES +#endif + #include "math.h" // Class from which different types of interpolators can be derived diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp index acbf51d75ca26be890928c262ffd5e39f4f5918d..104629c157d2ba7cbd34f1de4cb27d85853bb005 100644 --- a/indra/llmessage/llares.cpp +++ b/indra/llmessage/llares.cpp @@ -106,7 +106,7 @@ void LLAres::QueryResponder::queryError(int code) LLAres::LLAres() : chan_(NULL), mInitSuccess(false), - mListener(new LLAresListener("LLAres", this)) + mListener(new LLAresListener(this)) { if (ares_init(&chan_) != ARES_SUCCESS) { diff --git a/indra/llmessage/llareslistener.cpp b/indra/llmessage/llareslistener.cpp index a8beb8cbde350d7a414eccd7d8855903b69387bc..7db3675b77420c80c883526b41b42fd3d3a01969 100644 --- a/indra/llmessage/llareslistener.cpp +++ b/indra/llmessage/llareslistener.cpp @@ -22,13 +22,18 @@ #include "llevents.h" #include "llsdutil.h" -LLAresListener::LLAresListener(const std::string& pumpname, LLAres* llares): - LLDispatchListener(pumpname, "op"), +LLAresListener::LLAresListener(LLAres* llares): + LLEventAPI("LLAres", + "LLAres listener to request DNS operations"), mAres(llares) { // add() every method we want to be able to invoke via this event API. - // Optional third parameter validates expected LLSD request structure. - add("rewriteURI", &LLAresListener::rewriteURI, + // Optional last parameter validates expected LLSD request structure. + add("rewriteURI", + "Given [\"uri\"], return on [\"reply\"] an array of alternative URIs.\n" + "On failure, returns an array containing only the original URI, so\n" + "failure case can be processed like success case.", + &LLAresListener::rewriteURI, LLSD().insert("uri", LLSD()).insert("reply", LLSD())); } diff --git a/indra/llmessage/llareslistener.h b/indra/llmessage/llareslistener.h index bf093b3d3d79bfb17dadf5e98cf2ff62c695bb51..33cef79c093f934232509384eeb89650e2a25de7 100644 --- a/indra/llmessage/llareslistener.h +++ b/indra/llmessage/llareslistener.h @@ -14,18 +14,17 @@ #if ! defined(LL_LLARESLISTENER_H) #define LL_LLARESLISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" class LLAres; class LLSD; /// Listen on an LLEventPump with specified name for LLAres request events. -class LLAresListener: public LLDispatchListener +class LLAresListener: public LLEventAPI { public: - /// Specify the pump name on which to listen, and bind the LLAres instance - /// to use (e.g. gAres) - LLAresListener(const std::string& pumpname, LLAres* llares); + /// Bind the LLAres instance to use (e.g. gAres) + LLAresListener(LLAres* llares); private: /// command["op"] == "rewriteURI" diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index a403c44b71f92c9cea4887c796993977bb4b3d6f..3078d80552b19fca1df4074f932c8340f6465aa1 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -189,6 +189,7 @@ typedef std::set<LLUUID> AskQueue; typedef std::list<PendingReply*> ReplyQueue; typedef std::map<LLUUID,U32> PendingQueue; typedef std::map<LLUUID, LLCacheNameEntry*> Cache; +typedef std::map<std::string, LLUUID> ReverseCache; class LLCacheName::Impl { @@ -198,7 +199,9 @@ class LLCacheName::Impl Cache mCache; // the map of UUIDs to names - + ReverseCache mReverseCache; + // map of names to UUIDs + AskQueue mAskNameQueue; AskQueue mAskGroupQueue; // UUIDs to ask our upstream host about @@ -371,7 +374,9 @@ void LLCacheName::importFile(LLFILE* fp) entry->mFirstName = firstname; entry->mLastName = lastname; impl.mCache[id] = entry; - + std::string fullname = entry->mFirstName + " " + entry->mLastName; + impl.mReverseCache[fullname] = id; + count++; } @@ -407,6 +412,8 @@ bool LLCacheName::importFile(std::istream& istr) entry->mFirstName = agent[FIRST].asString(); entry->mLastName = agent[LAST].asString(); impl.mCache[id] = entry; + std::string fullname = entry->mFirstName + " " + entry->mLastName; + impl.mReverseCache[fullname] = id; ++count; } @@ -428,6 +435,7 @@ bool LLCacheName::importFile(std::istream& istr) entry->mCreateTime = ctime; entry->mGroupName = group[NAME].asString(); impl.mCache[id] = entry; + impl.mReverseCache[entry->mGroupName] = id; ++count; } llinfos << "LLCacheName loaded " << count << " group names" << llendl; @@ -548,6 +556,27 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) return FALSE; } } + +BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id) +{ + std::string fullname = first + " " + last; + return getUUID(fullname, id); +} + +BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id) +{ + ReverseCache::iterator iter = impl.mReverseCache.find(fullname); + if (iter != impl.mReverseCache.end()) + { + id = iter->second; + return TRUE; + } + else + { + return FALSE; + } +} + // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer. // The reason it is a slot is so that the legacy get() function below can bind an old callback // and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior @@ -897,10 +926,13 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup) if (!isGroup) { mSignal(id, entry->mFirstName, entry->mLastName, FALSE); + std::string fullname = entry->mFirstName + " " + entry->mLastName; + mReverseCache[fullname] = id; } else { mSignal(id, entry->mGroupName, "", TRUE); + mReverseCache[entry->mGroupName] = id; } } } diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h index 8641437d86216317cdb7ff1fd04924c9a48f0d45..111cc8b650a8367549a19db146b05188fd60aae1 100644 --- a/indra/llmessage/llcachename.h +++ b/indra/llmessage/llcachename.h @@ -86,6 +86,10 @@ class LLCacheName BOOL getName(const LLUUID& id, std::string& first, std::string& last); BOOL getFullName(const LLUUID& id, std::string& fullname); + // Reverse lookup of UUID from name + BOOL getUUID(const std::string& first, const std::string& last, LLUUID& id); + BOOL getUUID(const std::string& fullname, LLUUID& id); + // If available, this method copies the group name into the string // provided. The caller must allocate at least // DB_GROUP_NAME_BUF_SIZE characters. If not available, this diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 457c074ef1e6046b92c69f2a8a50198fdfb7a600..c3d8a5aa23632c487863b59de1da3ef45b64d325 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -61,14 +61,14 @@ LLPluginClassMedia::~LLPluginClassMedia() reset(); } -bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename) +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; mPlugin = new LLPluginProcessParent(this); mPlugin->setSleepTime(mSleepTime); - mPlugin->init(launcher_filename, plugin_filename); + mPlugin->init(launcher_filename, plugin_filename, debug); return true; } @@ -593,10 +593,10 @@ void LLPluginClassMedia::setPriority(EPriority priority) mSleepTime = 1.0f; break; case PRIORITY_LOW: - mSleepTime = 1.0f / 50.0f; + mSleepTime = 1.0f / 25.0f; break; case PRIORITY_NORMAL: - mSleepTime = 1.0f / 100.0f; + mSleepTime = 1.0f / 50.0f; break; case PRIORITY_HIGH: mSleepTime = 1.0f / 100.0f; diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 90ecd1e0735d3792699f7a332ae4264dc8bf2b7d..dcc4a3bd6a257c6e1993f1372b083f7e6c3a0de8 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -47,7 +47,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner 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); + virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false); // undoes everything init() didm called by the media manager when destroying a source virtual void reset(); diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp index 450dcb3c789d989e648650e2f4e1172f88d78dbb..fc95136d9e39b189ec61c035af1cb9122c590903 100644 --- a/indra/llplugin/llpluginprocesschild.cpp +++ b/indra/llplugin/llpluginprocesschild.cpp @@ -37,12 +37,13 @@ #include "llpluginmessageclasses.h" static const F32 HEARTBEAT_SECONDS = 1.0f; +static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f; // Each call to idle will give the plugin this much time. LLPluginProcessChild::LLPluginProcessChild() { mInstance = NULL; mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); - mSleepTime = 1.0f / 100.0f; // default: send idle messages at 100Hz + mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz mCPUElapsed = 0.0f; } @@ -155,7 +156,7 @@ void LLPluginProcessChild::idle(void) { // Provide some time to the plugin LLPluginMessage message("base", "idle"); - message.setValueReal("time", mSleepTime); + message.setValueReal("time", PLUGIN_IDLE_SECONDS); sendMessageToPlugin(message); mInstance->idle(); diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 39f9438fb3de59279cbf173ed2b5ec650cd074e7..b7ce800c3aba27263f479d1f0255cd72147192be 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -55,6 +55,7 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner) mBoundPort = 0; mState = STATE_UNINITIALIZED; mDisableTimeout = false; + mDebug = false; // initialize timer - heartbeat test (mHeartbeat.hasExpired()) // can sometimes return true immediately otherwise and plugins @@ -96,11 +97,12 @@ void LLPluginProcessParent::errorState(void) setState(STATE_ERROR); } -void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename) +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; setState(STATE_INITIALIZED); } @@ -291,6 +293,31 @@ void LLPluginProcessParent::idle(void) } else { + if(mDebug) + { + #if LL_DARWIN + // If we're set to debug, start up a gdb instance in a new terminal window and have it attach to the plugin process and continue. + + // The command we're constructing would look like this on the command line: + // osascript -e 'tell application "Terminal"' -e 'set win to do script "gdb -pid 12345"' -e 'do script "continue" in win' -e 'end tell' + + std::stringstream cmd; + + mDebugger.setExecutable("/usr/bin/osascript"); + mDebugger.addArgument("-e"); + mDebugger.addArgument("tell application \"Terminal\""); + mDebugger.addArgument("-e"); + cmd << "set win to do script \"gdb -pid " << mProcess.getProcessID() << "\""; + mDebugger.addArgument(cmd.str()); + mDebugger.addArgument("-e"); + mDebugger.addArgument("do script \"continue\" in win"); + mDebugger.addArgument("-e"); + mDebugger.addArgument("end tell"); + mDebugger.launch(); + + #endif + } + // This will allow us to time out if the process never starts. mHeartbeat.start(); mHeartbeat.setTimerExpirySec(PLUGIN_LAUNCH_SECONDS); @@ -661,7 +688,7 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit() { bool result = false; - if(!mDisableTimeout) + if(!mDisableTimeout && !mDebug) { if(!mProcess.isRunning()) { diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h index 754ebeb94683efc033c077013f0f06bc48dde25b..1289e86c1365521be3ecea831ab895c9ce1303a9 100644 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -56,7 +56,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner LLPluginProcessParent(LLPluginProcessParentOwner *owner); ~LLPluginProcessParent(); - void init(const std::string &launcher_filename, const std::string &plugin_filename); + void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false); void idle(void); // returns true if the plugin is on its way to steady state @@ -150,6 +150,9 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner F64 mCPUUsage; bool mDisableTimeout; + bool mDebug; + + LLProcessLauncher mDebugger; }; #endif // LL_LLPLUGINPROCESSPARENT_H diff --git a/indra/llprimitive/llmediaentry.cpp b/indra/llprimitive/llmediaentry.cpp index 701300163a3eae1528f2c62052a1d415a199160b..2fc1e5e60ca741c78bf2ddd27967f70b956f0b68 100644 --- a/indra/llprimitive/llmediaentry.cpp +++ b/indra/llprimitive/llmediaentry.cpp @@ -389,8 +389,12 @@ U32 LLMediaEntry::setWhiteList( const std::vector<std::string> &whitelist ) U32 LLMediaEntry::setWhiteList( const LLSD &whitelist ) { - // If whitelist is undef, this is a no-op. - if (whitelist.isUndefined()) return LSL_STATUS_OK; + // If whitelist is undef, the whitelist is cleared + if (whitelist.isUndefined()) + { + mWhiteList.clear(); + return LSL_STATUS_OK; + } // However, if the whitelist is an empty array, erase it. if (whitelist.isArray()) diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp index cd9608d56b74a4b7270a08de1e8fcee0004dfdb3..277e370ca4b4e47cd9e455b336237d2ab4a14b2a 100644 --- a/indra/llprimitive/tests/llmediaentry_test.cpp +++ b/indra/llprimitive/tests/llmediaentry_test.cpp @@ -9,7 +9,14 @@ #include "linden_common.h" #include "lltut.h" -#include "boost/lexical_cast.hpp" +#if LL_WINDOWS +#pragma warning (push) +#pragma warning (disable : 4702) // boost::lexical_cast generates this warning +#endif +#include <boost/lexical_cast.hpp> +#if LL_WINDOWS +#pragma warning (pop) +#endif #include "llstring.h" #include "llsdutil.h" #include "llsdserialize.h" @@ -190,9 +197,9 @@ namespace tut entry.setWhiteList(tokens); } - void whitelist_test(bool enable, const char *whitelist, const char *candidate_url, bool expected_pass) + void whitelist_test(int num, bool enable, const char *whitelist, const char *candidate_url, bool expected_pass) { - std::string message = "Whitelist test"; + std::string message = "Whitelist test " + boost::lexical_cast<std::string>(num); LLMediaEntry entry; entry.setWhiteListEnable(enable); set_whitelist(entry, whitelist); @@ -209,13 +216,13 @@ namespace tut ensure(message, expected_pass == passed_whitelist); } - void whitelist_test(const char *whitelist, const char *candidate_url, bool expected_pass) + void whitelist_test(int num, const char *whitelist, const char *candidate_url, bool expected_pass) { - whitelist_test(true, whitelist, candidate_url, expected_pass); + whitelist_test(num, true, whitelist, candidate_url, expected_pass); } - void whitelist_test(const char *whitelist, const char *candidate_url) + void whitelist_test(int num, const char *whitelist, const char *candidate_url) { - whitelist_test(true, whitelist, candidate_url, true); + whitelist_test(num, true, whitelist, candidate_url, true); } template<> template<> @@ -265,12 +272,30 @@ namespace tut ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, sd); } + + template<> template<> + void object::test<5>() + { + set_test_name("Test LLMediaEntry::asLLSD() -> LLMediaEntry::fromLLSD()"); + LLMediaEntry entry1, entry2; + // Add a whitelist to entry2 + std::vector<std::string> whitelist; + whitelist.push_back("*.example.com"); + entry2.setWhiteList(whitelist); + // Render entry1 (which has no whitelist) as an LLSD + LLSD sd; + entry1.asLLSD(sd); + // "read" that LLSD into entry 2 + entry2.fromLLSD(sd); + ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, entry2.asLLSD()); + } + // limit tests const char *URL_OK = "http://www.example.com"; const char *URL_TOO_BIG = "http://www.example.com.qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"; template<> template<> - void object::test<5>() + void object::test<6>() { set_test_name("Test Limits on setting current URL"); LLMediaEntry entry; @@ -281,7 +306,7 @@ namespace tut } template<> template<> - void object::test<6>() + void object::test<7>() { set_test_name("Test Limits on setting home URL"); LLMediaEntry entry; @@ -292,7 +317,7 @@ namespace tut } template<> template<> - void object::test<7>() + void object::test<8>() { set_test_name("Test Limits on setting whitelist"); @@ -306,7 +331,7 @@ namespace tut } template<> template<> - void object::test<8>() + void object::test<9>() { set_test_name("Test Limits on setting whitelist too big"); @@ -321,7 +346,7 @@ namespace tut } template<> template<> - void object::test<9>() + void object::test<10>() { set_test_name("Test Limits on setting whitelist too many"); @@ -337,7 +362,7 @@ namespace tut } template<> template<> - void object::test<10>() + void object::test<11>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -355,7 +380,7 @@ namespace tut } template<> template<> - void object::test<11>() + void object::test<12>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -376,7 +401,7 @@ namespace tut } template<> template<> - void object::test<12>() + void object::test<13>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -396,103 +421,70 @@ namespace tut empty == entry2.getWhiteList()); } - // Whitelist check tests - - // Check the "empty whitelist" case template<> template<> - void object::test<13>() { whitelist_test("", "http://www.example.com", true); } + void object::test<14>() + { + // Whitelist check tests + int n=0; + + // Check the "empty whitelist" case + whitelist_test(++n, "", "http://www.example.com", true); - // Check the "missing scheme" case - template<> template<> - void object::test<14>() { whitelist_test("www.example.com", "http://www.example.com", true); } + // Check the "missing scheme" case + whitelist_test(++n, "www.example.com", "http://www.example.com", true); - // Check the "exactly the same" case - template<> template<> - void object::test<15>() { whitelist_test("http://example.com", "http://example.com", true); } + // Check the "exactly the same" case + whitelist_test(++n, "http://example.com", "http://example.com", true); - // Check the enable flag - template<> template<> - void object::test<16>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); } - template<> template<> - void object::test<17>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); } + // Check the enable flag + whitelist_test(++n, false, "www.example.com", "http://www.secondlife.com", true); + whitelist_test(++n, true, "www.example.com", "http://www.secondlife.com", false); - // Check permutations of trailing slash: - template<> template<> - void object::test<18>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); } - template<> template<> - void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); } - template<> template<> - void object::test<20>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); } - template<> template<> - void object::test<21>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); } - template<> template<> - void object::test<22>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); } + // Check permutations of trailing slash: + whitelist_test(++n, "http://www.example.com", "http://www.example.com/", true); + whitelist_test(++n, "http://www.example.com/", "http://www.example.com/", true); + whitelist_test(++n, "http://www.example.com/", "http://www.example.com", false); + whitelist_test(++n, "http://www.example.com", "http://www.example.com/foobar", true); + whitelist_test(++n, "http://www.example.com/", "http://www.example.com/foobar", false); - // More cases... - template<> template<> - void object::test<23>() { whitelist_test("http://example.com", "http://example.com/wiki", true); } - template<> template<> - void object::test<24>() { whitelist_test("www.example.com", "http://www.example.com/help", true); } - template<> template<> - void object::test<25>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); } - template<> template<> - void object::test<26>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); } - template<> template<> - void object::test<27>() { whitelist_test("example.com", "http://wwwexample.com", false); } - template<> template<> - void object::test<28>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); } - template<> template<> - void object::test<29>() { whitelist_test("www.example.com", "http://www.amazon.com", false); } - - // regexp cases - template<> template<> - void object::test<30>() { whitelist_test("*.example.com", "http://www.example.com", true); } - template<> template<> - void object::test<31>() { whitelist_test("*.example.com", "http://www.amazon.com", false); } - template<> template<> - void object::test<32>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); } - template<> template<> - void object::test<33>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); } - template<> template<> - void object::test<34>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); } - template<> template<> - void object::test<35>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); } - template<> template<> - void object::test<36>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); } - template<> template<> - void object::test<37>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); } - template<> template<> - void object::test<38>() { whitelist_test("http://*example.com", "http://www.example.com", true); } - template<> template<> - void object::test<39>() { whitelist_test("http://*.example.com", "http://www.example.com", true); } - template<> template<> - void object::test<40>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); } - template<> template<> - void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); } - template<> template<> - void object::test<42>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); } - template<> template<> - void object::test<43>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); } - template<> template<> - void object::test<44>() { whitelist_test("http://*.example.com", "https://www.example.com", false); } - template<> template<> - void object::test<45>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); } - template<> template<> - void object::test<46>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); } - template<> template<> - void object::test<47>() { whitelist_test("example.com", "http://www.example.com", false); } - template<> template<> - void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com:80", false); } - template<> template<> - void object::test<49>() { whitelist_test("www.example.com", "http://www.example.com", true); } - template<> template<> - void object::test<50>() { whitelist_test("www.example.com/", "http://www.example.com", false); } - template<> template<> - void object::test<51>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); } - // Path only - template<> template<> - void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); } - template<> template<> - void object::test<53>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); } + // More cases... + whitelist_test(++n, "http://example.com", "http://example.com/wiki", true); + whitelist_test(++n, "www.example.com", "http://www.example.com/help", true); + whitelist_test(++n, "http://www.example.com", "http://wwwexample.com", false); + whitelist_test(++n, "http://www.example.com", "http://www.example.com/wiki", true); + whitelist_test(++n, "example.com", "http://wwwexample.com", false); + whitelist_test(++n, "http://www.example.com/", "http://www.amazon.com/wiki", false); + whitelist_test(++n, "www.example.com", "http://www.amazon.com", false); + + // regexp cases + whitelist_test(++n, "*.example.com", "http://www.example.com", true); + whitelist_test(++n, "*.example.com", "http://www.amazon.com", false); + whitelist_test(++n, "*.example.com", "http://www.example.com/foo/bar", true); + whitelist_test(++n, "*.example.com", "http:/example.com/foo/bar", false); + whitelist_test(++n, "*example.com", "http://example.com/foo/bar", true); + whitelist_test(++n, "*example.com", "http://my.virus.com/foo/bar?example.com", false); + whitelist_test(++n, "example.com", "http://my.virus.com/foo/bar?example.com", false); + whitelist_test(++n, "*example.com", "http://my.virus.com/foo/bar?*example.com", false); + whitelist_test(++n, "http://*example.com", "http://www.example.com", true); + whitelist_test(++n, "http://*.example.com", "http://www.example.com", true); + whitelist_test(++n, "http://*.e$?^.com", "http://www.e$?^.com", true); + whitelist_test(++n, "*.example.com/foo/bar", "http://www.example.com/", false); + whitelist_test(++n, "*.example.com/foo/bar", "http://example.com/foo/bar", false); + whitelist_test(++n, "http://*.example.com/foo/bar", "http://www.example.com", false); + whitelist_test(++n, "http://*.example.com", "https://www.example.com", false); + whitelist_test(++n, "http*://*.example.com", "rtsp://www.example.com", false); + whitelist_test(++n, "http*://*.example.com", "https://www.example.com", true); + whitelist_test(++n, "example.com", "http://www.example.com", false); + whitelist_test(++n, "www.example.com", "http://www.example.com:80", false); + whitelist_test(++n, "www.example.com", "http://www.example.com", true); + whitelist_test(++n, "www.example.com/", "http://www.example.com", false); + whitelist_test(++n, "www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); + + // Path only + whitelist_test(++n, "/foo/*/baz", "http://www.example.com/foo/bar/baz", true); + whitelist_test(++n, "/foo/*/baz", "http://www.example.com/foo/bar/", false); + } + } + diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 793a526c2602f9c710f99d8e153600baa6d8edae..9ba0cfc6b8a2ad60306d74e13f7e505ab53a455d 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -754,6 +754,13 @@ std::string LLFontGL::nameFromFont(const LLFontGL* fontp) return fontp->mFontDescriptor.getName(); } + +// static +std::string LLFontGL::sizeFromFont(const LLFontGL* fontp) +{ + return fontp->mFontDescriptor.getSize(); +} + // static std::string LLFontGL::nameFromHAlign(LLFontGL::HAlign align) { diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 5f2c86c6c129ffa887aeaf695822f4c75c6cdec7..bb7d8524e7fd053c3af0c06268c600f9d802a1f2 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -146,6 +146,7 @@ class LLFontGL static U8 getStyleFromString(const std::string &style); static std::string nameFromFont(const LLFontGL* fontp); + static std::string sizeFromFont(const LLFontGL* fontp); static std::string nameFromHAlign(LLFontGL::HAlign align); static LLFontGL::HAlign hAlignFromName(const std::string& name); diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index bbaf908d2e50c13cdc5fcf50a913d6cd775ae45c..8930e320558c315c5d65406af2f867f2f0875130 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -146,8 +146,12 @@ LLButton::LLButton(const LLButton::Params& p) mHoverGlowStrength(p.hover_glow_amount), mCommitOnReturn(p.commit_on_return), mFadeWhenDisabled(FALSE), - mForcePressedState(FALSE), - mLastDrawCharsCount(0) + mForcePressedState(false), + mLastDrawCharsCount(0), + mMouseDownSignal(NULL), + mMouseUpSignal(NULL), + mHeldDownSignal(NULL) + { static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0); static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>()); @@ -215,13 +219,28 @@ LLButton::LLButton(const LLButton::Params& p) } if (p.click_callback.isProvided()) - initCommitCallback(p.click_callback, mCommitSignal); // alias -> commit_callback + { + setCommitCallback(initCommitCallback(p.click_callback)); // alias -> commit_callback + } if (p.mouse_down_callback.isProvided()) - initCommitCallback(p.mouse_down_callback, mMouseDownSignal); + { + setMouseDownCallback(initCommitCallback(p.mouse_down_callback)); + } if (p.mouse_up_callback.isProvided()) - initCommitCallback(p.mouse_up_callback, mMouseUpSignal); + { + setMouseUpCallback(initCommitCallback(p.mouse_up_callback)); + } if (p.mouse_held_callback.isProvided()) - initCommitCallback(p.mouse_held_callback, mHeldDownSignal); + { + setHeldDownCallback(initCommitCallback(p.mouse_held_callback)); + } +} + +LLButton::~LLButton() +{ + delete mMouseDownSignal; + delete mMouseUpSignal; + delete mHeldDownSignal; } // HACK: Committing a button is the same as instantly clicking it. @@ -232,9 +251,9 @@ void LLButton::onCommit() // panel containing it. Therefore we need to call LLUICtrl::onCommit() // LAST, otherwise this becomes deleted memory. - mMouseDownSignal(this, LLSD()); + if (mMouseDownSignal) (*mMouseDownSignal)(this, LLSD()); - mMouseUpSignal(this, LLSD()); + if (mMouseUpSignal) (*mMouseUpSignal)(this, LLSD()); if (getSoundFlags() & MOUSE_DOWN) { @@ -257,19 +276,23 @@ void LLButton::onCommit() boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb ) { - return mCommitSignal.connect(cb); + if (!mCommitSignal) mCommitSignal = new commit_signal_t(); + return mCommitSignal->connect(cb); } boost::signals2::connection LLButton::setMouseDownCallback( const commit_signal_t::slot_type& cb ) { - return mMouseDownSignal.connect(cb); + if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t(); + return mMouseDownSignal->connect(cb); } boost::signals2::connection LLButton::setMouseUpCallback( const commit_signal_t::slot_type& cb ) { - return mMouseUpSignal.connect(cb); + if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t(); + return mMouseUpSignal->connect(cb); } boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t::slot_type& cb ) { - return mHeldDownSignal.connect(cb); + if (!mHeldDownSignal) mHeldDownSignal = new commit_signal_t(); + return mHeldDownSignal->connect(cb); } @@ -351,7 +374,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) */ LLUICtrl::handleMouseDown(x, y, mask); - mMouseDownSignal(this, LLSD()); + if(mMouseDownSignal) (*mMouseDownSignal)(this, LLSD()); mMouseDownTimer.start(); mMouseDownFrame = (S32) LLFrameTimer::getFrameCount(); @@ -383,7 +406,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) LLUICtrl::handleMouseUp(x, y, mask); // Regardless of where mouseup occurs, handle callback - mMouseUpSignal(this, LLSD()); + if(mMouseUpSignal) (*mMouseUpSignal)(this, LLSD()); resetMouseDownTimer(); @@ -493,7 +516,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask) { LLSD param; param["count"] = mMouseHeldDownCount++; - mHeldDownSignal(this, param); + if (mHeldDownSignal) (*mHeldDownSignal)(this, param); } } diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 08f289092f2d75b1bc2487034e30243f5826be6f..8c3b4bd859ea3bf7e008136b6c0eef39414df067 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -128,6 +128,8 @@ class LLButton LLButton(const Params&); public: + + ~LLButton(); // For backward compatability only typedef boost::function<void(void*)> button_callback_t; @@ -238,7 +240,7 @@ class LLButton static void setDockableFloaterToggle(LLUICtrl* ctrl, const LLSD& sdname); static void showHelp(LLUICtrl* ctrl, const LLSD& sdname); - void setForcePressedState(BOOL b) { mForcePressedState = b; } + void setForcePressedState(bool b) { mForcePressedState = b; } protected: LLPointer<LLUIImage> getImageUnselected() const { return mImageUnselected; } @@ -251,9 +253,9 @@ class LLButton void resetMouseDownTimer(); private: - commit_signal_t mMouseDownSignal; - commit_signal_t mMouseUpSignal; - commit_signal_t mHeldDownSignal; + commit_signal_t* mMouseDownSignal; + commit_signal_t* mMouseUpSignal; + commit_signal_t* mHeldDownSignal; const LLFontGL* mGLFont; @@ -315,7 +317,7 @@ class LLButton BOOL mNeedsHighlight; BOOL mCommitOnReturn; BOOL mFadeWhenDisabled; - BOOL mForcePressedState; + bool mForcePressedState; LLFrameTimer mFlashingTimer; }; diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h index 2f8e8fdd234b29f3ef163827ed40f13b9c050785..b14e66b91500dcbf698c98f226e29b8a358e4452 100644 --- a/indra/llui/llcheckboxctrl.h +++ b/indra/llui/llcheckboxctrl.h @@ -107,6 +107,7 @@ class LLCheckBoxCtrl std::string getLabel() const; void setFont( const LLFontGL* font ) { mFont = font; } + const LLFontGL* getFont() { return mFont; } virtual void setControlName(const std::string& control_name, LLView* context); diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 36e309d639e3140113bdacfafc23d86785a9d71b..f29e8785eb0dee36189fa18d818932c17283b126 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -102,14 +102,14 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p) mMaxChars(p.max_chars), mPrearrangeCallback(p.prearrange_callback()), mTextEntryCallback(p.text_entry_callback()), - mSelectionCallback(p.selection_callback()), mListPosition(p.list_position), mLastSelectedIndex(-1) { // Text label button LLButton::Params button_params = (mAllowTextEntry ? p.combo_button : p.drop_down_button); - button_params.mouse_down_callback.function(boost::bind(&LLComboBox::onButtonDown, this)); + button_params.mouse_down_callback.function( + boost::bind(&LLComboBox::onButtonMouseDown, this)); button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT); button_params.rect(p.rect); @@ -140,6 +140,10 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p) mList = LLUICtrlFactory::create<LLScrollListCtrl>(params); addChild(mList); + // Mouse-down on button will transfer mouse focus to the list + // Grab the mouse-up event and make sure the button state is correct + mList->setMouseUpCallback(boost::bind(&LLComboBox::onListMouseUp, this)); + for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin(); it != p.items().end(); ++it) @@ -644,7 +648,7 @@ void LLComboBox::hideList() } } -void LLComboBox::onButtonDown() +void LLComboBox::onButtonMouseDown() { if (!mList->getVisible()) { @@ -670,6 +674,10 @@ void LLComboBox::onButtonDown() if (mButton->hasMouseCapture()) { gFocusMgr.setMouseCapture(mList); + + // But keep the "pressed" look, which buttons normally lose when they + // lose focus + mButton->setForcePressedState(true); } } else @@ -679,6 +687,12 @@ void LLComboBox::onButtonDown() } +void LLComboBox::onListMouseUp() +{ + // In some cases this is the termination of a mouse click that started on + // the button, so clear its pressed state + mButton->setForcePressedState(false); +} //------------------------------------------------------------------ // static functions @@ -706,12 +720,6 @@ void LLComboBox::onItemSelected(const LLSD& data) // commit does the reverse, asserting the value in the list onCommit(); - - // call the callback if it exists - if(mSelectionCallback) - { - mSelectionCallback(this, data); - } } BOOL LLComboBox::handleToolTip(S32 x, S32 y, MASK mask) diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index 6285ca5170b3539e913d150fb6f5d4af8699bacf..4f2758846716e8885fb9e1a31cb54b2c3a7f540f 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -82,8 +82,7 @@ class LLComboBox allow_new_values; Optional<S32> max_chars; Optional<commit_callback_t> prearrange_callback, - text_entry_callback, - selection_callback; + text_entry_callback; Optional<EPreferredPosition, PreferredPositionValues> list_position; @@ -200,11 +199,11 @@ class LLComboBox void setPrearrangeCallback( commit_callback_t cb ) { mPrearrangeCallback = cb; } void setTextEntryCallback( commit_callback_t cb ) { mTextEntryCallback = cb; } - void setSelectionCallback( commit_callback_t cb ) { mSelectionCallback = cb; } void setButtonVisible(BOOL visible); - void onButtonDown(); + void onButtonMouseDown(); + void onListMouseUp(); void onItemSelected(const LLSD& data); void onTextCommit(const LLSD& data); diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 48c76cf105ca61d2d57fbad25589e38a9301858b..fa0abd55d027efe080de8eb9ae26e717346c92af 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -392,9 +392,4 @@ void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color) Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont, (F32)getRect().getWidth() ); mParagraphs.push_back ( paragraph ); - -#if LL_WINDOWS && LL_LCD_COMPILE - // add to LCD screen - AddNewDebugConsoleToLCD(wline); -#endif } diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index f56cb2eee7248cbd1ac660645d0d52e1d3fff6a3..9c69e4f2b66fb75b0f849a27d162ddaf85724ec9 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -127,26 +127,19 @@ void LLDockableFloater::setVisible(BOOL visible) mDockControl.get()->repositionDockable(); } + if (visible) + { + LLFloater::setFrontmost(TRUE); + } LLFloater::setVisible(visible); } void LLDockableFloater::setMinimized(BOOL minimize) { - if(minimize && isDocked()) + if(minimize) { setVisible(FALSE); } - - if (minimize) - { - setCanDock(false); - } - else if (!minimize && mDockControl.get() != NULL && mDockControl.get()->isDockVisible()) - { - setCanDock(true); - } - - LLFloater::setMinimized(minimize); } LLView * LLDockableFloater::getDockWidget() diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index 35a854267a4d194e7c9e8eb4bf8a68f5d8d69481..456a2925a3e70314b747ce30be19beedc3a054b5 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -256,7 +256,6 @@ void LLDockControl::on() { if (isDockVisible()) { - mDockableFloater->setCanDrag(false); mEnabled = true; mRecalculateDocablePosition = true; } @@ -264,10 +263,14 @@ void LLDockControl::on() void LLDockControl::off() { - mDockableFloater->setCanDrag(true); mEnabled = false; } +void LLDockControl::forceRecalculatePosition() +{ + mRecalculateDocablePosition = true; +} + void LLDockControl::drawToungue() { if (mEnabled) diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h index eaedb4c30766c05e2246e582cb30ae596961360f..30a45bedc74e43f3225fe9dfb404e6440fadc8a0 100644 --- a/indra/llui/lldockcontrol.h +++ b/indra/llui/lldockcontrol.h @@ -63,6 +63,7 @@ class LLDockControl public: void on(); void off(); + void forceRecalculatePosition(); void setDock(LLView* dockWidget); LLView* getDock() { diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 19f203b80c91aefc0ca1a1b6a37144204cfba76d..8de3a8a96f6089dd3a5367ba201aad061efbb4c0 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -94,6 +94,9 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null* item->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4)); item->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4)); + // Children don't accept the focus + item->setTabStop(false); + rearrangeItems(); notifyParentItemsRectChanged(); return true; @@ -282,6 +285,9 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/) { onCommit(); } + + // Stretch selected items rect to ensure it won't be clipped + mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); } void LLFlatListView::setNoItemsCommentText(const std::string& comment_text) @@ -381,8 +387,34 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p) //we don't need to stretch in vertical direction on reshaping by a parent //no bottom following! mItemsPanel->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP); + + LLViewBorder::Params params; + params.name("scroll border"); + params.rect(getSelectedItemsRect()); + params.visible(false); + params.bevel_style(LLViewBorder::BEVEL_IN); + mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params); + mItemsPanel->addChild( mSelectedItemsBorder ); }; +// virtual +void LLFlatListView::draw() +{ + // Highlight border if a child of this container has keyboard focus + if( mSelectedItemsBorder->getVisible() ) + { + mSelectedItemsBorder->setKeyboardFocusHighlight( hasFocus() ); + } + LLScrollContainer::draw(); +} + +// virtual +BOOL LLFlatListView::postBuild() +{ + setTabStop(true); + return LLScrollContainer::postBuild(); +} + void LLFlatListView::rearrangeItems() { static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); @@ -444,6 +476,9 @@ void LLFlatListView::rearrangeItems() // move top for next item in list item_new_top -= (rc.getHeight() + mItemPad); } + + // Stretch selected items rect to ensure it won't be clipped + mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); } void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask) @@ -473,6 +508,64 @@ void LLFlatListView::onItemRightMouseClick(item_pair_t* item_pair, MASK mask) onItemMouseClick(item_pair, mask); } +BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask) +{ + BOOL reset_selection = (mask != MASK_SHIFT); + BOOL handled = FALSE; + switch (key) + { + case KEY_RETURN: + { + if (mSelectedItemPairs.size() && mask == MASK_NONE) + { + mOnReturnSignal(this, getValue()); + handled = TRUE; + } + break; + } + case KEY_UP: + { + if ( !selectNextItemPair(true, reset_selection) && reset_selection) + { + // If case we are in accordion tab notify parent to go to the previous accordion + notifyParent(LLSD().insert("action","select_prev")); + } + break; + } + case KEY_DOWN: + { + if ( !selectNextItemPair(false, reset_selection) && reset_selection) + { + // If case we are in accordion tab notify parent to go to the next accordion + notifyParent(LLSD().insert("action","select_next")); + } + break; + } + case 'A': + { + if(MASK_CONTROL & mask) + { + selectAll(); + handled = TRUE; + } + break; + } + default: + break; + } + + if ( key == KEY_UP || key == KEY_DOWN ) + { + LLRect selcted_rect = getLastSelectedItemRect().stretch(1); + LLRect visible_rect = getVisibleContentRect(); + if ( !visible_rect.contains (selcted_rect) ) + scrollToShowRect(selcted_rect); + handled = TRUE; + } + + return handled ? handled : LLScrollContainer::handleKeyHere(key, mask); +} + LLFlatListView::item_pair_t* LLFlatListView::getItemPair(LLPanel* item) const { llassert(item); @@ -552,6 +645,143 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select) onCommit(); } + setFocus(TRUE); + + // Stretch selected items rect to ensure it won't be clipped + mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); + + return true; +} + +LLRect LLFlatListView::getLastSelectedItemRect() +{ + if (!mSelectedItemPairs.size()) + { + return LLRect::null; + } + + return mSelectedItemPairs.back()->first->getRect(); +} + +LLRect LLFlatListView::getSelectedItemsRect() +{ + if (!mSelectedItemPairs.size()) + { + return LLRect::null; + } + LLRect rc = getLastSelectedItemRect(); + for ( pairs_const_iterator_t + it = mSelectedItemPairs.begin(), + it_end = mSelectedItemPairs.end(); + it != it_end; ++it ) + { + rc.unionWith((*it)->first->getRect()); + } + return rc; +} + +// virtual +bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection) +{ + // No items - no actions! + if ( !mItemPairs.size() ) + return false; + + item_pair_t* cur_sel_pair = NULL; + item_pair_t* to_sel_pair = NULL; + + if ( mSelectedItemPairs.size() ) + { + // Take the last selected pair + cur_sel_pair = mSelectedItemPairs.back(); + } + 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; + } + + // Bases on given direction choose next item to select + if ( is_up_direction ) + { + // Find current selected item position in mItemPairs list + pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair); + + for (;++sel_it != mItemPairs.rend();) + { + // skip invisible items + if ( (*sel_it)->first->getVisible() ) + { + to_sel_pair = *sel_it; + break; + } + } + } + else + { + // Find current selected item position in mItemPairs list + pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair); + + for (;++sel_it != mItemPairs.end();) + { + // skip invisible items + if ( (*sel_it)->first->getVisible() ) + { + to_sel_pair = *sel_it; + break; + } + } + } + + 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); + + return true; + } + return false; +} + +bool LLFlatListView::selectAll() +{ + if (!mAllowSelection) + return false; + + mSelectedItemPairs.clear(); + + for (pairs_const_iterator_t it= mItemPairs.begin(); it != mItemPairs.end(); ++it) + { + item_pair_t* item_pair = *it; + mSelectedItemPairs.push_back(item_pair); + //a way of notifying panel of selection state changes + LLPanel* item = item_pair->first; + item->setValue(SELECTED_EVENT); + } + + if (mCommitOnSelectionChange) + { + onCommit(); + } + + // Stretch selected items rect to ensure it won't be clipped + mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); + return true; } @@ -670,4 +900,15 @@ void LLFlatListView::getValues(std::vector<LLSD>& values) const } } +// virtual +void LLFlatListView::onFocusReceived() +{ + mSelectedItemsBorder->setVisible(TRUE); +} +// virtual +void LLFlatListView::onFocusLost() +{ + mSelectedItemsBorder->setVisible(FALSE); +} + //EOF diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 97772bc677b454962f4feba0977aacf28083ed04..3867e910c0b2d3099373e4309ebaa57a45096d19 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -50,7 +50,7 @@ class LLTextBox; * is ignored. The option "keep_one_selected" forces at least one item to be selected at any time (only for mouse events on items) * since any item of the list was selected. * - * Examples of using this control are presented in Picks panel (Me Profile and Profile View), where this control is used to + * Examples of using this control are presented in Picks panel (My Profile and Profile View), where this control is used to * manage the list of pick items. * * ASSUMPTIONS AND STUFF @@ -113,6 +113,10 @@ class LLFlatListView : public LLScrollContainer virtual ~LLFlatListView() { clear(); }; + /** + * Connects callback to signal called when Return key is pressed. + */ + boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); } /** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */ virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -318,6 +322,10 @@ class LLFlatListView : public LLScrollContainer virtual bool selectItemPair(item_pair_t* item_pair, bool select); + virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection); + + virtual bool selectAll(); + virtual bool isSelected(item_pair_t* item_pair) const; virtual bool removeItemPair(item_pair_t* item_pair); @@ -331,6 +339,19 @@ class LLFlatListView : public LLScrollContainer */ void notifyParentItemsRectChanged(); + virtual BOOL handleKeyHere(KEY key, MASK mask); + + virtual BOOL postBuild(); + + virtual void onFocusReceived(); + + virtual void onFocusLost(); + + virtual void draw(); + + LLRect getLastSelectedItemRect(); + + LLRect getSelectedItemsRect(); private: @@ -381,6 +402,10 @@ class LLFlatListView : public LLScrollContainer LLRect mPrevNotifyParentRect; LLTextBox* mNoItemsCommentTextbox; + + LLViewBorder* mSelectedItemsBorder; + + commit_signal_t mOnReturnSignal; }; #endif diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index f2cdad8854a431a6a888054cb0911fa4f785f9a7..262afbe661507960ec58e2fef733562cd4e9c567 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1888,41 +1888,50 @@ void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_paren // dependents use same follow flags as their "dependee" continue; } - LLRect r = floaterp->getRect(); - - // Compute absolute distance from each edge of screen - S32 left_offset = llabs(r.mLeft - 0); - S32 right_offset = llabs(old_width - r.mRight); - - S32 top_offset = llabs(old_height - r.mTop); - S32 bottom_offset = llabs(r.mBottom - 0); // Make if follow the edge it is closest to U32 follow_flags = 0x0; - if (left_offset < right_offset) + if (floaterp->isMinimized()) { - follow_flags |= FOLLOWS_LEFT; + follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP); } else { - follow_flags |= FOLLOWS_RIGHT; - } + LLRect r = floaterp->getRect(); - // "No vertical adjustment" usually means that the bottom of the view - // has been pushed up or down. Hence we want the floaters to follow - // the top. - if (!adjust_vertical) - { - follow_flags |= FOLLOWS_TOP; - } - else if (top_offset < bottom_offset) - { - follow_flags |= FOLLOWS_TOP; - } - else - { - follow_flags |= FOLLOWS_BOTTOM; + // Compute absolute distance from each edge of screen + S32 left_offset = llabs(r.mLeft - 0); + S32 right_offset = llabs(old_width - r.mRight); + + S32 top_offset = llabs(old_height - r.mTop); + S32 bottom_offset = llabs(r.mBottom - 0); + + + if (left_offset < right_offset) + { + follow_flags |= FOLLOWS_LEFT; + } + else + { + follow_flags |= FOLLOWS_RIGHT; + } + + // "No vertical adjustment" usually means that the bottom of the view + // has been pushed up or down. Hence we want the floaters to follow + // the top. + if (!adjust_vertical) + { + follow_flags |= FOLLOWS_TOP; + } + else if (top_offset < bottom_offset) + { + follow_flags |= FOLLOWS_TOP; + } + else + { + follow_flags |= FOLLOWS_BOTTOM; + } } floaterp->setFollows(follow_flags); @@ -2172,16 +2181,16 @@ void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom) const LLFloater::Params& default_params = LLFloater::getDefaultParams(); S32 floater_header_size = default_params.header_height; static LLUICachedControl<S32> minimized_width ("UIMinimizedWidth", 0); - S32 col = 0; LLRect snap_rect_local = getLocalSnapRect(); - for(S32 row = snap_rect_local.mBottom; - row < snap_rect_local.getHeight() - floater_header_size; - row += floater_header_size ) //loop rows - { - for(col = snap_rect_local.mLeft; - col < snap_rect_local.getWidth() - minimized_width; - col += minimized_width) + for(S32 col = snap_rect_local.mLeft; + col < snap_rect_local.getWidth() - minimized_width; + col += minimized_width) + { + for(S32 row = snap_rect_local.mTop - floater_header_size; + row > floater_header_size; + row -= floater_header_size ) //loop rows { + bool foundGap = TRUE; for(child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); @@ -2517,8 +2526,12 @@ void LLFloaterView::pushVisibleAll(BOOL visible, const skip_list_t& skip_list) void LLFloaterView::popVisibleAll(const skip_list_t& skip_list) { - for (child_list_const_iter_t child_iter = getChildList()->begin(); - child_iter != getChildList()->end(); ++child_iter) + // make a copy of the list since some floaters change their + // order in the childList when changing visibility. + child_list_t child_list_copy = *getChildList(); + + for (child_list_const_iter_t child_iter = child_list_copy.begin(); + child_iter != child_list_copy.end(); ++child_iter) { LLView *view = *child_iter; if (skip_list.find(view) == skip_list.end()) @@ -2629,10 +2642,14 @@ void LLFloater::initFromParams(const LLFloater::Params& p) // open callback if (p.open_callback.isProvided()) - initCommitCallback(p.open_callback, mOpenSignal); + { + mOpenSignal.connect(initCommitCallback(p.open_callback)); + } // close callback if (p.close_callback.isProvided()) - initCommitCallback(p.close_callback, mCloseSignal); + { + mCloseSignal.connect(initCommitCallback(p.close_callback)); + } } LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build"); diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 95c8dd84f65e0dab667345516f772d77acf13879..1b98dddddc54281af7bb74591d3d67ef6ad298cf 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -195,6 +195,7 @@ friend class LLMultiFloater; /// 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); + BOOL isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts BOOL isFrontmost(); BOOL isDependent() { return !mDependeeHandle.isDead(); } void setCanMinimize(BOOL can_minimize); diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 03925f922c1182024deb2a1826f03579a5f8d6e9..eb67e3a56143b6fe1c6a5f5647cd224f2314a2a7 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -46,7 +46,7 @@ LLFloaterReg::instance_map_t LLFloaterReg::sInstanceMap; LLFloaterReg::build_map_t LLFloaterReg::sBuildMap; std::map<std::string,std::string> LLFloaterReg::sGroupMap; -static LLFloaterRegListener sFloaterRegListener("LLFloaterReg"); +static LLFloaterRegListener sFloaterRegListener; //******************************************************* diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp index 57d148b5af474025a2fd9bbbc94f816c7850da2a..029d3b681035246cad07545abfe2350ebbfc4826 100644 --- a/indra/llui/llfloaterreglistener.cpp +++ b/indra/llui/llfloaterreglistener.cpp @@ -21,19 +21,35 @@ #include "llfloater.h" #include "llbutton.h" -LLFloaterRegListener::LLFloaterRegListener(const std::string& pumpName): - LLDispatchListener(pumpName, "op") +LLFloaterRegListener::LLFloaterRegListener(): + LLEventAPI("LLFloaterReg", + "LLFloaterReg listener to (e.g.) show/hide LLFloater instances") { - add("getBuildMap", &LLFloaterRegListener::getBuildMap, LLSD().insert("reply", LLSD())); + add("getBuildMap", + "Return on [\"reply\"] data about all registered LLFloaterReg floater names", + &LLFloaterRegListener::getBuildMap, + LLSD().insert("reply", LLSD())); LLSD requiredName; requiredName["name"] = LLSD(); - add("showInstance", &LLFloaterRegListener::showInstance, requiredName); - add("hideInstance", &LLFloaterRegListener::hideInstance, requiredName); - add("toggleInstance", &LLFloaterRegListener::toggleInstance, requiredName); + add("showInstance", + "Ask to display the floater specified in [\"name\"]", + &LLFloaterRegListener::showInstance, + requiredName); + add("hideInstance", + "Ask to hide the floater specified in [\"name\"]", + &LLFloaterRegListener::hideInstance, + requiredName); + add("toggleInstance", + "Ask to toggle the state of the floater specified in [\"name\"]", + &LLFloaterRegListener::toggleInstance, + requiredName); LLSD requiredNameButton; requiredNameButton["name"] = LLSD(); requiredNameButton["button"] = LLSD(); - add("clickButton", &LLFloaterRegListener::clickButton, requiredNameButton); + add("clickButton", + "Simulate clicking the named [\"button\"] in the visible floater named in [\"name\"]", + &LLFloaterRegListener::clickButton, + requiredNameButton); } void LLFloaterRegListener::getBuildMap(const LLSD& event) const diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h index 304ecd10904aebd567289db04c69c7da45136318..a38117f6b073f1a945106e8b8ae4f84d74cc4696 100644 --- a/indra/llui/llfloaterreglistener.h +++ b/indra/llui/llfloaterreglistener.h @@ -12,18 +12,18 @@ #if ! defined(LL_LLFLOATERREGLISTENER_H) #define LL_LLFLOATERREGLISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" #include <string> class LLSD; /// Event API wrapper for LLFloaterReg -class LLFloaterRegListener: public LLDispatchListener +class LLFloaterRegListener: public LLEventAPI { public: /// As all public LLFloaterReg methods are static, there's no point in /// binding an LLFloaterReg instance. - LLFloaterRegListener(const std::string& pumpName); + LLFloaterRegListener(); private: void getBuildMap(const LLSD& event) const; diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 00a80478cf467eedb94358bde8d3510f5fd96b79..35fbc7b0a88f9a898714569f46614b81b0ed2d69 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -41,6 +41,10 @@ const F32 FOCUS_FADE_TIME = 0.3f; // NOTE: the LLFocusableElement implementation has been moved here from lluictrl.cpp. LLFocusableElement::LLFocusableElement() +: mFocusLostCallback(NULL), + mFocusReceivedCallback(NULL), + mFocusChangedCallback(NULL), + mTopLostCallback(NULL) { } @@ -59,23 +63,27 @@ BOOL LLFocusableElement::handleUnicodeChar(llwchar uni_char, BOOL called_from_pa // virtual LLFocusableElement::~LLFocusableElement() { + delete mFocusLostCallback; + delete mFocusReceivedCallback; + delete mFocusChangedCallback; + delete mTopLostCallback; } void LLFocusableElement::onFocusReceived() { - mFocusReceivedCallback(this); - mFocusChangedCallback(this); + if (mFocusReceivedCallback) (*mFocusReceivedCallback)(this); + if (mFocusChangedCallback) (*mFocusChangedCallback)(this); } void LLFocusableElement::onFocusLost() { - mFocusLostCallback(this); - mFocusChangedCallback(this); + if (mFocusLostCallback) (*mFocusLostCallback)(this); + if (mFocusChangedCallback) (*mFocusChangedCallback)(this); } void LLFocusableElement::onTopLost() { - mTopLostCallback(this); + if (mTopLostCallback) (*mTopLostCallback)(this); } BOOL LLFocusableElement::hasFocus() const @@ -87,6 +95,31 @@ void LLFocusableElement::setFocus(BOOL b) { } +boost::signals2::connection LLFocusableElement::setFocusLostCallback( const focus_signal_t::slot_type& cb) +{ + if (!mFocusLostCallback) mFocusLostCallback = new focus_signal_t(); + return mFocusLostCallback->connect(cb); +} + +boost::signals2::connection LLFocusableElement::setFocusReceivedCallback(const focus_signal_t::slot_type& cb) +{ + if (!mFocusReceivedCallback) mFocusReceivedCallback = new focus_signal_t(); + return mFocusReceivedCallback->connect(cb); +} + +boost::signals2::connection LLFocusableElement::setFocusChangedCallback(const focus_signal_t::slot_type& cb) +{ + if (!mFocusChangedCallback) mFocusChangedCallback = new focus_signal_t(); + return mFocusChangedCallback->connect(cb); +} + +boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_signal_t::slot_type& cb) +{ + if (!mTopLostCallback) mTopLostCallback = new focus_signal_t(); + return mTopLostCallback->connect(cb); +} + + LLFocusMgr gFocusMgr; diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 2fa4e124fb8c8fedba410114a22f03dbf04faa07..83ecd1d301fdb199dcc2f700c4249d7bb9e6b193 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -56,10 +56,10 @@ class LLFocusableElement typedef boost::signals2::signal<void(LLFocusableElement*)> focus_signal_t; - boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb) { return mFocusLostCallback.connect(cb);} - boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb) { return mFocusReceivedCallback.connect(cb);} - boost::signals2::connection setFocusChangedCallback(const focus_signal_t::slot_type& cb) { return mFocusChangedCallback.connect(cb);} - void setTopLostCallback(const focus_signal_t::slot_type& cb) { mTopLostCallback.connect(cb);} + boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb); + boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb); + boost::signals2::connection setFocusChangedCallback(const focus_signal_t::slot_type& cb); + boost::signals2::connection setTopLostCallback(const focus_signal_t::slot_type& cb); // These were brought up the hierarchy from LLView so that we don't have to use dynamic_cast when dealing with keyboard focus. virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); @@ -69,10 +69,10 @@ class LLFocusableElement 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; - focus_signal_t mTopLostCallback; + focus_signal_t* mFocusLostCallback; + focus_signal_t* mFocusReceivedCallback; + focus_signal_t* mFocusChangedCallback; + focus_signal_t* mTopLostCallback; }; diff --git a/indra/llui/llhelp.h b/indra/llui/llhelp.h index c06d29a4bd497203df318238157ab8a2dacc62dd..82c3bc385f322434a033b356f1ea94fd8a0214cf 100644 --- a/indra/llui/llhelp.h +++ b/indra/llui/llhelp.h @@ -40,6 +40,8 @@ class LLHelp virtual void showTopic(const std::string &topic) = 0; // return default (fallback) topic name suitable for showTopic() virtual std::string defaultTopic() = 0; + // return topic to use before the user logs in + virtual std::string preLoginTopic() = 0; }; #endif // headerguard diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 5999e1a29e0c2c80180ca114658830501e6ba26d..1fb618adeeefcad30bca0b04db1723e6b646003d 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -413,6 +413,19 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au } } +bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp) +{ + LayoutPanel* panel = findEmbeddedPanelByName(panel_name); + + if (panel) + { + if (min_widthp) *min_widthp = panel->mMinWidth; + if (min_heightp) *min_heightp = panel->mMinHeight; + } + + return NULL != panel; +} + static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks"); void LLLayoutStack::updateLayout(BOOL force_resize) { @@ -792,8 +805,8 @@ void LLLayoutStack::calcMinExtents() //static void LLLayoutStack::updateClass() { - for (LLInstanceTracker::instance_iter it = beginInstances(); it != endInstances(); ++it) + for (LLLayoutStack::instance_iter it = beginInstances(); it != endInstances(); ++it) { - (*it)->updateLayout(); + it->updateLayout(); } } diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 8475079f5eb75d47827676f3495e9d4eded405dd..abd5436018dbd51a6045b29f710cdec3d18740c5 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -38,7 +38,7 @@ class LLPanel; -class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack> +class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack> { public: struct Params : public LLInitParam::Block<Params, LLView::Params> @@ -81,8 +81,16 @@ class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack> S32 getNumPanels() { return mPanels.size(); } void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize); - - + + /** + * Gets minimal 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 getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp); + + void updateLayout(BOOL force_resize = FALSE); static void updateClass(); protected: @@ -92,7 +100,6 @@ class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack> private: struct LayoutPanel; - void updateLayout(BOOL force_resize = FALSE); void calcMinExtents(); S32 getDefaultHeight(S32 cur_height); S32 getDefaultWidth(S32 cur_width); diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 75905d092740d4e838eb12e53a83b00e7d5f9f6f..bd5734312a3185b629e3fcea22ef5a2787fa7eb0 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -84,8 +84,8 @@ void LLLineEditor::PrevalidateNamedFuncs::declareValues() declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32); declare("alpha_num", LLLineEditor::prevalidateAlphaNum); declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace); - declare("printable_not_pipe", LLLineEditor::prevalidatePrintableNotPipe); - declare("printable_no_space", LLLineEditor::prevalidatePrintableNoSpace); + declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe); + declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace); } LLLineEditor::Params::Params() @@ -323,6 +323,19 @@ void LLLineEditor::setMaxTextLength(S32 max_text_length) mMaxLengthBytes = max_len; } +void LLLineEditor::getTextPadding(S32 *left, S32 *right) +{ + *left = mTextPadLeft; + *right = mTextPadRight; +} + +void LLLineEditor::setTextPadding(S32 left, S32 right) +{ + mTextPadLeft = left; + mTextPadRight = right; + updateTextPadding(); +} + void LLLineEditor::updateTextPadding() { static LLUICachedControl<S32> line_editor_hpad ("UILineEditorHPad", 0); @@ -626,7 +639,8 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask) // delay cursor flashing mKeystrokeTimer.reset(); - mMouseDownSignal(this,x,y,mask); + if (mMouseDownSignal) + (*mMouseDownSignal)(this,x,y,mask); return TRUE; } @@ -742,7 +756,8 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask) } // We won't call LLUICtrl::handleMouseUp to avoid double calls of childrenHandleMouseUp().Just invoke the signal manually. - mMouseUpSignal(this,x,y, mask); + if (mMouseUpSignal) + (*mMouseUpSignal)(this,x,y, mask); return handled; } @@ -2186,20 +2201,28 @@ BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str) 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::prevalidatePrintableNotPipe(const LLWString &str) +BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str) { BOOL rv = TRUE; S32 len = str.length(); if(len == 0) return rv; while(len--) { - if('|' == str[len]) + llwchar wc = str[len]; + if (wc < 0x20 + || wc > 0x7f + || wc == '|') { rv = FALSE; break; } - if(!((' ' == str[len]) || LLStringOps::isAlnum((char)str[len]) || LLStringOps::isPunct((char)str[len]))) + if(!(wc == ' ' + || LLStringOps::isAlnum((char)wc) + || LLStringOps::isPunct((char)wc) ) ) { rv = FALSE; break; @@ -2209,15 +2232,19 @@ BOOL LLLineEditor::prevalidatePrintableNotPipe(const LLWString &str) } +// Used for avatar names // static -BOOL LLLineEditor::prevalidatePrintableNoSpace(const LLWString &str) +BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str) { BOOL rv = TRUE; S32 len = str.length(); if(len == 0) return rv; while(len--) { - if(LLStringOps::isSpace(str[len])) + llwchar wc = str[len]; + if (wc < 0x20 + || wc > 0x7f + || LLStringOps::isSpace(wc)) { rv = FALSE; break; @@ -2232,6 +2259,7 @@ BOOL LLLineEditor::prevalidatePrintableNoSpace(const LLWString &str) return rv; } + // static BOOL LLLineEditor::prevalidateASCII(const LLWString &str) { diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index d3daa941cfe929d09ff6bbd228d17b17fb8089e4..4c4b00094d4feedaed59d13848f0669d850b499e 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -226,6 +226,9 @@ class LLLineEditor void setKeystrokeCallback(callback_t callback, void* user_data); void setMaxTextLength(S32 max_text_length); + // Manipulate left and right padding for text + void getTextPadding(S32 *left, S32 *right); + void setTextPadding(S32 left, S32 right); // Prevalidation controls which keystrokes can affect the editor void setPrevalidate( LLLinePrevalidateFunc func ); @@ -235,8 +238,8 @@ class LLLineEditor static BOOL prevalidateNonNegativeS32(const LLWString &str); static BOOL prevalidateAlphaNum(const LLWString &str ); static BOOL prevalidateAlphaNumSpace(const LLWString &str ); - static BOOL prevalidatePrintableNotPipe(const LLWString &str); - static BOOL prevalidatePrintableNoSpace(const LLWString &str); + static BOOL prevalidateASCIIPrintableNoPipe(const LLWString &str); + static BOOL prevalidateASCIIPrintableNoSpace(const LLWString &str); static BOOL prevalidateASCII(const LLWString &str); static BOOL postvalidateFloat(const std::string &str); diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp index a657ed039a0e1861f9f268e6837e72b954af3a60..cdbd17e4dc45f689dfd5ab67b3928dbbaf8f92ba 100644 --- a/indra/llui/llmenubutton.cpp +++ b/indra/llui/llmenubutton.cpp @@ -133,11 +133,11 @@ void LLMenuButton::draw() if (mMenuVisibleLastFrame) { - setForcePressedState(TRUE); + setForcePressedState(true); } LLButton::draw(); - setForcePressedState(FALSE); + setForcePressedState(false); } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index de9a854f63702872920e2fbfdadeea1e4c23dbca..f8935d03ac1f72d20fc72c54204a73dd1ee63efa 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -760,21 +760,25 @@ void LLMenuItemCallGL::initFromParams(const Params& p) { if (p.on_visible.isProvided()) { - initVisibleCallback(p.on_visible, mVisibleSignal); + mVisibleSignal.connect(initVisibleCallback(p.on_visible)); } if (p.on_enable.isProvided()) { - initEnableCallback(p.on_enable, mEnableSignal); + setEnableCallback(initEnableCallback(p.on_enable)); // Set the enabled control variable (for backwards compatability) if (p.on_enable.control_name.isProvided() && !p.on_enable.control_name().empty()) { LLControlVariable* control = findControl(p.on_enable.control_name()); if (control) + { setEnabledControlVariable(control); + } } } if (p.on_click.isProvided()) - initCommitCallback(p.on_click, mCommitSignal); + { + setCommitCallback(initCommitCallback(p.on_click)); + } LLUICtrl::initFromParams(p); } @@ -795,7 +799,10 @@ void LLMenuItemCallGL::updateEnabled( void ) if (mEnabledControlVariable) { if (!enabled) - mEnabledControlVariable->set(false); // callback overrides control variable; this will call setEnabled() + { + // callback overrides control variable; this will call setEnabled() + mEnabledControlVariable->set(false); + } } else { @@ -854,7 +861,7 @@ void LLMenuItemCheckGL::initFromParams(const Params& p) { if (p.on_check.isProvided()) { - initEnableCallback(p.on_check, mCheckSignal); + setCheckCallback(initEnableCallback(p.on_check)); // Set the control name (for backwards compatability) if (p.on_check.control_name.isProvided() && !p.on_check.control_name().empty()) { diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index 68e496aed177935e368f0e442f9e49da66f8cbc8..1891bca36cb5be97592a1649f59261bd6ef2b892 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -84,17 +84,30 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p) mThumbCenterSelectedColor(p.thumb_center_selected_color()), mDisabledThumbColor(p.thumb_disabled_color()), mTriangleColor(p.triangle_color()), - mThumbWidth(p.thumb_width) + mThumbWidth(p.thumb_width), + mMouseDownSignal(NULL), + mMouseUpSignal(NULL) { mValue.emptyMap(); mCurSlider = LLStringUtil::null; if (p.mouse_down_callback.isProvided()) - initCommitCallback(p.mouse_down_callback, mMouseDownSignal); + { + setMouseDownCallback(initCommitCallback(p.mouse_down_callback)); + } if (p.mouse_up_callback.isProvided()) - initCommitCallback(p.mouse_up_callback, mMouseUpSignal); + { + setMouseUpCallback(initCommitCallback(p.mouse_up_callback)); + } +} + +LLMultiSlider::~LLMultiSlider() +{ + delete mMouseDownSignal; + delete mMouseUpSignal; } + void LLMultiSlider::setSliderValue(const std::string& name, F32 value, BOOL from_event) { // exit if not there @@ -325,7 +338,8 @@ BOOL LLMultiSlider::handleMouseUp(S32 x, S32 y, MASK mask) { gFocusMgr.setMouseCapture( NULL ); - mMouseUpSignal( this, LLSD() ); + if (mMouseUpSignal) + (*mMouseUpSignal)( this, LLSD() ); handled = TRUE; make_ui_sound("UISndClickRelease"); @@ -345,7 +359,8 @@ BOOL LLMultiSlider::handleMouseDown(S32 x, S32 y, MASK mask) { setFocus(TRUE); } - mMouseDownSignal( this, LLSD() ); + if (mMouseDownSignal) + (*mMouseDownSignal)( this, LLSD() ); if (MASK_CONTROL & mask) // if CTRL is modifying { @@ -557,3 +572,15 @@ void LLMultiSlider::draw() LLF32UICtrl::draw(); } + +boost::signals2::connection LLMultiSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t(); + return mMouseDownSignal->connect(cb); +} + +boost::signals2::connection LLMultiSlider::setMouseUpCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t(); + return mMouseUpSignal->connect(cb); +} diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h index da633cc1cd5017c10cb98be8751b6e82c16838da..f8e43a0470aa4a1d87b83f19a664c0bdb0977dcf 100644 --- a/indra/llui/llmultislider.h +++ b/indra/llui/llmultislider.h @@ -67,6 +67,7 @@ class LLMultiSlider : public LLF32UICtrl LLMultiSlider(const Params&); friend class LLUICtrlFactory; public: + virtual ~LLMultiSlider(); void setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE); F32 getSliderValue(const std::string& name) const; @@ -78,8 +79,8 @@ class LLMultiSlider : public LLF32UICtrl /*virtual*/ void setValue(const LLSD& value); /*virtual*/ LLSD getValue() const { return mValue; } - boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); } - boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); } + boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ); + boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ); bool findUnusedValue(F32& initVal); const std::string& addSlider(); @@ -116,8 +117,8 @@ class LLMultiSlider : public LLF32UICtrl LLUIColor mDisabledThumbColor; LLUIColor mTriangleColor; - commit_signal_t mMouseDownSignal; - commit_signal_t mMouseUpSignal; + commit_signal_t* mMouseDownSignal; + commit_signal_t* mMouseUpSignal; }; #endif // LL_MULTI_SLIDER_H diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index a9f462173dde1994bf47d5f4d0f9f4b5f81a3d0c..87938c19d4869efdbfa88a89ac213c198e9e991b 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -344,7 +344,7 @@ void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata) if( self->mMultiSlider->getMinValue() <= val && val <= self->mMultiSlider->getMaxValue() ) { self->setCurSliderValue( val ); // set the value temporarily so that the callback can retrieve it. - if( self->mValidateSignal( self, val ) ) + if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) ) { success = TRUE; } @@ -378,7 +378,7 @@ void LLMultiSliderCtrl::onSliderCommit(LLUICtrl* ctrl, const LLSD& userdata) F32 new_val = self->mMultiSlider->getCurSliderValue(); self->mCurValue = new_val; // set the value temporarily so that the callback can retrieve it. - if( self->mValidateSignal( self, new_val ) ) + if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) ) { success = TRUE; } diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp index 75f4d6177dc3958e5b1fc0b9f54dc6133e8a7ccb..fe4fbe75105eeb2064d5b9a6d188cd0b3ef387ae 100644 --- a/indra/llui/llnotificationslistener.cpp +++ b/indra/llui/llnotificationslistener.cpp @@ -16,10 +16,14 @@ #include "llnotifications.h" LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications) : - LLDispatchListener("LLNotifications", "op"), + LLEventAPI("LLNotifications", + "LLNotifications listener to (e.g.) pop up a notification"), mNotifications(notifications) { - add("requestAdd", &LLNotificationsListener::requestAdd); + add("requestAdd", + "Add a notification with specified [\"name\"], [\"substitutions\"] and [\"payload\"].\n" + "If optional [\"reply\"] specified, arrange to send user response on that LLEventPump.", + &LLNotificationsListener::requestAdd); } void LLNotificationsListener::requestAdd(const LLSD& event_data) const diff --git a/indra/llui/llnotificationslistener.h b/indra/llui/llnotificationslistener.h index 6f71a7c7817dc6490592e9c570c4f386d8977788..9b405d7b4b0c72c00b2c0299da81c0638f39ed86 100644 --- a/indra/llui/llnotificationslistener.h +++ b/indra/llui/llnotificationslistener.h @@ -12,12 +12,12 @@ #ifndef LL_LLNOTIFICATIONSLISTENER_H #define LL_LLNOTIFICATIONSLISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" class LLNotifications; class LLSD; -class LLNotificationsListener : public LLDispatchListener +class LLNotificationsListener : public LLEventAPI { public: LLNotificationsListener(LLNotifications & notifications); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 89c46562973ec4e39982c235933ebba96fc38884..063822dd567ce25064300d76754de622fa043a95 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -106,7 +106,8 @@ LLPanel::LLPanel(const LLPanel::Params& p) mHelpTopic(p.help_topic), mCommitCallbackRegistrar(false), mEnableCallbackRegistrar(false), - mXMLFilename(p.filename) + mXMLFilename(p.filename), + mVisibleSignal(NULL) // *NOTE: Be sure to also change LLPanel::initFromParams(). We have too // many classes derived from LLPanel to retrofit them all to pass in params. { @@ -118,6 +119,11 @@ LLPanel::LLPanel(const LLPanel::Params& p) mPanelHandle.bind(this); } +LLPanel::~LLPanel() +{ + delete mVisibleSignal; +} + // virtual BOOL LLPanel::isPanel() const { @@ -332,7 +338,8 @@ BOOL LLPanel::handleKeyHere( KEY key, MASK mask ) void LLPanel::handleVisibilityChange ( BOOL new_visibility ) { LLUICtrl::handleVisibilityChange ( new_visibility ); - mVisibleSignal(this, LLSD(new_visibility) ); // Pass BOOL as LLSD + if (mVisibleSignal) + (*mVisibleSignal)(this, LLSD(new_visibility) ); // Pass BOOL as LLSD } void LLPanel::setFocus(BOOL b) @@ -424,7 +431,9 @@ void LLPanel::initFromParams(const LLPanel::Params& p) // visible callback if (p.visible_callback.isProvided()) - initCommitCallback(p.visible_callback, mVisibleSignal); + { + setVisibleCallback(initCommitCallback(p.visible_callback)); + } for (LLInitParam::ParamIterator<LocalizedString>::const_iterator it = p.strings().begin(); it != p.strings().end(); @@ -907,3 +916,13 @@ void LLPanel::childSetControlName(const std::string& id, const std::string& cont view->setControlName(control_name, NULL); } } + +boost::signals2::connection LLPanel::setVisibleCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mVisibleSignal) + { + mVisibleSignal = new commit_signal_t(); + } + + return mVisibleSignal->connect(cb); +} diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index c213809d685a4d556ad3f044a1a6e6f435e4b803..0a0fed82fbddc1b994f2dcf4fbe5fb5937846367 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -109,7 +109,7 @@ class LLPanel : public LLUICtrl public: // LLPanel(const std::string& name, const LLRect& rect = LLRect(), BOOL bordered = TRUE); - /*virtual*/ ~LLPanel() {} + /*virtual*/ ~LLPanel(); // LLView interface /*virtual*/ BOOL isPanel() const; @@ -241,6 +241,8 @@ class LLPanel : public LLUICtrl void setXMLFilename(std::string filename) { mXMLFilename = filename; }; std::string getXMLFilename() { return mXMLFilename; }; + boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb ); + protected: // Override to set not found list LLButton* getDefaultButton() { return mDefaultBtn; } @@ -249,7 +251,7 @@ class LLPanel : public LLUICtrl EnableCallbackRegistry::ScopedRegistrar mEnableCallbackRegistrar; VisibleCallbackRegistry::ScopedRegistrar mVisibleCallbackRegistrar; - commit_signal_t mVisibleSignal; // Called when visibility changes, passes new visibility as LLSD() + commit_signal_t* mVisibleSignal; // Called when visibility changes, passes new visibility as LLSD() std::string mHelpTopic; // the name of this panel's help topic to display in the Help Viewer diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp index 304ac64f312347aee7103a4d047891efa5546015..a7cf9be277a778eb660237a094d33b7a65f6898a 100644 --- a/indra/llui/llresizebar.cpp +++ b/indra/llui/llresizebar.cpp @@ -143,6 +143,12 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask) if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView ) { + // undock floater when user resize it + if (((LLFloater*)getParent())->isDocked()) + { + ((LLFloater*)getParent())->setDocked(false, false); + } + // Resize the parent LLRect orig_rect = mResizingView->getRect(); LLRect scaled_rect = orig_rect; diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp index 7449c339a0dfacdd5deed2ab1d2c0dfa4295a325..6239a8f7214ddc093d16348b6ef0101338d08804 100644 --- a/indra/llui/llresizehandle.cpp +++ b/indra/llui/llresizehandle.cpp @@ -135,6 +135,12 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) LLView* resizing_view = getParent(); if( resizing_view ) { + // undock floater when user resize it + if (((LLFloater*)getParent())->isDocked()) + { + ((LLFloater*)getParent())->setDocked(false, false); + } + // Resize the parent LLRect orig_rect = resizing_view->getRect(); LLRect scaled_rect = orig_rect; diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index a7c268758adcbffdbd450643f27b77cf021d33be..544352176abcbe61cf704ce30c687508538f234a 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -71,7 +71,8 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_ LLScrollListCell::LLScrollListCell(const LLScrollListCell::Params& p) -: mWidth(p.width) +: mWidth(p.width), + mToolTip(p.tool_tip) {} // virtual @@ -204,13 +205,28 @@ BOOL LLScrollListText::isText() const return TRUE; } +// virtual +const std::string &LLScrollListText::getToolTip() const +{ + // If base class has a tooltip, return that + if (! LLScrollListCell::getToolTip().empty()) + return LLScrollListCell::getToolTip(); + + // ...otherwise, return the value itself as the tooltip + return mText.getString(); +} + +// virtual BOOL LLScrollListText::needsToolTip() const { - // show tooltips for truncated text + // If base class has a tooltip, return that + if (LLScrollListCell::needsToolTip()) + return LLScrollListCell::needsToolTip(); + + // ...otherwise, show tooltips for truncated text return mFont->getWidth(mText.getString()) > getWidth(); } - //virtual BOOL LLScrollListText::getVisible() const { diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h index 758623f1212b40f9dbb4e8a95eb693ff56b746b8..5fecf5aade9d2849e2ad043f2fce012fd327797e 100644 --- a/indra/llui/llscrolllistcell.h +++ b/indra/llui/llscrolllistcell.h @@ -66,6 +66,7 @@ class LLScrollListCell Optional<void*> userdata; Optional<LLSD> value; + Optional<std::string> tool_tip; Optional<const LLFontGL*> font; Optional<LLColor4> font_color; @@ -80,6 +81,7 @@ class LLScrollListCell enabled("enabled", true), visible("visible", true), value("value"), + tool_tip("tool_tip", ""), font("font", LLFontGL::getFontSansSerifSmall()), font_color("font_color", LLColor4::black), color("color", LLColor4::white), @@ -101,11 +103,13 @@ class LLScrollListCell virtual S32 getHeight() const { return 0; } virtual const LLSD getValue() const; virtual void setValue(const LLSD& value) { } + virtual const std::string &getToolTip() const { return mToolTip; } + virtual void setToolTip(const std::string &str) { mToolTip = str; } virtual BOOL getVisible() const { return TRUE; } virtual void setWidth(S32 width) { mWidth = width; } virtual void highlightText(S32 offset, S32 num_chars) {} virtual BOOL isText() const { return FALSE; } - virtual BOOL needsToolTip() const { return FALSE; } + virtual BOOL needsToolTip() const { return ! mToolTip.empty(); } virtual void setColor(const LLColor4&) {} virtual void onCommit() {}; @@ -114,6 +118,7 @@ class LLScrollListCell private: S32 mWidth; + std::string mToolTip; }; class LLScrollListSpacer : public LLScrollListCell @@ -143,6 +148,7 @@ class LLScrollListText : public LLScrollListCell /*virtual*/ void setColor(const LLColor4&); /*virtual*/ BOOL isText() const; + /*virtual*/ const std::string & getToolTip() const; /*virtual*/ BOOL needsToolTip() const; void setText(const LLStringExplicit& text); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 1c2c02e1cc1f840dce411fae12cd4b713e9129f5..a53a30b501200d5a61b3bebb620a8f182b61617a 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1565,7 +1565,7 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, MASK mask) // display tooltip exactly over original cell, in same font LLToolTipMgr::instance().show(LLToolTip::Params() - .message(hit_cell->getValue().asString()) + .message(hit_cell->getToolTip()) .font(LLFontGL::getFontSansSerifSmall()) .pos(LLCoordGL(sticky_rect.mLeft - 5, sticky_rect.mTop + 6)) .delay_time(0.2f) diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp index f86776384ada0dae375bdc0b913b226a4e4f20af..a6f729b396a1aeb051ed0102999255233bfc537c 100644 --- a/indra/llui/llslider.cpp +++ b/indra/llui/llslider.cpp @@ -47,14 +47,17 @@ static LLDefaultChildRegistry::Register<LLSlider> r1("slider_bar"); // have ambigious template lookup problem LLSlider::Params::Params() -: track_color("track_color"), +: orientation ("orientation", std::string ("horizontal")), + track_color("track_color"), thumb_outline_color("thumb_outline_color"), thumb_center_color("thumb_center_color"), thumb_image("thumb_image"), thumb_image_pressed("thumb_image_pressed"), thumb_image_disabled("thumb_image_disabled"), - track_image("track_image"), - track_highlight_image("track_highlight_image"), + track_image_horizontal("track_image_horizontal"), + track_image_vertical("track_image_vertical"), + track_highlight_horizontal_image("track_highlight_horizontal_image"), + track_highlight_vertical_image("track_highlight_vertical_image"), mouse_down_callback("mouse_down_callback"), mouse_up_callback("mouse_up_callback") { @@ -64,14 +67,19 @@ LLSlider::Params::Params() LLSlider::LLSlider(const LLSlider::Params& p) : LLF32UICtrl(p), mMouseOffset( 0 ), + mOrientation ((p.orientation() == "horizontal") ? HORIZONTAL : VERTICAL), mTrackColor(p.track_color()), mThumbOutlineColor(p.thumb_outline_color()), mThumbCenterColor(p.thumb_center_color()), mThumbImage(p.thumb_image), mThumbImagePressed(p.thumb_image_pressed), mThumbImageDisabled(p.thumb_image_disabled), - mTrackImage(p.track_image), - mTrackHighlightImage(p.track_highlight_image) + mTrackImageHorizontal(p.track_image_horizontal), + mTrackImageVertical(p.track_image_vertical), + mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image), + mTrackHighlightVerticalImage(p.track_highlight_vertical_image), + mMouseDownSignal(NULL), + mMouseUpSignal(NULL) { mViewModel->setValue(p.initial_value); updateThumbRect(); @@ -80,9 +88,19 @@ LLSlider::LLSlider(const LLSlider::Params& p) setValue(getValueF32()); if (p.mouse_down_callback.isProvided()) - initCommitCallback(p.mouse_down_callback, mMouseDownSignal); + { + setMouseDownCallback(initCommitCallback(p.mouse_down_callback)); + } if (p.mouse_up_callback.isProvided()) - initCommitCallback(p.mouse_up_callback, mMouseUpSignal); + { + setMouseUpCallback(initCommitCallback(p.mouse_up_callback)); + } +} + +LLSlider::~LLSlider() +{ + delete mMouseDownSignal; + delete mMouseUpSignal; } void LLSlider::setValue(F32 value, BOOL from_event) @@ -111,14 +129,29 @@ void LLSlider::updateThumbRect() S32 thumb_width = mThumbImage ? mThumbImage->getWidth() : DEFAULT_THUMB_SIZE; S32 thumb_height = mThumbImage ? mThumbImage->getHeight() : DEFAULT_THUMB_SIZE; - S32 left_edge = (thumb_width / 2); - S32 right_edge = getRect().getWidth() - (thumb_width / 2); - - S32 x = left_edge + S32( t * (right_edge - left_edge) ); - mThumbRect.mLeft = x - (thumb_width / 2); - mThumbRect.mRight = mThumbRect.mLeft + thumb_width; - mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2); - mThumbRect.mTop = mThumbRect.mBottom + thumb_height; + + if ( mOrientation == HORIZONTAL ) + { + S32 left_edge = (thumb_width / 2); + S32 right_edge = getRect().getWidth() - (thumb_width / 2); + + S32 x = left_edge + S32( t * (right_edge - left_edge) ); + mThumbRect.mLeft = x - (thumb_width / 2); + mThumbRect.mRight = mThumbRect.mLeft + thumb_width; + mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2); + mThumbRect.mTop = mThumbRect.mBottom + thumb_height; + } + else + { + S32 top_edge = (thumb_height / 2); + S32 bottom_edge = getRect().getHeight() - (thumb_height / 2); + + S32 y = top_edge + S32( t * (bottom_edge - top_edge) ); + mThumbRect.mLeft = getLocalRect().getCenterX() - (thumb_width / 2); + mThumbRect.mRight = mThumbRect.mLeft + thumb_width; + mThumbRect.mBottom = y - (thumb_height / 2); + mThumbRect.mTop = mThumbRect.mBottom + thumb_height; + } } @@ -138,18 +171,32 @@ BOOL LLSlider::handleHover(S32 x, S32 y, MASK mask) { if( hasMouseCapture() ) { - S32 thumb_half_width = mThumbImage->getWidth()/2; - S32 left_edge = thumb_half_width; - S32 right_edge = getRect().getWidth() - (thumb_half_width); + if ( mOrientation == HORIZONTAL ) + { + S32 thumb_half_width = mThumbImage->getWidth()/2; + S32 left_edge = thumb_half_width; + S32 right_edge = getRect().getWidth() - (thumb_half_width); + + x += mMouseOffset; + x = llclamp( x, left_edge, right_edge ); - x += mMouseOffset; - x = llclamp( x, left_edge, right_edge ); + F32 t = F32(x - left_edge) / (right_edge - left_edge); + setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue ); + } + else // mOrientation == VERTICAL + { + S32 thumb_half_height = mThumbImage->getHeight()/2; + S32 top_edge = thumb_half_height; + S32 bottom_edge = getRect().getHeight() - (thumb_half_height); - F32 t = F32(x - left_edge) / (right_edge - left_edge); - setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue ); + y += mMouseOffset; + y = llclamp(y, top_edge, bottom_edge); + F32 t = F32(y - top_edge) / (bottom_edge - top_edge); + setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue ); + } getWindow()->setCursor(UI_CURSOR_ARROW); - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl; + lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl; } else { @@ -167,7 +214,8 @@ BOOL LLSlider::handleMouseUp(S32 x, S32 y, MASK mask) { gFocusMgr.setMouseCapture( NULL ); - mMouseUpSignal( this, getValueF32() ); + if (mMouseUpSignal) + (*mMouseUpSignal)( this, getValueF32() ); handled = TRUE; make_ui_sound("UISndClickRelease"); @@ -187,7 +235,8 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask) { setFocus(TRUE); } - mMouseDownSignal( this, getValueF32() ); + if (mMouseDownSignal) + (*mMouseDownSignal)( this, getValueF32() ); if (MASK_CONTROL & mask) // if CTRL is modifying { @@ -198,7 +247,9 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask) // Find the offset of the actual mouse location from the center of the thumb. if (mThumbRect.pointInRect(x,y)) { - mMouseOffset = (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x; + mMouseOffset = (mOrientation == HORIZONTAL) + ? (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x + : (mThumbRect.mBottom + mThumbImage->getHeight()/2) - y; } else { @@ -220,15 +271,12 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask) BOOL handled = FALSE; switch(key) { - case KEY_UP: case KEY_DOWN: - // eat up and down keys to be consistent - handled = TRUE; - break; case KEY_LEFT: setValueAndCommit(getValueF32() - getIncrement()); handled = TRUE; break; + case KEY_UP: case KEY_RIGHT: setValueAndCommit(getValueF32() + getIncrement()); handled = TRUE; @@ -239,6 +287,17 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask) return handled; } +BOOL LLSlider::handleScrollWheel(S32 x, S32 y, S32 clicks) +{ + if ( mOrientation == VERTICAL ) + { + F32 new_val = getValueF32() - clicks * getIncrement(); + setValueAndCommit(new_val); + return TRUE; + } + return LLF32UICtrl::handleScrollWheel(x,y,clicks); +} + void LLSlider::draw() { F32 alpha = getDrawContext().mAlpha; @@ -252,13 +311,36 @@ void LLSlider::draw() gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); // Track - LLRect track_rect(mThumbImage->getWidth() / 2, - getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2), - getRect().getWidth() - mThumbImage->getWidth() / 2, - getLocalRect().getCenterY() - (mTrackImage->getHeight() / 2) ); - LLRect highlight_rect(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom); - mTrackImage->draw(track_rect, LLColor4::white % alpha); - mTrackHighlightImage->draw(highlight_rect, LLColor4::white % alpha); + LLPointer<LLUIImage>& trackImage = ( mOrientation == HORIZONTAL ) + ? mTrackImageHorizontal + : mTrackImageVertical; + + LLPointer<LLUIImage>& trackHighlightImage = ( mOrientation == HORIZONTAL ) + ? mTrackHighlightHorizontalImage + : mTrackHighlightVerticalImage; + + LLRect track_rect; + LLRect highlight_rect; + + if ( mOrientation == HORIZONTAL ) + { + track_rect.set(mThumbImage->getWidth() / 2, + getLocalRect().getCenterY() + (trackImage->getHeight() / 2), + getRect().getWidth() - mThumbImage->getWidth() / 2, + getLocalRect().getCenterY() - (trackImage->getHeight() / 2) ); + highlight_rect.set(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom); + } + else + { + track_rect.set(getLocalRect().getCenterX() - (trackImage->getWidth() / 2), + getRect().getHeight(), + getLocalRect().getCenterX() + (trackImage->getWidth() / 2), + 0); + highlight_rect.set(track_rect.mLeft, track_rect.mTop, track_rect.mRight, track_rect.mBottom); + } + + trackImage->draw(track_rect, LLColor4::white % alpha); + trackHighlightImage->draw(highlight_rect, LLColor4::white % alpha); // Thumb if (hasFocus()) @@ -296,3 +378,15 @@ void LLSlider::draw() LLUICtrl::draw(); } + +boost::signals2::connection LLSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t(); + return mMouseDownSignal->connect(cb); +} + +boost::signals2::connection LLSlider::setMouseUpCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t(); + return mMouseUpSignal->connect(cb); +} diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h index e2a94e4d8cf3f0a2bf5533ed8a8f9a56e6cbbb04..45f8f81e409af8f8b8ca26f0cdc17239d3331986 100644 --- a/indra/llui/llslider.h +++ b/indra/llui/llslider.h @@ -39,8 +39,12 @@ class LLSlider : public LLF32UICtrl { public: + enum ORIENTATION { HORIZONTAL, VERTICAL }; + struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params> { + Optional<std::string> orientation; + Optional<LLUIColor> track_color, thumb_outline_color, thumb_center_color; @@ -48,8 +52,10 @@ class LLSlider : public LLF32UICtrl Optional<LLUIImage*> thumb_image, thumb_image_pressed, thumb_image_disabled, - track_image, - track_highlight_image; + track_image_horizontal, + track_image_vertical, + track_highlight_horizontal_image, + track_highlight_vertical_image; Optional<CommitCallbackParam> mouse_down_callback, mouse_up_callback; @@ -61,6 +67,7 @@ class LLSlider : public LLF32UICtrl LLSlider(const Params&); friend class LLUICtrlFactory; public: + virtual ~LLSlider(); void setValue( F32 value, BOOL from_event = FALSE ); // overrides for LLF32UICtrl methods virtual void setValue(const LLSD& value ) { setValue((F32)value.asReal(), TRUE); } @@ -70,13 +77,14 @@ class LLSlider : public LLF32UICtrl virtual void setMinValue(F32 min_value) { LLF32UICtrl::setMinValue(min_value); updateThumbRect(); } virtual void setMaxValue(F32 max_value) { LLF32UICtrl::setMaxValue(max_value); updateThumbRect(); } - boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); } - boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); } + boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ); + boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ); virtual BOOL handleHover(S32 x, S32 y, MASK mask); virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleKeyHere(KEY key, MASK mask); + virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); virtual void draw(); private: @@ -90,16 +98,20 @@ class LLSlider : public LLF32UICtrl LLPointer<LLUIImage> mThumbImage; LLPointer<LLUIImage> mThumbImagePressed; LLPointer<LLUIImage> mThumbImageDisabled; - LLPointer<LLUIImage> mTrackImage; - LLPointer<LLUIImage> mTrackHighlightImage; + LLPointer<LLUIImage> mTrackImageHorizontal; + LLPointer<LLUIImage> mTrackImageVertical; + LLPointer<LLUIImage> mTrackHighlightHorizontalImage; + LLPointer<LLUIImage> mTrackHighlightVerticalImage; + + const ORIENTATION mOrientation; - LLRect mThumbRect; + LLRect mThumbRect; LLUIColor mTrackColor; LLUIColor mThumbOutlineColor; LLUIColor mThumbCenterColor; - commit_signal_t mMouseDownSignal; - commit_signal_t mMouseUpSignal; + commit_signal_t* mMouseDownSignal; + commit_signal_t* mMouseUpSignal; }; #endif // LL_LLSLIDER_H diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp index ed22c0a47f8ac07ea994edf0d85e6fb0102e18af..01c274bb4eb62cb683fd5357a9df50ad43561241 100644 --- a/indra/llui/llsliderctrl.cpp +++ b/indra/llui/llsliderctrl.cpp @@ -122,7 +122,8 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p) slider_p.min_value.setIfNotProvided(p.min_value); slider_p.max_value.setIfNotProvided(p.max_value); slider_p.increment.setIfNotProvided(p.increment); - + slider_p.orientation.setIfNotProvided(p.orientation); + slider_p.commit_callback.function(&LLSliderCtrl::onSliderCommit); slider_p.control_name(p.control_name); slider_p.mouse_down_callback( p.mouse_down_callback ); @@ -260,7 +261,7 @@ void LLSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata ) if( self->mSlider->getMinValue() <= val && val <= self->mSlider->getMaxValue() ) { self->setValue( val ); // set the value temporarily so that the callback can retrieve it. - if( self->mValidateSignal( self, val ) ) + if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) ) { success = TRUE; } @@ -294,7 +295,7 @@ void LLSliderCtrl::onSliderCommit( LLUICtrl* ctrl, const LLSD& userdata ) F32 new_val = self->mSlider->getValueF32(); self->mValue = new_val; // set the value temporarily so that the callback can retrieve it. - if( self->mValidateSignal( self, new_val ) ) + if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) ) { success = TRUE; } diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h index 4a1574d502110352a5fff000bd8f4d3425c48a86..c425849782245e45806aff1b48f6a621b3bed39b 100644 --- a/indra/llui/llsliderctrl.h +++ b/indra/llui/llsliderctrl.h @@ -46,6 +46,7 @@ class LLSliderCtrl : public LLF32UICtrl public: struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params> { + Optional<std::string> orientation; Optional<S32> label_width; Optional<S32> text_width; Optional<bool> show_text; @@ -78,7 +79,8 @@ class LLSliderCtrl : public LLF32UICtrl value_text("value_text"), slider_label("slider_label"), mouse_down_callback("mouse_down_callback"), - mouse_up_callback("mouse_up_callback") + mouse_up_callback("mouse_up_callback"), + orientation("orientation", std::string ("horizontal")) {} }; protected: diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index bedf16a397ddd7845f94bf7196a65601f1bc7108..d6d46654d57003bff84c31b680d2ee45b153dcb9 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -190,7 +190,7 @@ void LLSpinCtrl::onUpBtn( const LLSD& data ) F32 saved_val = (F32)getValue().asReal(); setValue(val); - if( !mValidateSignal( this, val ) ) + if( mValidateSignal && !(*mValidateSignal)( this, val ) ) { setValue( saved_val ); reportInvalidData(); @@ -224,7 +224,7 @@ void LLSpinCtrl::onDownBtn( const LLSD& data ) F32 saved_val = (F32)getValue().asReal(); setValue(val); - if( !mValidateSignal( this, val ) ) + if( mValidateSignal && !(*mValidateSignal)( this, val ) ) { setValue( saved_val ); reportInvalidData(); @@ -316,7 +316,7 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data ) F32 saved_val = getValueF32(); setValue(val); - if( mValidateSignal( this, val ) ) + if( !mValidateSignal || (*mValidateSignal)( this, val ) ) { success = TRUE; onCommit(); diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index fd3f88d1f61317b7ef43f792a66a3891a29927eb..71511f69a41307099f4d88c505c98c7b59c11d34 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -51,6 +51,7 @@ LLStyle::Params::Params() LLStyle::LLStyle(const LLStyle::Params& p) : mVisible(p.visible), mColor(p.color()), + mReadOnlyColor(p.readonly_color()), mFont(p.font()), mLink(p.link_href), mDropShadow(p.drop_shadow), diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index c7699641366550c985f9d26ed822353319e38728..ee9ca730e9473820e537e76d6a3ff331a1487e93 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -46,7 +46,8 @@ class LLStyle : public LLRefCount { Optional<bool> visible; Optional<LLFontGL::ShadowType> drop_shadow; - Optional<LLUIColor> color; + Optional<LLUIColor> color, + readonly_color; Optional<const LLFontGL*> font; Optional<LLUIImage*> image; Optional<std::string> link_href; @@ -57,6 +58,8 @@ class LLStyle : public LLRefCount const LLColor4& getColor() const { return mColor; } void setColor(const LLColor4 &color) { mColor = color; } + const LLColor4& getReadOnlyColor() const { return mReadOnlyColor; } + BOOL isVisible() const; void setVisible(BOOL is_visible); @@ -81,6 +84,7 @@ class LLStyle : public LLRefCount return mVisible == rhs.mVisible && mColor == rhs.mColor + && mReadOnlyColor == rhs.mReadOnlyColor && mFont == rhs.mFont && mLink == rhs.mLink && mImagep == rhs.mImagep @@ -104,6 +108,7 @@ class LLStyle : public LLRefCount private: BOOL mVisible; LLUIColor mColor; + LLUIColor mReadOnlyColor; std::string mFontName; const LLFontGL* mFont; // cached for performance std::string mLink; diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index b67f753d39431e09fe47143bf2f7b3bf7121c3fe..d7d61cf6cb1cc0c50f46b75c7a837d673ace3b76 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -346,7 +346,13 @@ void LLTabContainer::draw() } } - LLPanel::draw(); + { + LLRect clip_rect = getLocalRect(); + clip_rect.mLeft+=(LLPANEL_BORDER_WIDTH + 2); + clip_rect.mRight-=(LLPANEL_BORDER_WIDTH + 2); + LLLocalClipRect clip(clip_rect); + LLPanel::draw(); + } // if tabs are hidden, don't draw them and leave them in the invisible state if (!getTabsHidden()) @@ -358,24 +364,6 @@ void LLTabContainer::draw() tuple->mButton->setVisible( TRUE ); } - // Draw some of the buttons... - LLRect clip_rect = getLocalRect(); - if (has_scroll_arrows) - { - // ...but clip them. - if (mIsVertical) - { - clip_rect.mBottom = mNextArrowBtn->getRect().mTop + 3*tabcntrv_pad; - clip_rect.mTop = mPrevArrowBtn->getRect().mBottom - 3*tabcntrv_pad; - } - else - { - clip_rect.mLeft = mPrevArrowBtn->getRect().mRight; - clip_rect.mRight = mNextArrowBtn->getRect().mLeft; - } - } - LLLocalClipRect clip(clip_rect); - S32 max_scroll_visible = getTabCount() - getMaxScrollPos() + getScrollPos(); S32 idx = 0; for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) @@ -1039,6 +1027,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) { LLUICtrl::addChild(child, 1); } + + sendChildToFront(mPrevArrowBtn); + sendChildToFront(mNextArrowBtn); + sendChildToFront(mJumpPrevArrowBtn); + sendChildToFront(mJumpNextArrowBtn); if( select ) { @@ -1346,12 +1339,12 @@ BOOL LLTabContainer::selectTab(S32 which) cbdata = selected_tuple->mTabPanel->getName(); BOOL res = FALSE; - if( mValidateSignal( this, cbdata ) ) + if( !mValidateSignal || (*mValidateSignal)( this, cbdata ) ) { res = setTab(which); - if (res) + if (res && mCommitSignal) { - mCommitSignal(this, cbdata); + (*mCommitSignal)(this, cbdata); } } @@ -1672,23 +1665,23 @@ void LLTabContainer::initButtons() S32 btn_top = (getTabPosition() == TOP ) ? getRect().getHeight() - getTopBorderHeight() : tabcntr_arrow_btn_size + 1; LLRect left_arrow_btn_rect; - left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+tabcntr_arrow_btn_size, btn_top + arrow_fudge, tabcntr_arrow_btn_size, tabcntr_arrow_btn_size ); + left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+tabcntr_arrow_btn_size, btn_top + arrow_fudge, tabcntr_arrow_btn_size, mTabHeight ); LLRect jump_left_arrow_btn_rect; - jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, tabcntr_arrow_btn_size, tabcntr_arrow_btn_size ); + jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, tabcntr_arrow_btn_size, mTabHeight ); S32 right_pad = tabcntr_arrow_btn_size + LLPANEL_BORDER_WIDTH + 1; LLRect right_arrow_btn_rect; right_arrow_btn_rect.setLeftTopAndSize( getRect().getWidth() - mRightTabBtnOffset - right_pad - tabcntr_arrow_btn_size, btn_top + arrow_fudge, - tabcntr_arrow_btn_size, tabcntr_arrow_btn_size ); + tabcntr_arrow_btn_size, mTabHeight ); LLRect jump_right_arrow_btn_rect; jump_right_arrow_btn_rect.setLeftTopAndSize( getRect().getWidth() - mRightTabBtnOffset - right_pad, btn_top + arrow_fudge, - tabcntr_arrow_btn_size, tabcntr_arrow_btn_size ); + tabcntr_arrow_btn_size, mTabHeight ); LLButton::Params p; p.name(std::string("Jump Left Arrow")); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 97ba69134184142c9e5cecc5020104ac47256ea7..7bf10d774c35b170467b94018598e3b966952a2b 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -60,6 +60,11 @@ LLTextBase::line_info::line_info(S32 index_start, S32 index_end, LLRect rect, S3 bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, const LLTextSegmentPtr& b) const { + // sort empty spans (e.g. 11-11) after previous non-empty spans (e.g. 5-11) + if (a->getEnd() == b->getEnd()) + { + return a->getStart() < b->getStart(); + } return a->getEnd() < b->getEnd(); } @@ -286,8 +291,7 @@ bool LLTextBase::truncate() LLStyle::Params LLTextBase::getDefaultStyle() { - LLColor4 text_color = ( mReadOnly ? mReadOnlyFgColor.get() : mFgColor.get() ); - return LLStyle::Params().color(text_color).font(mDefaultFont).drop_shadow(mFontShadow); + return LLStyle::Params().color(mFgColor.get()).readonly_color(mReadOnlyFgColor.get()).font(mDefaultFont).drop_shadow(mFontShadow); } void LLTextBase::onValueChange(S32 start, S32 end) @@ -995,6 +999,12 @@ void LLTextBase::setColor( const LLColor4& c ) mFgColor = c; } +//virtual +void LLTextBase::setReadOnlyColor(const LLColor4 &c) +{ + mReadOnlyFgColor = c; +} + //virtual void LLTextBase::setValue(const LLSD& value ) { @@ -1446,7 +1456,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url) } } -void LLTextBase::setText(const LLStringExplicit &utf8str) +void LLTextBase::setText(const LLStringExplicit &utf8str ,const LLStyle::Params& input_params) { // clear out the existing text and segments getViewModel()->setDisplay(LLWStringUtil::null); @@ -1461,7 +1471,7 @@ void LLTextBase::setText(const LLStringExplicit &utf8str) std::string text(utf8str); LLStringUtil::removeCRLF(text); - appendText(text, false); + appendText(text, false, input_params); onValueChange(0, getLength()); } @@ -1500,10 +1510,14 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c LLStyle::Params link_params = style_params; link_params.color = match.getColor(); + link_params.readonly_color = match.getColor(); // apply font name from requested style_params std::string font_name = LLFontGL::nameFromFont(style_params.font()); - link_params.font.name.setIfNotProvided(font_name); - link_params.font.style = "UNDERLINE"; + std::string font_size = LLFontGL::sizeFromFont(style_params.font()); + link_params.font.name(font_name); + link_params.font.size(font_size); + link_params.font.style("UNDERLINE"); + link_params.link_href = match.getUrl(); // output the text before the Url @@ -2051,16 +2065,16 @@ void LLTextBase::updateRects() mContentsRect.unionWith(line_iter->mRect); } - mContentsRect.mLeft = 0; + S32 delta_pos_x = -mContentsRect.mLeft; mContentsRect.mTop += mVPad; S32 delta_pos = -mContentsRect.mBottom; // move line segments to fit new document rect for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it) { - it->mRect.translate(0, delta_pos); + it->mRect.translate(delta_pos_x, delta_pos); } - mContentsRect.translate(0, delta_pos); + mContentsRect.translate(delta_pos_x, delta_pos); } // update document container dimensions according to text contents @@ -2232,7 +2246,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele const LLFontGL* font = mStyle->getFont(); - LLColor4 color = mStyle->getColor() % alpha; + LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % alpha; font = mStyle->getFont(); @@ -2370,7 +2384,17 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt height = mFontHeight; width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars); - return num_chars >= 1 && text[mStart + num_chars - 1] == '\n'; + // if last character is a newline, then return true, forcing line break + llwchar last_char = text[mStart + first_char + num_chars - 1]; + + LLUIImagePtr image = mStyle->getImage(); + if( image.notNull()) + { + width += image->getWidth(); + height = llmax(height, image->getHeight()); + } + + return num_chars >= 1 && last_char == '\n'; } S32 LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 8cae8fde220ebb960af7a9d24a5081c3952f2570..c376a73615caf4f1cfe5b3f86dd05871446bef84 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -118,6 +118,8 @@ class LLTextBase // LLUICtrl interface /*virtual*/ BOOL acceptsTextInput() const { return !mReadOnly; } /*virtual*/ void setColor( const LLColor4& c ); + virtual void setReadOnlyColor(const LLColor4 &c); + /*virtual*/ void setValue(const LLSD& value ); /*virtual*/ LLTextViewModel* getViewModel() const; @@ -135,8 +137,9 @@ class LLTextBase // Text accessors // TODO: add optional style parameter - virtual void setText(const LLStringExplicit &utf8str); // uses default style + virtual void setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style virtual std::string getText() const; + void setMaxTextLength(S32 length) { mMaxTextByteLength = length; } // wide-char versions void setWText(const LLWString& text); diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 00f1d833a30a4c264ca8f21269214cd3d462b69e..4c4123cf45213f7a805587e23fca5df9c580c12b 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -112,12 +112,12 @@ BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask) return handled; } -void LLTextBox::setText(const LLStringExplicit& text) +void LLTextBox::setText(const LLStringExplicit& text , const LLStyle::Params& input_params ) { // does string argument insertion mText.assign(text); - LLTextBase::setText(mText.getString()); + LLTextBase::setText(mText.getString(), input_params ); } void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ ) diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h index 73f8a7c299ed7cdbb3662923505a2adb79deacd3..01b4bfa5ed68725d1e29e22af7b09ee4293b1277 100644 --- a/indra/llui/lltextbox.h +++ b/indra/llui/lltextbox.h @@ -58,7 +58,7 @@ class LLTextBox : /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); - /*virtual*/ void setText( const LLStringExplicit& text ); + /*virtual*/ void setText( const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params() ); void setRightAlign() { mHAlign = LLFontGL::RIGHT; } void setHAlign( LLFontGL::HAlign align ) { mHAlign = align; } diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 3ce5a0320be63dd849375a12369349bf4edf9ee9..3f4ef24f82a85b82daaf61312fd0e13ad0d26347 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -311,12 +311,12 @@ LLTextEditor::~LLTextEditor() // LLTextEditor // Public methods -void LLTextEditor::setText(const LLStringExplicit &utf8str) +void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params) { blockUndo(); deselect(); - LLTextBase::setText(utf8str); + LLTextBase::setText(utf8str, input_params); resetDirty(); } @@ -750,8 +750,10 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask) { if( mIsSelecting ) { - mScroller->autoScroll(x, y); - + if(mScroller) + { + mScroller->autoScroll(x, y); + } S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight); S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop); setCursorAtLocalPos( clamped_x, clamped_y, true ); @@ -799,7 +801,10 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) { if( mIsSelecting ) { - mScroller->autoScroll(x, y); + if(mScroller) + { + mScroller->autoScroll(x, y); + } S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight); S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop); setCursorAtLocalPos( clamped_x, clamped_y, true ); @@ -1696,7 +1701,15 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask ) */ if (mReadOnly) { - handled = mScroller->handleKeyHere( key, mask ); + if(mScroller) + { + handled = mScroller->handleKeyHere( key, mask ); + } + else + { + handled = handleNavigationKey( key, mask ); + } + } else { @@ -2005,7 +2018,8 @@ void LLTextEditor::setEnabled(BOOL enabled) bool read_only = !enabled; if (read_only != mReadOnly) { - mReadOnly = read_only; + //mReadOnly = read_only; + LLTextBase::setReadOnly(read_only); updateSegments(); updateAllowingLanguageInput(); } @@ -2134,9 +2148,8 @@ void LLTextEditor::drawPreeditMarker() void LLTextEditor::drawLineNumbers() { LLGLSUIDefault gls_ui; - - LLRect scrolled_view_rect = mScroller->getVisibleContentRect(); - LLRect content_rect = mScroller->getContentWindowRect(); + LLRect scrolled_view_rect = getVisibleDocumentRect(); + LLRect content_rect = getTextRect(); LLLocalClipRect clip(content_rect); S32 first_line = getFirstVisibleLine(); S32 num_lines = getLineCount(); diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 10fc94dedc1e4810785ec474947932efd72df17a..fb014b86bf873abcca1a88a72963d5bb0265c24a 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -168,7 +168,7 @@ class LLTextEditor : void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo); // Non-undoable - void setText(const LLStringExplicit &utf8str); + void setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params = LLStyle::Params()); // Removes text from the end of document diff --git a/indra/llui/lltoggleablemenu.cpp b/indra/llui/lltoggleablemenu.cpp index 717e135412e2948cf3ad4ee376059da96dcc3e27..5df1d35383241739a64c8c5b8a278bc9d597d1ea 100644 --- a/indra/llui/lltoggleablemenu.cpp +++ b/indra/llui/lltoggleablemenu.cpp @@ -40,6 +40,7 @@ static LLDefaultChildRegistry::Register<LLToggleableMenu> r("toggleable_menu"); LLToggleableMenu::LLToggleableMenu(const LLToggleableMenu::Params& p) : LLMenuGL(p), + mButtonRect(), mClosedByButtonClick(false) { } @@ -56,13 +57,19 @@ void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn) } } -void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view) +void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view) { LLRect screen; current_view->localRectToScreen(rect, &screen); mButtonRect = screen; } +void LLToggleableMenu::setButtonRect(LLView* current_view) +{ + LLRect rect = current_view->getLocalRect(); + setButtonRect(rect, current_view); +} + bool LLToggleableMenu::toggleVisibility() { if (mClosedByButtonClick) diff --git a/indra/llui/lltoggleablemenu.h b/indra/llui/lltoggleablemenu.h index 3cd66e04a8bfec056eebfe7820d39e39fbe658be..9d8c5261b9ca4de5365b844f4d345937d0281303 100644 --- a/indra/llui/lltoggleablemenu.h +++ b/indra/llui/lltoggleablemenu.h @@ -49,8 +49,11 @@ class LLToggleableMenu : public LLMenuGL public: virtual void handleVisibilityChange (BOOL curVisibilityIn); + const LLRect& getButtonRect() const { return mButtonRect; } + // Converts the given local button rect to a screen rect void setButtonRect(const LLRect& rect, LLView* current_view); + void setButtonRect(LLView* current_view); // Returns "true" if menu was not closed by button click // and is not still visible. If menu is visible toggles diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index fe1c2ba67c0b0388e576d7685da1e1c1ee487fdc..959313a5b6660be7c8099a32b9b4b0534a41ae24 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -139,6 +139,10 @@ void LLToolTipView::drawStickyRect() { gl_rect_2d(LLToolTipMgr::instance().getMouseNearRect(), LLColor4::white, false); } + +// defaults for floater param block pulled from widgets/floater.xml +static LLWidgetNameRegistry::StaticRegistrar sRegisterInspectorParams(&typeid(LLInspector::Params), "inspector"); + // // LLToolTip // @@ -159,6 +163,7 @@ LLToolTip::Params::Params() visible_time_far("visible_time_far", LLUI::sSettingGroups["config"]->getF32( "ToolTipVisibleTimeFar" )), sticky_rect("sticky_rect"), image("image"), + text_color("text_color"), time_based_media("time_based_media", false), web_based_media("web_based_media", false), media_playing("media_playing", false) @@ -168,7 +173,6 @@ LLToolTip::Params::Params() LLToolTip::LLToolTip(const LLToolTip::Params& p) : LLPanel(p), - mMaxWidth(p.max_width), mHasClickCallback(p.click_callback.isProvided()), mPadding(p.padding), mTextBox(NULL), @@ -177,15 +181,13 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) mHomePageButton(NULL) { LLTextBox::Params params; - params.initial_value = "tip_text"; params.name = params.initial_value().asString(); // bake textbox padding into initial rect params.rect = LLRect (mPadding, mPadding + 1, mPadding + 1, mPadding); - params.follows.flags = FOLLOWS_ALL; params.h_pad = 0; params.v_pad = 0; params.mouse_opaque = false; - params.text_color = LLUIColorTable::instance().getColor( "ToolTipTextColor" ); + params.text_color = p.text_color; params.bg_visible = false; params.font = p.font; params.use_ellipses = true; @@ -206,7 +208,6 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16); icon_rect.setOriginAndSize(mPadding, mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE); icon_params.rect = icon_rect; - //icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM; icon_params.image_unselected(imagep); icon_params.image_selected(imagep); @@ -277,15 +278,30 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) } } -void LLToolTip::setValue(const LLSD& value) +void LLToolTip::initFromParams(const LLToolTip::Params& p) { + LLPanel::initFromParams(p); + + // do this *after* we've had our size set in LLPanel::initFromParams(); const S32 REALLY_LARGE_HEIGHT = 10000; - reshape(mMaxWidth, REALLY_LARGE_HEIGHT); + mTextBox->reshape(p.max_width, REALLY_LARGE_HEIGHT); - mTextBox->setValue(value); + if (p.styled_message.isProvided()) + { + for (LLInitParam::ParamIterator<LLToolTip::StyledText>::const_iterator text_it = p.styled_message().begin(); + text_it != p.styled_message().end(); + ++text_it) + { + mTextBox->appendText(text_it->text(), false, text_it->style); + } + } + else + { + mTextBox->setText(p.message()); + } LLRect text_contents_rect = mTextBox->getContentsRect(); - S32 text_width = llmin(mMaxWidth, text_contents_rect.getWidth()); + S32 text_width = llmin(p.max_width(), text_contents_rect.getWidth()); S32 text_height = text_contents_rect.getHeight(); mTextBox->reshape(text_width, text_height); @@ -296,7 +312,7 @@ void LLToolTip::setValue(const LLSD& value) tooltip_rect.mBottom = 0; tooltip_rect.mLeft = 0; - setRect(tooltip_rect); + setShape(tooltip_rect); } void LLToolTip::setVisible(BOOL visible) @@ -407,9 +423,8 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params) } tooltip_params.rect = LLRect (0, 1, 1, 0); - mToolTip = LLUICtrlFactory::create<LLToolTip> (tooltip_params); - mToolTip->setValue(params.message()); + gToolTipView->addChild(mToolTip); if (params.pos.isProvided()) diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 30d251266c0ff8e9b306803159cfc41d51391bf6..7978b6a583a0e36a7b6fcff1c1fd7d8dc935517c 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -37,6 +37,7 @@ #include "llsingleton.h" #include "llinitparam.h" #include "llpanel.h" +#include "llstyle.h" // // Classes @@ -65,11 +66,19 @@ class LLToolTipView : public LLView class LLToolTip : public LLPanel { public: + + struct StyledText : public LLInitParam::Block<StyledText> + { + Mandatory<std::string> text; + Optional<LLStyle::Params> style; + }; + struct Params : public LLInitParam::Block<Params, LLPanel::Params> { typedef boost::function<void(void)> click_callback_t; - Mandatory<std::string> message; + Optional<std::string> message; + Multiple<StyledText> styled_message; Optional<LLCoordGL> pos; Optional<F32> delay_time, @@ -79,14 +88,15 @@ class LLToolTip : public LLPanel Optional<LLRect> sticky_rect; Optional<const LLFontGL*> font; Optional<LLUIImage*> image; + Optional<LLUIColor> text_color; Optional<bool> time_based_media, web_based_media, media_playing; Optional<click_callback_t> click_callback, click_playmedia_callback, click_homepage_callback; - Optional<S32> max_width; - Optional<S32> padding; + Optional<S32> max_width, + padding; Optional<bool> wrap; Params(); @@ -94,7 +104,6 @@ class LLToolTip : public LLPanel /*virtual*/ void draw(); /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); - /*virtual*/ void setValue(const LLSD& value); /*virtual*/ void setVisible(BOOL visible); bool isFading(); @@ -102,6 +111,7 @@ class LLToolTip : public LLPanel bool hasClickCallback(); LLToolTip(const Params& p); + void initFromParams(const LLToolTip::Params& params); private: class LLTextBox* mTextBox; @@ -111,11 +121,16 @@ class LLToolTip : public LLPanel LLFrameTimer mFadeTimer; LLFrameTimer mVisibleTimer; - S32 mMaxWidth; bool mHasClickCallback; S32 mPadding; // pixels }; +// used for the inspector tooltips which need different background images etc. +class LLInspector : public LLToolTip +{ +public: + struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {}; +}; class LLToolTipMgr : public LLSingleton<LLToolTipMgr> { diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp index 851091f0ca2ecc64f57175b430d5f39f6a534bed..9be33483d0b0762d660122963057214d3f54941b 100644 --- a/indra/llui/lluicolortable.cpp +++ b/indra/llui/lluicolortable.cpp @@ -69,7 +69,14 @@ void LLUIColorTable::insertFromParams(const Params& p) ColorEntryParams color_entry = *it; if(color_entry.color.value.isChosen()) { - setColor(color_entry.name, color_entry.color.value, mLoadedColors); + 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); + } } else { @@ -185,19 +192,27 @@ void LLUIColorTable::clear() LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const { string_color_map_t::const_iterator iter = mUserSetColors.find(name); + if(iter != mUserSetColors.end()) { return LLUIColor(&iter->second); } iter = mLoadedColors.find(name); - return (iter != mLoadedColors.end() ? LLUIColor(&iter->second) : LLUIColor(default_color)); + + if(iter != mLoadedColors.end()) + { + return LLUIColor(&iter->second); + } + + return LLUIColor(default_color); } // update user color, loaded colors are parsed on initialization void LLUIColorTable::setColor(const std::string& name, const LLColor4& color) { setColor(name, color, mUserSetColors); + setColor(name, color, mLoadedColors); } bool LLUIColorTable::loadFromSettings() @@ -213,7 +228,7 @@ bool LLUIColorTable::loadFromSettings() result |= loadFromFilename(current_filename); } - std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml"); + std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml"); loadFromFilename(user_filename); return result; @@ -239,7 +254,7 @@ void LLUIColorTable::saveUserSettings() const if(!output_node->isNull()) { - const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml"); + const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml"); LLFILE *fp = LLFile::fopen(filename, "w"); if(fp != NULL) diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 08fc8fb7849203697e2e183446b80ba4709356bb..a30d5b4651d30daeede064016bf8e3404df5905d 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -78,7 +78,16 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel) mEnabledControlVariable(NULL), mDisabledControlVariable(NULL), mMakeVisibleControlVariable(NULL), - mMakeInvisibleControlVariable(NULL) + mMakeInvisibleControlVariable(NULL), + mCommitSignal(NULL), + mValidateSignal(NULL), + mMouseEnterSignal(NULL), + mMouseLeaveSignal(NULL), + mMouseDownSignal(NULL), + mMouseUpSignal(NULL), + mRightMouseDownSignal(NULL), + mRightMouseUpSignal(NULL), + mDoubleClickSignal(NULL) { mUICtrlHandle.bind(this); } @@ -129,10 +138,14 @@ void LLUICtrl::initFromParams(const Params& p) } if (p.commit_callback.isProvided()) - initCommitCallback(p.commit_callback, mCommitSignal); + { + setCommitCallback(initCommitCallback(p.commit_callback)); + } if (p.validate_callback.isProvided()) - initEnableCallback(p.validate_callback, mValidateSignal); + { + setValidateCallback(initEnableCallback(p.validate_callback)); + } if (p.init_callback.isProvided()) { @@ -151,10 +164,14 @@ void LLUICtrl::initFromParams(const Params& p) } if(p.mouseenter_callback.isProvided()) - initCommitCallback(p.mouseenter_callback, mMouseEnterSignal); + { + setMouseEnterCallback(initCommitCallback(p.mouseenter_callback)); + } if(p.mouseleave_callback.isProvided()) - initCommitCallback(p.mouseleave_callback, mMouseLeaveSignal); + { + setMouseLeaveCallback(initCommitCallback(p.mouseleave_callback)); + } } @@ -167,16 +184,40 @@ LLUICtrl::~LLUICtrl() llwarns << "UI Control holding top ctrl deleted: " << getName() << ". Top view removed." << llendl; gFocusMgr.removeTopCtrlWithoutCallback( this ); } + + delete mCommitSignal; + delete mValidateSignal; + delete mMouseEnterSignal; + delete mMouseLeaveSignal; + delete mMouseDownSignal; + delete mMouseUpSignal; + delete mRightMouseDownSignal; + delete mRightMouseUpSignal; + delete mDoubleClickSignal; } -void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig) +void default_commit_handler(LLUICtrl* ctrl, const LLSD& param) +{} + +bool default_enable_handler(LLUICtrl* ctrl, const LLSD& param) +{ + return true; +} + +bool default_visible_handler(LLUICtrl* ctrl, const LLSD& param) +{ + return true; +} + + +LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCallbackParam& cb) { if (cb.function.isProvided()) { if (cb.parameter.isProvided()) - sig.connect(boost::bind(cb.function(), _1, cb.parameter)); + return boost::bind(cb.function(), _1, cb.parameter); else - sig.connect(cb.function()); + return cb.function(); } else { @@ -185,26 +226,27 @@ void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t if (func) { if (cb.parameter.isProvided()) - sig.connect(boost::bind((*func), _1, cb.parameter)); + return boost::bind((*func), _1, cb.parameter); else - sig.connect(*func); + return commit_signal_t::slot_type(*func); } else if (!function_name.empty()) { llwarns << "No callback found for: '" << function_name << "' in control: " << getName() << llendl; } } + return default_commit_handler; } -void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig) +LLUICtrl::enable_signal_t::slot_type LLUICtrl::initEnableCallback(const EnableCallbackParam& cb) { // Set the callback function if (cb.function.isProvided()) { if (cb.parameter.isProvided()) - sig.connect(boost::bind(cb.function(), this, cb.parameter)); + return boost::bind(cb.function(), this, cb.parameter); else - sig.connect(cb.function()); + return cb.function(); } else { @@ -212,22 +254,23 @@ void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t if (func) { if (cb.parameter.isProvided()) - sig.connect(boost::bind((*func), this, cb.parameter)); + return boost::bind((*func), this, cb.parameter); else - sig.connect(*func); + return enable_signal_t::slot_type(*func); } } + return default_enable_handler; } -void LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig) +LLUICtrl::visible_signal_t::slot_type LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb) { // Set the callback function if (cb.function.isProvided()) { if (cb.parameter.isProvided()) - sig.connect(boost::bind(cb.function(), this, cb.parameter)); + return boost::bind(cb.function(), this, cb.parameter); else - sig.connect(cb.function()); + return cb.function(); } else { @@ -235,30 +278,40 @@ void LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb, visible_signa if (func) { if (cb.parameter.isProvided()) - sig.connect(boost::bind((*func), this, cb.parameter)); + return boost::bind((*func), this, cb.parameter); else - sig.connect(*func); + return visible_signal_t::slot_type(*func); } } + return default_visible_handler; } // virtual void LLUICtrl::onMouseEnter(S32 x, S32 y, MASK mask) { - mMouseEnterSignal(this, getValue()); + if (mMouseEnterSignal) + { + (*mMouseEnterSignal)(this, getValue()); + } } // virtual void LLUICtrl::onMouseLeave(S32 x, S32 y, MASK mask) { - mMouseLeaveSignal(this, getValue()); + if(mMouseLeaveSignal) + { + (*mMouseLeaveSignal)(this, getValue()); + } } //virtual BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = LLView::handleMouseDown(x,y,mask); - mMouseDownSignal(this,x,y,mask); + if (mMouseDownSignal) + { + (*mMouseDownSignal)(this,x,y,mask); + } return handled; } @@ -266,7 +319,10 @@ BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = LLView::handleMouseUp(x,y,mask); - mMouseUpSignal(this,x,y,mask); + if (mMouseUpSignal) + { + (*mMouseUpSignal)(this,x,y,mask); + } return handled; } @@ -274,7 +330,10 @@ BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask) BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = LLView::handleRightMouseDown(x,y,mask); - mRightMouseDownSignal(this,x,y,mask); + if (mRightMouseDownSignal) + { + (*mRightMouseDownSignal)(this,x,y,mask); + } return handled; } @@ -282,14 +341,20 @@ BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) BOOL LLUICtrl::handleRightMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = LLView::handleRightMouseUp(x,y,mask); - mRightMouseUpSignal(this,x,y,mask); + if(mRightMouseUpSignal) + { + (*mRightMouseUpSignal)(this,x,y,mask); + } return handled; } BOOL LLUICtrl::handleDoubleClick(S32 x, S32 y, MASK mask) { BOOL handled = LLView::handleDoubleClick(x, y, mask); - mDoubleClickSignal(this, x, y, mask); + if (mDoubleClickSignal) + { + (*mDoubleClickSignal)(this, x, y, mask); + } return handled; } @@ -302,7 +367,8 @@ BOOL LLUICtrl::canFocusChildren() const void LLUICtrl::onCommit() { - mCommitSignal(this, getValue()); + if (mCommitSignal) + (*mCommitSignal)(this, getValue()); } //virtual @@ -832,7 +898,8 @@ boost::signals2::connection LLUICtrl::setCommitCallback( boost::function<void (L } boost::signals2::connection LLUICtrl::setValidateBeforeCommit( boost::function<bool (const LLSD& data)> cb ) { - return mValidateSignal.connect(boost::bind(cb, _2)); + if (!mValidateSignal) mValidateSignal = new enable_signal_t(); + return mValidateSignal->connect(boost::bind(cb, _2)); } // virtual @@ -850,3 +917,57 @@ BOOL LLUICtrl::getTentative() const // virtual void LLUICtrl::setColor(const LLColor4& color) { } + +boost::signals2::connection LLUICtrl::setCommitCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mCommitSignal) mCommitSignal = new commit_signal_t(); + return mCommitSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setValidateCallback( const enable_signal_t::slot_type& cb ) +{ + if (!mValidateSignal) mValidateSignal = new enable_signal_t(); + return mValidateSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setMouseEnterCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mMouseEnterSignal) mMouseEnterSignal = new commit_signal_t(); + return mMouseEnterSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mMouseLeaveSignal) mMouseLeaveSignal = new commit_signal_t(); + return mMouseLeaveSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setMouseDownCallback( const mouse_signal_t::slot_type& cb ) +{ + if (!mMouseDownSignal) mMouseDownSignal = new mouse_signal_t(); + return mMouseDownSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setMouseUpCallback( const mouse_signal_t::slot_type& cb ) +{ + if (!mMouseUpSignal) mMouseUpSignal = new mouse_signal_t(); + return mMouseUpSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ) +{ + if (!mRightMouseDownSignal) mRightMouseDownSignal = new mouse_signal_t(); + return mRightMouseDownSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ) +{ + if (!mRightMouseUpSignal) mRightMouseUpSignal = new mouse_signal_t(); + return mRightMouseUpSignal->connect(cb); +} + +boost::signals2::connection LLUICtrl::setDoubleClickCallback( const mouse_signal_t::slot_type& cb ) +{ + if (!mDoubleClickSignal) mDoubleClickSignal = new mouse_signal_t(); + return mDoubleClickSignal->connect(cb); +} diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index dd22851100b0f3cf081ed5c32dee8266b1da76e9..aef1bcd5194341e7d545956f2b155628e63d6398 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -162,9 +162,9 @@ class LLUICtrl LLUICtrl(const Params& p = getDefaultParams(), const LLViewModelPtr& viewmodel=LLViewModelPtr(new LLViewModel)); - void initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig); - void initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig); - void initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig); + commit_signal_t::slot_type initCommitCallback(const CommitCallbackParam& cb); + enable_signal_t::slot_type initEnableCallback(const EnableCallbackParam& cb); + visible_signal_t::slot_type initVisibleCallback(const VisibleCallbackParam& cb); // We need this virtual so we can override it with derived versions virtual LLViewModel* getViewModel() const; @@ -254,18 +254,18 @@ class LLUICtrl // topic then put in help_topic_out bool findHelpTopic(std::string& help_topic_out); - boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb ) { return mCommitSignal.connect(cb); } - boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb ) { return mValidateSignal.connect(cb); } + boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb ); + boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb ); - boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mMouseEnterSignal.connect(cb); } - boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mMouseLeaveSignal.connect(cb); } + boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ); + boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ); - boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); } - boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); } - boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseDownSignal.connect(cb); } - boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseUpSignal.connect(cb); } + boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ); + boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb ); + boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ); + boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ); - boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb ) { return mDoubleClickSignal.connect(cb); } + boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb ); // *TODO: Deprecate; for backwards compatability only: boost::signals2::connection setCommitCallback( boost::function<void (LLUICtrl*,void*)> cb, void* data); @@ -293,18 +293,18 @@ class LLUICtrl static bool controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type); - commit_signal_t mCommitSignal; - enable_signal_t mValidateSignal; + commit_signal_t* mCommitSignal; + enable_signal_t* mValidateSignal; - commit_signal_t mMouseEnterSignal; - commit_signal_t mMouseLeaveSignal; + commit_signal_t* mMouseEnterSignal; + commit_signal_t* mMouseLeaveSignal; - mouse_signal_t mMouseDownSignal; - mouse_signal_t mMouseUpSignal; - mouse_signal_t mRightMouseDownSignal; - mouse_signal_t mRightMouseUpSignal; + mouse_signal_t* mMouseDownSignal; + mouse_signal_t* mMouseUpSignal; + mouse_signal_t* mRightMouseDownSignal; + mouse_signal_t* mRightMouseUpSignal; - mouse_signal_t mDoubleClickSignal; + mouse_signal_t* mDoubleClickSignal; LLViewModelPtr mViewModel; diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index c3c0daed0f4017cd770331d638e655c5246faad1..1c1450d7e9ff479001f4f9f9ffbf48687d60f855 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -433,8 +433,8 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag); // associate widget type with factory function LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type, creator_func); - LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type); //FIXME: comment this in when working on schema generation + //LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type); //LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &getEmptyParamBlock<T>); } @@ -449,3 +449,9 @@ const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_ty { return LLWidgetNameRegistry::instance().getValue(widget_type); } + +// static +void LLUICtrlFactory::connect(LLView* parent, LLView* child) +{ + parent->addChild(child); +} diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 0ccd3047f6c84d56fdcb3993a2d7927fbde4f90f..8a9c9e23c1d76a43d00a764894417b84d395d477 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -188,10 +188,15 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory> T* widget = new T(params); widget->initFromParams(params); if (parent) - parent->addChild(widget); + { + connect(parent, widget); + } return widget; } + // fix for gcc template instantiation annoyance + static void connect(LLView* parent, LLView* child); + LLView* createFromXML(LLXMLNodePtr node, LLView* parent, const std::string& filename, const widget_registry_t&, LLXMLNodePtr output_node ); template<typename T> diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index 6c1a32722f1140e2a34ca55214823b442fd0dc64..a8683e55c3597bfd6985f90ff2f29921957af629 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -142,6 +142,13 @@ namespace LLInitParam { LLUIImage* TypedParam<LLUIImage*>::getValueFromBlock() const { + // The keyword "none" is specifically requesting a null image + // do not default to current value. Used to overwrite template images. + if (name() == "none") + { + return NULL; + } + LLUIImage* imagep = LLUI::getUIImage(name()); if (!imagep) { diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index dae4b512d15ed2ed8f55d7a515c3a282d03169ea..b51709e2086fcdbbe5a13eeb9a9e81642b37db94 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -34,6 +34,7 @@ #include "linden_common.h" #include "llurlentry.h" #include "lluri.h" + #include "llcachename.h" #include "lltrans.h" #include "lluicolortable.h" @@ -383,6 +384,38 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa } } +// +// LLUrlEntryInventory Describes a Second Life inventory Url, e.g., +// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select +// +LLUrlEntryInventory::LLUrlEntryInventory() +{ + mPattern = boost::regex("secondlife:///app/inventory/[\\da-f-]+/\\w+", + boost::regex::perl|boost::regex::icase); + mMenuName = "menu_url_inventory.xml"; +} + +std::string LLUrlEntryInventory::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + return unescapeUrl(url); + // TODO: Figure out if we can somehow access the inventory from here to get the actual item name + /* + std::string inventory_id_string = getIDStringFromUrl(url); + if (inventory_id_string.empty()) + { + // something went wrong, give raw url + return unescapeUrl(url); + } + LLUUID inventory_id(inventory_id_string); + LLInventoryItem* item = gInventory.getItem(inventory_id); + if(!item) + { + return unescapeUrl(url); + } + return item->getName(); */ +} + + /// /// LLUrlEntryParcel Describes a Second Life parcel Url, e.g., /// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about @@ -512,50 +545,6 @@ std::string LLUrlEntryTeleport::getLocation(const std::string &url) const return ::getStringAfterToken(url, "app/teleport/"); } -/// -/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g., -/// secondlife:///app/objectim/<sessionid> -/// -LLUrlEntryObjectIM::LLUrlEntryObjectIM() -{ - mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\\??\\S*", - boost::regex::perl|boost::regex::icase); - mMenuName = "menu_url_objectim.xml"; - mTooltip = LLTrans::getString("TooltipObjectIMUrl"); -} - -std::string LLUrlEntryObjectIM::getLabel(const std::string &url, const LLUrlLabelCallback &cb) -{ - LLURI uri(url); - LLSD params = uri.queryMap(); - if (params.has("name")) - { - // look for a ?name=<obj-name> param in the url - // and use that as the label if present. - std::string name = params.get("name"); - LLStringUtil::trim(name); - if (name.empty()) - { - name = LLTrans::getString("Unnamed"); - } - return name; - } - - return unescapeUrl(url); -} - -std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const -{ - LLURI uri(url); - LLSD params = uri.queryMap(); - if (params.has("slurl")) - { - return params.get("slurl"); - } - - return ""; -} - // // LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts // with secondlife:// (used as a catch-all for cases not matched above) diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 4507572b1e1939d722eb6dbfd574d30534d9a08c..b3fb333fdd80f91c25fffdb9931a154c3bb6bbc6 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -173,6 +173,19 @@ class LLUrlEntryGroup : public LLUrlEntryBase const std::string& last, BOOL is_group); }; +/// +/// LLUrlEntryInventory Describes a Second Life inventory Url, e.g., +/// secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select +/// +class LLUrlEntryInventory : public LLUrlEntryBase +{ +public: + LLUrlEntryInventory(); + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +private: +}; + + /// /// LLUrlEntryParcel Describes a Second Life parcel Url, e.g., /// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about @@ -208,18 +221,6 @@ class LLUrlEntryTeleport : public LLUrlEntryBase /*virtual*/ std::string getLocation(const std::string &url) const; }; -/// -/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g., -/// secondlife:///app/objectim/<sessionid>?name=Foo -/// -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; -}; - /// /// LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts /// with secondlife:// (used as a catch-all for cases not matched above) diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 60275b60bc23d86a7cb6aac7625b898074adb210..b2f084e5acb80756f445573bee037d51d50364bd 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -52,10 +52,10 @@ LLUrlRegistry::LLUrlRegistry() registerUrl(new LLUrlEntryParcel()); registerUrl(new LLUrlEntryTeleport()); registerUrl(new LLUrlEntryWorldMap()); - registerUrl(new LLUrlEntryObjectIM()); registerUrl(new LLUrlEntryPlace()); registerUrl(new LLUrlEntrySL()); registerUrl(new LLUrlEntrySLLabel()); + registerUrl(new LLUrlEntryInventory()); } LLUrlRegistry::~LLUrlRegistry() diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 96e5a1b7ca24c707934a4b2c4693c1321d8c1260..af9a30cb257b3d93a4b332be11e75b468a6aaa1f 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -522,7 +522,6 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits if (mTSMDocument) { ActivateTSMDocument(mTSMDocument); - UseInputWindow(mTSMDocument, FALSE); allowLanguageTextInput(NULL, FALSE); } } @@ -3317,6 +3316,8 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b) return; } + UseInputWindow(mTSMDocument, !b); + // Take care of old and new preeditors. if (preeditor != mPreeditor || !b) { diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 318a0348a2aec14e5b06b545f034939dbb52498f..4c050844f86691e41deacade72d0b56027ee2332 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -46,7 +46,7 @@ namespace LLInitParam { const U8* my_addr = reinterpret_cast<const U8*>(this); const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block); - mEnclosingBlockOffset = (S16)(block_addr - my_addr); + mEnclosingBlockOffset = (U16)(my_addr - block_addr); } // diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 9fb464ca7b9c4809a16233c4089009389401a2ad..493ddaa3785d118543035b876dd2f0d77d017415 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -300,14 +300,14 @@ namespace LLInitParam const U8* my_addr = reinterpret_cast<const U8*>(this); // get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class return *const_cast<BaseBlock*>( - reinterpret_cast<const BaseBlock*>(my_addr + (ptrdiff_t)mEnclosingBlockOffset)); + reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset)); } private: friend class BaseBlock; bool mIsProvided; - S16 mEnclosingBlockOffset; + U16 mEnclosingBlockOffset; }; // various callbacks and constraints associated with an individual param diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 8c891b3e8ff911fe1f3b6d592b338ac247aee7d0..8fe9f5ed29c1f9752addde37f2b8f3fd5c2c4d42 100644 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -613,6 +613,7 @@ extern "C" { int yyerror(const char *fmt, ...); } "CLICK_ACTION_OPEN" { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); } "CLICK_ACTION_PLAY" { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); } "CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); } +"CLICK_ACTION_ZOOM" { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); } "TEXTURE_BLANK" { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "5748decc-f629-461c-9a36-a35a221fe21f"); return(STRING_CONSTANT); } "TEXTURE_DEFAULT" { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "89556747-24cb-43ed-920b-47caed15465f"); return(STRING_CONSTANT); } diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt index 1d6494fecff6f1d201f2813f066c83fe393261f4..420e836e3689b5af3c7a2fc79a0de3ce4b19090e 100644 --- a/indra/mac_crash_logger/CMakeLists.txt +++ b/indra/mac_crash_logger/CMakeLists.txt @@ -75,7 +75,6 @@ add_custom_command( ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib ) -ll_deploy_sharedlibs_command( - mac-crash-logger - "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}" - "../Resources") +ll_deploy_sharedlibs_command(mac-crash-logger) + + diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt index d7bd6f993ce0e3a0c46bf1496267165c178786f9..57d426aa24d9779d867bb821cc42759374519f11 100644 --- a/indra/mac_updater/CMakeLists.txt +++ b/indra/mac_updater/CMakeLists.txt @@ -77,7 +77,4 @@ add_custom_command( ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib ) -ll_deploy_sharedlibs_command( - mac-updater - "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}" - "../Resources") +ll_deploy_sharedlibs_command(mac-updater) diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index de927de1cd6ef6c44f1805fa9a02c5bf9967ce65..236f79978de800301c175a15163e841d6203dd8c 100644 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -528,11 +528,17 @@ class MediaPluginQuickTime : public MediaPluginBase if ( ! mMovieController ) return; - // service QuickTime - // Calling it this way doesn't have good behavior on Windows... -// MoviesTask( mMovieHandle, milliseconds ); - // This was the original, but I think using both MoviesTask and MCIdle is redundant. Trying with only MCIdle. -// MoviesTask( mMovieHandle, 0 ); + // this wasn't required in 1.xx viewer but we have to manually + // work the Windows message pump now + #if defined( LL_WINDOWS ) + MSG msg; + while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) + { + GetMessage( &msg, NULL, 0, 0 ); + TranslateMessage( &msg ); + DispatchMessage( &msg ); + }; + #endif MCIdle( mMovieController ); @@ -712,18 +718,24 @@ class MediaPluginQuickTime : public MediaPluginBase // find the size of the title ByteCount size; result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size ); - if ( noErr != result || size <= 0 ) + if ( noErr != result || size <= 0 /*|| size > 1024 FIXME: arbitrary limit */ ) return false; // allocate some space and grab it - UInt8* item_data = new UInt8( size ); - memset( item_data, 0, size * sizeof( UInt8* ) ); + UInt8* item_data = new UInt8( size + 1 ); + memset( item_data, 0, ( size + 1 ) * sizeof( UInt8* ) ); result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL ); if ( noErr != result ) + { + delete [] item_data; return false; + }; // save it - mMovieTitle = std::string( (char* )item_data ); + if ( strlen( (char*)item_data ) ) + mMovieTitle = std::string( (char* )item_data ); + else + mMovieTitle = ""; // clean up delete [] item_data; diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 3ce8ff3deb826ed775d623fc2a187ac058e0725f..09348782a45c6a1a2fde17b4d158dbd02465db90 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -74,8 +74,17 @@ class MediaPluginWebKit : private: + enum + { + INIT_STATE_UNINITIALIZED, // Browser instance hasn't been set up 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 + INIT_STATE_RUNNING // All initialization gymnastics are complete. + }; int mBrowserWindowId; - bool mBrowserInitialized; + int mInitState; + std::string mInitialNavigateURL; bool mNeedsUpdate; bool mCanCut; @@ -93,7 +102,17 @@ class MediaPluginWebKit : checkEditState(); - if ( mNeedsUpdate ) + if(mInitState == INIT_STATE_NAVIGATE_COMPLETE) + { + if(!mInitialNavigateURL.empty()) + { + // We already have the initial navigate URL -- kick off the navigate. + LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mInitialNavigateURL ); + mInitialNavigateURL.clear(); + } + } + + if ( (mInitState == INIT_STATE_RUNNING) && mNeedsUpdate ) { const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId ); @@ -123,7 +142,7 @@ class MediaPluginWebKit : bool initBrowser() { // already initialized - if ( mBrowserInitialized ) + if ( mInitState > INIT_STATE_UNINITIALIZED ) return true; // not enough information to initialize the browser yet. @@ -210,20 +229,21 @@ class MediaPluginWebKit : // set background color to be black - mostly for initial login page LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, 0x00, 0x00, 0x00 ); + // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns. + mInitState = 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. LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); - // set flag so we don't do this again - mBrowserInitialized = true; - return true; }; return false; }; + //////////////////////////////////////////////////////////////////////////////// // virtual void onCursorChanged(const EventType& event) @@ -263,6 +283,11 @@ class MediaPluginWebKit : // virtual void onPageChanged( const EventType& event ) { + if(mInitState == INIT_STATE_WAIT_REDRAW) + { + mInitState = INIT_STATE_RUNNING; + } + // flag that an update is required mNeedsUpdate = true; }; @@ -271,62 +296,91 @@ class MediaPluginWebKit : // virtual void onNavigateBegin(const EventType& event) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin"); - message.setValue("uri", event.getEventUri()); - sendMessage(message); + if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin"); + message.setValue("uri", event.getEventUri()); + sendMessage(message); + + setStatus(STATUS_LOADING); + } - setStatus(STATUS_LOADING); + if(mInitState == INIT_STATE_NAVIGATE_COMPLETE) + { + mInitState = INIT_STATE_WAIT_REDRAW; + } + } //////////////////////////////////////////////////////////////////////////////// // virtual void onNavigateComplete(const EventType& event) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete"); - message.setValue("uri", event.getEventUri()); - message.setValueS32("result_code", event.getIntValue()); - message.setValue("result_string", event.getStringValue()); - message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK)); - message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD)); - sendMessage(message); - - setStatus(STATUS_LOADED); + if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete"); + message.setValue("uri", event.getEventUri()); + message.setValueS32("result_code", event.getIntValue()); + message.setValue("result_string", event.getStringValue()); + message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK)); + message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD)); + sendMessage(message); + + setStatus(STATUS_LOADED); + } + else if(mInitState == INIT_STATE_NAVIGATING) + { + mInitState = INIT_STATE_NAVIGATE_COMPLETE; + } + } //////////////////////////////////////////////////////////////////////////////// // virtual void onUpdateProgress(const EventType& event) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress"); - message.setValueS32("percent", event.getIntValue()); - sendMessage(message); + if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress"); + message.setValueS32("percent", event.getIntValue()); + sendMessage(message); + } } //////////////////////////////////////////////////////////////////////////////// // virtual void onStatusTextChange(const EventType& event) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text"); - message.setValue("status", event.getStringValue()); - sendMessage(message); + if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text"); + message.setValue("status", event.getStringValue()); + sendMessage(message); + } } //////////////////////////////////////////////////////////////////////////////// // virtual void onTitleChange(const EventType& event) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text"); - message.setValue("name", event.getStringValue()); - sendMessage(message); + if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text"); + message.setValue("name", event.getStringValue()); + sendMessage(message); + } } //////////////////////////////////////////////////////////////////////////////// // virtual void onLocationChange(const EventType& event) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed"); - message.setValue("uri", event.getEventUri()); - sendMessage(message); + if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed"); + message.setValue("uri", event.getEventUri()); + sendMessage(message); + } } //////////////////////////////////////////////////////////////////////////////// @@ -488,7 +542,7 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_ // std::cerr << "MediaPluginWebKit constructor" << std::endl; mBrowserWindowId = 0; - mBrowserInitialized = false; + mInitState = INIT_STATE_UNINITIALIZED; mNeedsUpdate = true; mCanCut = false; mCanCopy = false; @@ -674,7 +728,14 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) if(!uri.empty()) { - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri ); + if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE) + { + LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri ); + } + else + { + mInitialNavigateURL = uri; + } } } else if(message_name == "mouse_event") diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 649d86aaa68642121d287dd8bff8359eb99dff7b..e632cbaaf2a148a265b79c0954f190f28faf90db 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -185,7 +185,7 @@ set(viewer_SOURCE_FILES llfloatermediasettings.cpp llfloatermemleak.cpp llfloaternamedesc.cpp - llfloaternearbymedia.cpp + llfloaternearbymedia.cpp llfloaternotificationsconsole.cpp llfloateropenobject.cpp llfloaterparcel.cpp @@ -239,6 +239,7 @@ set(viewer_SOURCE_FILES llhudtext.cpp llhudview.cpp llimfloater.cpp + llimfloatercontainer.cpp llimhandler.cpp llimpanel.cpp llimview.cpp @@ -246,11 +247,13 @@ set(viewer_SOURCE_FILES llinspectavatar.cpp llinspectgroup.cpp llinspectobject.cpp + llinspectremoteobject.cpp llinventorybridge.cpp llinventoryclipboard.cpp llinventoryfilter.cpp llinventoryfunctions.cpp llinventorymodel.cpp + llinventoryobserver.cpp llinventorypanel.cpp llinventorysubtreepanel.cpp lljoystickbutton.cpp @@ -295,8 +298,6 @@ set(viewer_SOURCE_FILES llnotify.cpp lloutputmonitorctrl.cpp lloverlaybar.cpp - llpanelappearance.cpp - llpanelappearancetab.cpp llpanelavatar.cpp llpanelavatarrow.cpp llpanelavatartag.cpp @@ -320,14 +321,14 @@ set(viewer_SOURCE_FILES llpanellandmedia.cpp llpanellogin.cpp llpanellookinfo.cpp - llpanellooks.cpp llpanelmaininventory.cpp llpanelmediasettingsgeneral.cpp llpanelmediasettingspermissions.cpp llpanelmediasettingssecurity.cpp - llpanelmeprofile.cpp + llpanelme.cpp llpanelobject.cpp llpanelobjectinventory.cpp + llpaneloutfitsinventory.cpp llpanelpeople.cpp llpanelpeoplemenus.cpp llpanelpermissions.cpp @@ -364,10 +365,12 @@ set(viewer_SOURCE_FILES llremoteparcelrequest.cpp llsavedsettingsglue.cpp llscreenchannel.cpp + llscriptfloater.cpp llscrollingpanelparam.cpp llsearchcombobox.cpp llsearchhistory.cpp llselectmgr.cpp + llsidepanelappearance.cpp llsidepanelinventory.cpp llsidepanelinventorysubpanel.cpp llsidepaneliteminfo.cpp @@ -445,6 +448,7 @@ set(viewer_SOURCE_FILES llviewerassettype.cpp llvieweraudio.cpp llviewercamera.cpp + llviewerchat.cpp llviewercontrol.cpp llviewercontrollistener.cpp llviewerdisplay.cpp @@ -681,7 +685,7 @@ set(viewer_HEADER_FILES llfloatermediasettings.h llfloatermemleak.h llfloaternamedesc.h - llfloaternearbymedia.h + llfloaternearbymedia.h llfloaternotificationsconsole.h llfloateropenobject.h llfloaterparcel.h @@ -735,17 +739,20 @@ set(viewer_HEADER_FILES llhudtext.h llhudview.h llimfloater.h + llimfloatercontainer.h llimpanel.h llimview.h llinspect.h llinspectavatar.h llinspectgroup.h llinspectobject.h + llinspectremoteobject.h llinventorybridge.h llinventoryclipboard.h llinventoryfilter.h llinventoryfunctions.h llinventorymodel.h + llinventoryobserver.h llinventorypanel.h llinventorysubtreepanel.h lljoystickbutton.h @@ -787,8 +794,6 @@ set(viewer_HEADER_FILES llnotify.h lloutputmonitorctrl.h lloverlaybar.h - llpanelappearance.h - llpanelappearancetab.h llpanelavatar.h llpanelavatarrow.h llpanelavatartag.h @@ -812,14 +817,14 @@ set(viewer_HEADER_FILES llpanellandmedia.h llpanellogin.h llpanellookinfo.h - llpanellooks.h llpanelmaininventory.h llpanelmediasettingsgeneral.h llpanelmediasettingspermissions.h llpanelmediasettingssecurity.h - llpanelmeprofile.h + llpanelme.h llpanelobject.h llpanelobjectinventory.h + llpaneloutfitsinventory.h llpanelpeople.h llpanelpeoplemenus.h llpanelpermissions.h @@ -858,10 +863,12 @@ set(viewer_HEADER_FILES llrootview.h llsavedsettingsglue.h llscreenchannel.h + llscriptfloater.h llscrollingpanelparam.h llsearchcombobox.h llsearchhistory.h llselectmgr.h + llsidepanelappearance.h llsidepanelinventory.h llsidepanelinventorysubpanel.h llsidepaneliteminfo.h @@ -942,6 +949,7 @@ set(viewer_HEADER_FILES llvieweraudio.h llviewerbuild.h llviewercamera.h + llviewerchat.h llviewercontrol.h llviewercontrollistener.h llviewerdisplay.h @@ -1168,7 +1176,7 @@ if (WINDOWS) if (NOT STANDALONE) list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) - endif (NOT STANDALONE) + endif (NOT STANDALONE) find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR}) find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR}) @@ -1350,7 +1358,7 @@ file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py) list(APPEND EVENT_HOST_SCRIPTS ${EVENT_HOST_SCRIPT_GLOB_LIST}) -set(PACKAGE OFF CACHE BOOL +set(PACKAGE ON CACHE BOOL "Add a package target that builds an installer package.") if (WINDOWS) @@ -1372,14 +1380,14 @@ if (WINDOWS) # sets the 'working directory' for debugging from visual studio. if (NOT UNATTENDED) add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe ARGS --solution ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln --workingdir ${VIEWER_BINARY_NAME} - ${CMAKE_CURRENT_SOURCE_DIR} + "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." ) endif (NOT UNATTENDED) @@ -1396,85 +1404,87 @@ if (WINDOWS) ) add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml - COMMENT "Copying message.xml to the runtime folder." - ) + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml + COMMENT "Copying message.xml to the runtime folder." + ) - if(WINDOWS) - # Copy Win Libs... - # This happens at build time, not config time. We can't glob files in this cmake. - # *FIX:Mani Write a sub script to glob the files... - # *FIX:Mani Use actually dependencies rather than bulk copy. - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_directory - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying staged dlls." - ) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --actions=copy + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --configuration=${CMAKE_CFG_INTDIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + --grid=${GRID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + COMMENT "Performing viewer_manifest copy" + ) - add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon) - if(LLKDU_LIBRARY) - # kdu may not exist! - add_dependencies(${VIEWER_BINARY_NAME} llkdu) - endif(LLKDU_LIBRARY) - endif(WINDOWS) + add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon) + + if(LLKDU_LIBRARY) + # kdu may not exist! + add_dependencies(${VIEWER_BINARY_NAME} llkdu) + endif(LLKDU_LIBRARY) if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) - add_custom_command( + add_dependencies(${VIEWER_BINARY_NAME} + SLPlugin + media_plugin_quicktime + media_plugin_webkit + windows-updater + windows-crash-logger + ) + + if (PACKAGE) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py + ${CMAKE_CURRENT_SOURCE_DIR}/.. + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CFG_INTDIR} + DEPENDS + lleventhost + ${EVENT_HOST_SCRIPTS} + ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py + ) + + add_custom_command( OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --configuration=${CMAKE_CFG_INTDIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} + --configuration=${CMAKE_CFG_INTDIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} --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} - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) - - if (PACKAGE) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py - ${CMAKE_CURRENT_SOURCE_DIR}/.. - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CFG_INTDIR} - - DEPENDS - lleventhost - ${EVENT_HOST_SCRIPTS} - ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py) - - add_custom_target(package ALL - DEPENDS - ${CMAKE_CFG_INTDIR}/touched.bat) - # temporarily disable packaging of event_host until hg subrepos get - # sorted out on the parabuild cluster... - #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) - add_dependencies(package windows-updater windows-crash-logger) - + add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat) + # temporarily disable packaging of event_host until hg subrepos get + # sorted out on the parabuild cluster... + #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) endif (PACKAGE) endif (WINDOWS) @@ -1537,15 +1547,16 @@ if (LINUX) COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --installer_name=${product} --arch=${ARCH} - --source=${CMAKE_CURRENT_SOURCE_DIR} --artwork=${ARTWORK_DIR} --build=${CMAKE_CURRENT_BINARY_DIR} + --channel=${VIEWER_CHANNEL} + --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged + --grid=${GRID} + --installer_name=${product} + --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 ) @@ -1580,13 +1591,13 @@ if (DARWIN) COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} --actions=copy - --configuration=${CMAKE_CFG_INTDIR} - --source=${CMAKE_CURRENT_SOURCE_DIR} --artwork=${ARTWORK_DIR} --build=${CMAKE_CURRENT_BINARY_DIR} + --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --grid=${GRID} + --source=${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 5f6fd6e4a735564967a27766decc543bd1f58a50..14025c8061ce00d9f349904ceb9d9411abc1f4b3 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -510,6 +510,7 @@ CLICK_ACTION_PAY Used with llSetClickAction to set pay as the default act CLICK_ACTION_OPEN Used with llSetClickAction to set open as the default action when object is clicked CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default action when object is clicked CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked +CLICK_ACTION_ZOOM Used with llSetClickAction to set zoom in as the default action when object is clicked TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid. TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid. diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index d7bb64ce8a7787b39abc4bf24ebfc954571cdfdb..ec80d2d01409e30623e1836297058caa475837eb 100644 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml @@ -34,6 +34,7 @@ </array> <key>classes</key> <array> + <string>LLBottomTray</string> </array> <key>files</key> <array> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 55ff255c38e82a6ddb4f2ca2d8584d645c5ccfed..075aee46c757dcf97169c568eebb228c978b1b46 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1132,7 +1132,7 @@ <key>Type</key> <string>U32</string> <key>Value</key> - <integer>500</integer> + <integer>512</integer> </map> <key>CacheValidateCounter</key> <map> @@ -3563,7 +3563,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>400</integer> + <integer>305</integer> </map> <key>HelpUseLocal</key> <map> @@ -3585,7 +3585,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://docs.lindenlab.com/help/helpfloater.php?topic=[TOPIC]&channel=[CHANNEL]&version=[VERSION]&os=[OS]&language=[LANGUAGE]&version_major=[VERSION_MAJOR]&version_minor=[VERSION_MINOR]&version_patch=[VERSION_PATCH]&version_build=[VERSION_BUILD]</string> + <string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC]</string> </map> <key>HighResSnapshot</key> <map> @@ -3620,7 +3620,7 @@ <key>Value</key> <string /> </map> - <key>IMInChatConsole</key> + <key>IMInChat</key> <map> <key>Comment</key> <string>Copy IM into chat console</string> @@ -3629,17 +3629,6 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> - </map> - <key>IMInChatHistory</key> - <map> - <key>Comment</key> - <string>Copy IM into chat history</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> <integer>0</integer> </map> <key>IMShowTimestamps</key> @@ -4259,7 +4248,29 @@ <key>Value</key> <integer>0</integer> </map> - <key>LogMessages</key> + <key>LoginSRVTimeout</key> + <map> + <key>Comment</key> + <string>Duration in seconds of the login SRV request timeout</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>10.0</real> + </map> + <key>LoginSRVPump</key> + <map> + <key>Comment</key> + <string>Name of the message pump that handles SRV request</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>LLAres</string> + </map> + <key>LogMessages</key> <map> <key>Comment</key> <string>Log network traffic</string> @@ -4523,6 +4534,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>MediaPerformanceManagerDebug</key> + <map> + <key>Comment</key> + <string>Whether to show debug data for the media performance manager in the nearby media list.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>MemoryLogFrequency</key> <map> <key>Comment</key> @@ -4895,7 +4917,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>350</integer> + <integer>305</integer> </map> <key>NotificationToastLifeTime</key> <map> @@ -5327,6 +5349,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>PluginAttachDebuggerToPlugins</key> + <map> + <key>Comment</key> + <string>If true, attach a debugger session to each plugin process as it's launched.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>PluginInstancesCPULimit</key> <map> <key>Comment</key> @@ -5336,8 +5369,21 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>0.0</real> + <real>1.0</real> </map> + + <key>PlainTextChatHistory</key> + <map> + <key>Comment</key> + <string>Enable/Disable plain text chat history style</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>PluginInstancesLow</key> <map> <key>Comment</key> @@ -5352,24 +5398,24 @@ <key>PluginInstancesNormal</key> <map> <key>Comment</key> - <string>Limit on the number of inworld media plugins that will run at "normal" priority</string> + <string>Limit on the number of inworld media plugins that will run at "normal" or higher priority</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>U32</string> <key>Value</key> - <integer>4</integer> + <integer>2</integer> </map> <key>PluginInstancesTotal</key> <map> <key>Comment</key> - <string>Hard limit on the number of plugins that will be instantiated at once</string> + <string>Hard limit on the number of plugins that will be instantiated at once for inworld media</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>U32</string> <key>Value</key> - <integer>16</integer> + <integer>8</integer> </map> <key>PrecachingDelay</key> <map> @@ -5490,7 +5536,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>QAMode</key> <map> @@ -6271,7 +6317,7 @@ <real>1.0</real> </map> - <key>RenderHighlightEnable</key> + <key>RenderHoverGlowEnable</key> <map> <key>Comment</key> <string>Show glow effect when hovering on interactive objects.</string> @@ -6280,7 +6326,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>RenderHighlightFadeTime</key> @@ -7676,10 +7722,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>ShowCoordinatesOption</key> + <key>NavBarShowCoordinates</key> <map> <key>Comment</key> - <string>Show Coordinates in Location Input Field</string> + <string>Show coordinates in navigation bar</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -7687,6 +7733,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>NavBarShowParcelProperties</key> + <map> + <key>Comment</key> + <string>Show parcel property icons in navigation bar</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> @@ -9601,116 +9658,6 @@ <key>Value</key> <string>00000000-0000-0000-0000-000000000000</string> </map> - <key>UISndPieMenuAppear</key> - <map> - <key>Comment</key> - <string>Sound file for opening pie menu (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>8eaed61f-92ff-6485-de83-4dcc938a478e</string> - </map> - <key>UISndPieMenuHide</key> - <map> - <key>Comment</key> - <string>Sound file for closing pie menu (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>00000000-0000-0000-0000-000000000000</string> - </map> - <key>UISndPieMenuSliceHighlight0</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 0 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>d9f73cf8-17b4-6f7a-1565-7951226c305d</string> - </map> - <key>UISndPieMenuSliceHighlight1</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 1 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>f6ba9816-dcaf-f755-7b67-51b31b6233e5</string> - </map> - <key>UISndPieMenuSliceHighlight2</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 2 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>7aff2265-d05b-8b72-63c7-dbf96dc2f21f</string> - </map> - <key>UISndPieMenuSliceHighlight3</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 3 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>09b2184e-8601-44e2-afbb-ce37434b8ba1</string> - </map> - <key>UISndPieMenuSliceHighlight4</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 4 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>bbe4c7fc-7044-b05e-7b89-36924a67593c</string> - </map> - <key>UISndPieMenuSliceHighlight5</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 5 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>d166039b-b4f5-c2ec-4911-c85c727b016c</string> - </map> - <key>UISndPieMenuSliceHighlight6</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 6 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>242af82b-43c2-9a3b-e108-3b0c7e384981</string> - </map> - <key>UISndPieMenuSliceHighlight7</key> - <map> - <key>Comment</key> - <string>Sound file for selecting pie menu item 7 (uuid for sound asset)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>c1f334fb-a5be-8fe7-22b3-29631c21cf0b</string> - </map> <key>UISndSnapshot</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 893e7acd7ad3a6d90cba6d28b89748ccc5ea8192..af5fa4f3889de03748bbba5536dfec1f9f291273 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -22,17 +22,6 @@ <key>Value</key> <string>|TOKEN COPY BusyModeResponse|</string> </map> - <key>IMLogOptions</key> - <map> - <key>Comment</key> - <string>Log options for Instant Messages</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>2</integer> - </map> <key>InstantMessageLogFolder</key> <map> <key>Comment</key> @@ -75,18 +64,7 @@ <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>LogTimestamp</key> <map> @@ -97,7 +75,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>LogInstantMessages</key> <map> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 10c197d09eb71c6cf3303ee372802d6f78a661d2..d7182dfaab2fd036bf59392490f8f5087f4a26ce 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="US-ASCII" standalone="yes"?> <linden_avatar - version="1.0" wearable_definition_version="24"> + version="1.0" wearable_definition_version="22"> <!-- The wearable_definition_version is checked during asset upload. --> <!-- If you increment it, check indra/lib/python/indra/assetutil.py. --> <skeleton diff --git a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt index 30f9349111d117a99d4af183bfb11607286239b0..185c0180fbb9c3468de11947bed9278f697d3720 100644 --- a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt +++ b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt @@ -1,6 +1,6 @@ -The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE. - -This is the format required for NSIS Unicode. See http://www.scratchpaper.com/ for details. - -James Cook -September 2008 +The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE. + +This is the format required for NSIS Unicode. See http://www.scratchpaper.com/ for details. + +James Cook +September 2008 diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 3209654498c49792d0c8e2ed5454467e4316f510..f84102e1fbe1a3af090a4339e4e65875e771d7e0 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -118,7 +118,7 @@ if [ -n "$LL_TCMALLOC" ]; then fi fi -export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"' +export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"' export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin' export SL_OPT="`cat etc/gridargs.dat` $@" diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 24bdf66c2a15d040747b0cdba540f2d3baabaa4f..eb5d172ff7d7689f534d98d82f5f132a978f4db2 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -31,83 +31,54 @@ */ #include "llviewerprecompiledheaders.h" - #include "llagent.h" -#include "llagentwearables.h" + +#include "pipeline.h" #include "llagentlistener.h" +#include "llagentwearables.h" +#include "llagentui.h" + #include "llanimationstates.h" +#include "llbottomtray.h" #include "llcallingcard.h" +#include "llchannelmanager.h" #include "llconsole.h" -#include "lldrawable.h" #include "llfirstuse.h" -#include "llfloaterreg.h" -#include "llspeakers.h" #include "llfloatercamera.h" #include "llfloatercustomize.h" - -#include "llfloaterland.h" -#include "llfloatersnapshot.h" +#include "llfloaterreg.h" #include "llfloatertools.h" -#include "llfloaterworldmap.h" - #include "llgroupactions.h" - -#include "llfocusmgr.h" #include "llgroupmgr.h" #include "llhomelocationresponder.h" -#include "llimview.h" #include "llhudmanager.h" #include "lljoystickbutton.h" -#include "llmenugl.h" #include "llmorphview.h" #include "llmoveview.h" +#include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state +#include "llnearbychatbar.h" #include "llparcel.h" -#include "llquantize.h" -#include "llrand.h" -#include "llregionhandle.h" #include "llsdutil.h" -#include "llselectmgr.h" +#include "llsidetray.h" #include "llsky.h" -#include "llslurl.h" #include "llsmoothstep.h" -#include "llsidetray.h" #include "llstatusbar.h" -#include "llteleportflags.h" -#include "llteleporthistory.h" -#include "lltexturestats.h" -#include "lltexturestats.h" #include "lltool.h" -#include "lltoolcomp.h" #include "lltoolmgr.h" -#include "lluictrlfactory.h" -#include "llurldispatcher.h" - -#include "llviewercamera.h" +#include "lltrans.h" +#include "llviewercontrol.h" #include "llviewerdisplay.h" +#include "llviewerjoystick.h" #include "llviewermediafocus.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewerstats.h" -#include "llviewerwindow.h" -#include "llviewercontrol.h" -#include "llviewerjoystick.h" - #include "llvoavatarself.h" #include "llwindow.h" #include "llworld.h" #include "llworldmap.h" -#include "pipeline.h" -#include "lltrans.h" -#include "llbottomtray.h" -#include "llnearbychatbar.h" -#include "stringize.h" -#include "llcapabilitylistener.h" - -#include "llnavigationbar.h" //to show/hide navigation bar when changing mouse look state -#include "llagentui.h" - using namespace LLVOAvatarDefines; extern LLMenuBarGL* gMenuBarView; @@ -2166,6 +2137,7 @@ void LLAgent::setBusy() { gBusyMenu->setLabel(LLTrans::getString("AvatarSetNotBusy")); } + LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(true); } //----------------------------------------------------------------------------- @@ -2179,6 +2151,7 @@ void LLAgent::clearBusy() { gBusyMenu->setLabel(LLTrans::getString("AvatarSetBusy")); } + LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(false); } //----------------------------------------------------------------------------- @@ -2619,9 +2592,9 @@ void LLAgent::updateLookAt(const S32 mouse_x, const S32 mouse_y) { // range from -.5 to .5 F32 x_from_center = - ((F32) mouse_x / (F32) gViewerWindow->getWindowWidth() ) - 0.5f; + ((F32) mouse_x / (F32) gViewerWindow->getWindowWidthScaled() ) - 0.5f; F32 y_from_center = - ((F32) mouse_y / (F32) gViewerWindow->getWindowHeight() ) - 0.5f; + ((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); @@ -2822,7 +2795,8 @@ void LLAgent::endAnimationUpdateUI() LLBottomTray::getInstance()->setVisible(TRUE); - LLSideTray::getInstance()->setVisible(TRUE); + LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE); + LLSideTray::getInstance()->updateSidetrayVisibility(); LLPanelStandStopFlying::getInstance()->setVisible(TRUE); @@ -2837,7 +2811,11 @@ void LLAgent::endAnimationUpdateUI() LLFloaterReg::restoreVisibleInstances(); #else // Use this for now LLFloaterView::skip_list_t skip_list; - skip_list.insert(LLFloaterReg::findInstance("mini_map")); + if (LLFloaterReg::findInstance("mini_map")) + { + skip_list.insert(LLFloaterReg::findInstance("mini_map")); + } + gFloaterView->popVisibleAll(skip_list); #endif mViewsPushed = FALSE; @@ -2916,7 +2894,8 @@ void LLAgent::endAnimationUpdateUI() LLBottomTray::getInstance()->setVisible(FALSE); - LLSideTray::getInstance()->setVisible(FALSE); + LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE); + LLSideTray::getInstance()->updateSidetrayVisibility(); LLPanelStandStopFlying::getInstance()->setVisible(FALSE); @@ -3080,10 +3059,6 @@ void LLAgent::updateCamera() mOrbitLeftKey > 0.f, // right mOrbitDownKey > 0.f); // bottom - camera_floater->mZoom->setToggleState( - mOrbitInKey > 0.f, // top - mOrbitOutKey > 0.f); // bottom - camera_floater->mTrack->setToggleState( mPanLeftKey > 0.f, // left mPanUpKey > 0.f, // top @@ -3436,11 +3411,11 @@ F32 LLAgent::calcCustomizeAvatarUIOffset( const LLVector3d& camera_pos_global ) 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->getWindowWidth())))); + 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->getWindowWidth() - rect.mRight) ) + if( rect.mLeft < (gViewerWindow->getWindowWidthScaled() - rect.mRight) ) { // Move the avatar to the right (camera to the left) ui_offset = offset; @@ -6357,7 +6332,7 @@ void LLAgent::sendAgentSetAppearance() msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index); } msg->nextBlockFast(_PREHASH_ObjectData); - mAvatarObject->packTEMessage( gMessageSystem ); + mAvatarObject->sendAppearanceMessage( gMessageSystem ); } else { diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 99a9bdd8e636ec13c49e7b09999dd4e7f93b3387..4162dfce1e51649dca3cce315a4f40c5e79fd169 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -36,14 +36,13 @@ #include "indra_constants.h" #include "llevent.h" // LLObservable base class #include "llagentaccess.h" -#include "llagentaccess.h" #include "llagentconstants.h" -#include "llhudeffectpointat.h" // ELookAtType -#include "llhudeffectlookat.h" // EPointAtType -#include "llpointer.h" +#include "llagentdata.h" // gAgentID, gAgentSessionID #include "llcharacter.h" // LLAnimPauseRequest #include "llfollowcam.h" // Ventrella -#include "llagentdata.h" // gAgentID, gAgentSessionID +#include "llhudeffectlookat.h" // EPointAtType +#include "llhudeffectpointat.h" // ELookAtType +#include "llpointer.h" #include "lluicolor.h" #include "llvoavatardefines.h" diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index 0f00078b33ca0eef6e58e501774e1030fbfd6d13..b3ed7c353ed577a9fc2b75015dc77ec26264a31c 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -22,12 +22,20 @@ #include "llviewerregion.h" LLAgentListener::LLAgentListener(LLAgent &agent) - : LLDispatchListener("LLAgent", "op"), + : LLEventAPI("LLAgent", + "LLAgent listener to (e.g.) teleport, sit, stand, etc."), mAgent(agent) { - add("requestTeleport", &LLAgentListener::requestTeleport); - add("requestSit", &LLAgentListener::requestSit); - add("requestStand", &LLAgentListener::requestStand); + add("requestTeleport", + "Teleport: [\"regionname\"], [\"x\"], [\"y\"], [\"z\"]\n" + "If [\"skip_confirmation\"] is true, use LLURLDispatcher rather than LLCommandDispatcher.", + &LLAgentListener::requestTeleport); + add("requestSit", + "Ask to sit on the object specified in [\"obj_uuid\"]", + &LLAgentListener::requestSit); + add("requestStand", + "Ask to stand up", + &LLAgentListener::requestStand); } void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -40,7 +48,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const params.append(event_data["y"]); params.append(event_data["z"]); LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true); - // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "objectim", "parcel", "login", login_refresh", "balance", "chat" + // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat" // should we just compose LLCommandHandler and LLDispatchListener? } else diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index 6f0b5a54c5f0efd54b8bd116437b00779ae63879..eed6922b3e2e6b1a3b283c047ac4a7e8b94b9d17 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -13,12 +13,12 @@ #ifndef LL_LLAGENTLISTENER_H #define LL_LLAGENTLISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" class LLAgent; class LLSD; -class LLAgentListener : public LLDispatchListener +class LLAgentListener : public LLEventAPI { public: LLAgentListener(LLAgent &agent); diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 2911a35581b86944901167a2e26bb4eeea0dbec5..7404fe5bc4726b0324cec3686ba3d6d4f15a6d8d 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -130,6 +130,7 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const // create a default name and description for the landmark std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName(); std::string region_name = region->getName(); + std::string sim_access_string = region->getSimAccessString(); std::string buffer; if( parcel_name.empty() ) { @@ -142,7 +143,13 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const case LOCATION_FORMAT_NORMAL: buffer = llformat("%s", region_name.c_str()); break; - case LOCATION_FORMAT_WITHOUT_SIM: + case LOCATION_FORMAT_NO_COORDS: + buffer = llformat("%s%s%s", + region_name.c_str(), + sim_access_string.empty() ? "" : " - ", + 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(), @@ -159,19 +166,25 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const buffer = llformat("%.100s", parcel_name.c_str()); break; case LOCATION_FORMAT_NORMAL: - buffer = llformat("%s, %s", region_name.c_str(), parcel_name.c_str()); + buffer = llformat("%s, %s", parcel_name.c_str(), region_name.c_str()); break; - case LOCATION_FORMAT_WITHOUT_SIM: + case LOCATION_FORMAT_NO_MATURITY: buffer = llformat("%s, %s (%d, %d, %d)", - region_name.c_str(), parcel_name.c_str(), + region_name.c_str(), pos_x, pos_y, pos_z); break; + case LOCATION_FORMAT_NO_COORDS: + buffer = llformat("%s, %s%s%s", + parcel_name.c_str(), + region_name.c_str(), + sim_access_string.empty() ? "" : " - ", + sim_access_string.c_str()); + break; case LOCATION_FORMAT_FULL: - std::string sim_access_string = region->getSimAccessString(); buffer = llformat("%s, %s (%d, %d, %d)%s%s", - region_name.c_str(), parcel_name.c_str(), + region_name.c_str(), pos_x, pos_y, pos_z, sim_access_string.empty() ? "" : " - ", sim_access_string.c_str()); diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h index c7aafb71e7b9db4f8b1c4c64c245963a37284df6..3478793e38f3f198c5e4af2ca5b24a6892d03c8b 100644 --- a/indra/newview/llagentui.h +++ b/indra/newview/llagentui.h @@ -38,10 +38,11 @@ class LLAgentUI public: enum ELocationFormat { - LOCATION_FORMAT_NORMAL, - LOCATION_FORMAT_LANDMARK, - LOCATION_FORMAT_WITHOUT_SIM, - LOCATION_FORMAT_FULL, + LOCATION_FORMAT_NORMAL, // Parcel + LOCATION_FORMAT_LANDMARK, // Parcel, Region + LOCATION_FORMAT_NO_MATURITY, // Parcel, Region (x, y, z) + LOCATION_FORMAT_NO_COORDS, // Parcel, Region - Maturity + LOCATION_FORMAT_FULL, // Parcel, Region (x, y, z) - Maturity }; static void buildName(std::string& name); diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 3fc1055acdff14aab3b7da7110e21068cb7a6768..538dcb6f3dff2c2bbac908687fb40d3d88dc426e 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -35,10 +35,11 @@ #include "llagent.h" #include "llagentwearables.h" +#include "llcallbacklist.h" #include "llfloatercustomize.h" #include "llfloaterinventory.h" #include "llinventorybridge.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llnotify.h" #include "llviewerregion.h" @@ -61,7 +62,7 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver { public: LLInitialWearablesFetch() {} - ~LLInitialWearablesFetch() {} + ~LLInitialWearablesFetch(); virtual void done(); struct InitialWearableData @@ -82,6 +83,27 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver protected: void processWearablesMessage(); + void processContents(); +}; + +class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver +{ +public: + enum ELibraryOutfitFetchStep { + LOFS_FOLDER = 0, + LOFS_OUTFITS, + LOFS_CONTENTS + }; + LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) {} + ~LLLibraryOutfitsFetch() {} + virtual void done(); +protected: + void folderDone(void); + void outfitsDone(void); + void contentsDone(void); + enum ELibraryOutfitFetchStep mCurrFetchStep; + std::vector< std::pair< LLUUID, std::string > > mOutfits; + bool mOutfitsPopulated; }; LLAgentWearables gAgentWearables; @@ -631,11 +653,13 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index) void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable) { - if (!getWearable(type,index)) + LLWearable *old_wearable = getWearable(type,index); + if (!old_wearable) { pushWearable(type,wearable); return; } + wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); if (wearable_iter == mWearableDatas.end()) { @@ -650,6 +674,7 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab else { wearable_vec[index] = wearable; + old_wearable->setLabelUpdated(); mAvatarObject->wearableUpdated(wearable->getType()); } } @@ -666,6 +691,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl { mWearableDatas[type].push_back(wearable); mAvatarObject->wearableUpdated(wearable->getType()); + wearable->setLabelUpdated(); return mWearableDatas[type].size()-1; } return MAX_WEARABLES_PER_TYPE; @@ -695,6 +721,7 @@ void LLAgentWearables::popWearable(const EWearableType type, U32 index) { mWearableDatas[type].erase(mWearableDatas[type].begin() + index); mAvatarObject->wearableUpdated(wearable->getType()); + wearable->setLabelUpdated(); } } @@ -887,9 +914,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs lldebugs << " " << LLWearableDictionary::getTypeLabel(type) << 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. + // 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); @@ -904,6 +930,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs // will call done for us when everything is here. gInventory.addObserver(outfit); } + + gAgentWearables.populateMyOutfitsFolder(); } } @@ -1262,7 +1290,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) LLFolderType::FT_OUTFIT, new_folder_name); - LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL); + LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL); #if 0 // BAP - fix to go into rename state automatically after outfit is created. LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id); @@ -1389,14 +1417,10 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem for (S32 i=max_entry; i>=0; i--) { LLWearable* old_wearable = getWearable(type,i); - const LLUUID &item_id = getWearableItemID(type,i); - popWearable(type,i); - gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); - LLAppearanceManager::removeItemLinks(item_id,false); - //queryWearableCache(); // moved below if (old_wearable) { + popWearable(old_wearable); old_wearable->removeFromAvatar(TRUE); } } @@ -1405,16 +1429,11 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem else { LLWearable* old_wearable = getWearable(type, index); - - const LLUUID &item_id = getWearableItemID(type,index); - popWearable(type, index); - gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); - LLAppearanceManager::removeItemLinks(item_id,false); - //queryWearableCache(); // moved below if (old_wearable) { + popWearable(old_wearable); old_wearable->removeFromAvatar(TRUE); } } @@ -1476,7 +1495,6 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it continue; } - gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id); // Assumes existing wearables are not dirty. if (old_wearable->isDirty()) { @@ -1485,9 +1503,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it } } - 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; @@ -1985,14 +2003,14 @@ bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const return !(((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES)) && (getWearableCount(type) <= 1) ); } -void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL set_by_user) +void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake) { for( S32 type = 0; type < WT_COUNT; ++type ) { for (S32 count = 0; count < (S32)getWearableCount((EWearableType)type); ++count) { LLWearable *wearable = getWearable((EWearableType)type,count); - wearable->animateParams(delta, set_by_user); + wearable->animateParams(delta, upload_bake); } } } @@ -2003,11 +2021,155 @@ void LLAgentWearables::updateServer() gAgent.sendAgentSetAppearance(); } +void LLAgentWearables::populateMyOutfitsFolder(void) +{ + LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(); + + // 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. + LLInventoryFetchDescendentsObserver::folder_ref_t folders; + const LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + + folders.push_back(my_outfits_id); + outfits->fetchDescendents(folders); + if(outfits->isEverythingComplete()) + { + // everything is already here - call done. + outfits->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(outfits); + } +} + +void LLLibraryOutfitsFetch::done() +{ + switch (mCurrFetchStep){ + case LOFS_FOLDER: + mCurrFetchStep = LOFS_OUTFITS; + folderDone(); + break; + case LOFS_OUTFITS: + mCurrFetchStep = LOFS_CONTENTS; + outfitsDone(); + break; + case LOFS_CONTENTS: + // No longer need this observer hanging around. + gInventory.removeObserver(this); + contentsDone(); + break; + default: + gInventory.removeObserver(this); + delete this; + return; + } + if (mOutfitsPopulated) + { + delete this; + } +} + +void LLLibraryOutfitsFetch::folderDone(void) +{ + // Early out if we already have items in My Outfits. + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH); + if (cat_array.count() > 0 || wearable_array.count() > 0) + { + mOutfitsPopulated = true; + gInventory.removeObserver(this); + return; + } + + // Get the UUID of the library's clothing folder + const LLUUID library_clothing_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true); + + mCompleteFolders.clear(); + + // 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. + LLInventoryFetchDescendentsObserver::folder_ref_t folders; + folders.push_back(library_clothing_id); + fetchDescendents(folders); + if(isEverythingComplete()) + { + // everything is already here - call done. + outfitsDone(); + } +} + +void LLLibraryOutfitsFetch::outfitsDone(void) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH); + + LLInventoryFetchDescendentsObserver::folder_ref_t folders; + for(S32 i = 0; i < cat_array.count(); ++i) + { + if (cat_array.get(i)->getName() != "More Outfits" && cat_array.get(i)->getName() != "Ruth"){ + folders.push_back(cat_array.get(i)->getUUID()); + mOutfits.push_back( std::make_pair(cat_array.get(i)->getUUID(), cat_array.get(i)->getName() )); + } + } + mCompleteFolders.clear(); + fetchDescendents(folders); + if(isEverythingComplete()) + { + // everything is already here - call done. + contentsDone(); + } +} + +void LLLibraryOutfitsFetch::contentsDone(void) +{ + for(S32 i = 0; i < (S32)mOutfits.size(); ++i) + { + // 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, + mOutfits[i].second); + + LLAppearanceManager::getInstance()->shallowCopyCategory(mOutfits[i].first, folder_id, NULL); + gInventory.notifyObservers(); + } + 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() +{ + llinfos << "~LLInitialWearablesFetch" << llendl; +} + +// virtual void LLInitialWearablesFetch::done() { - // No longer need this observer hanging around. + // 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)); +} +void LLInitialWearablesFetch::processContents() +{ // Fetch the wearable items from the Current Outfit Folder LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t wearable_array; @@ -2015,7 +2177,7 @@ void LLInitialWearablesFetch::done() gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array, LLInventoryModel::EXCLUDE_TRASH, is_wearable); - LLAppearanceManager::setAttachmentInvLinkEnable(true); + LLAppearanceManager::instance().setAttachmentInvLinkEnable(true); if (wearable_array.count() > 0) { LLAppearanceManager::instance().updateAppearanceFromCOF(); @@ -2023,6 +2185,8 @@ void LLInitialWearablesFetch::done() else { processWearablesMessage(); + // Create links for attachments that may have arrived before the COF existed. + LLAppearanceManager::instance().linkRegisteredAttachments(); } delete this; } diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 317f4a7e4fbc512759bb850d7097da16bafd1c96..8f3a16501e12b11e3398e7b54c9c779665041eaa 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -80,7 +80,7 @@ class LLAgentWearables // 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 set_by_user); + void animateAllWearableParams(F32 delta, BOOL upload_bake); //-------------------------------------------------------------------- // Accessors @@ -169,9 +169,11 @@ class LLAgentWearables const LLDynamicArray<S32>& attachments_to_include, BOOL rename_clothing); - // Note: wearables_to_include should be a list of EWearableType types - // attachments_to_include should be a list of attachment points 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); private: void makeNewOutfitDone(S32 type, U32 index); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index d14de1c3012440f061c797e203f66e240e53b861..1050deaa27df13aecf4258ee9cba6356c6dd36c7 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -32,18 +32,20 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" +#include "llagentwearables.h" #include "llappearancemgr.h" -#include "llinventorymodel.h" -#include "llnotifications.h" +#include "llfloatercustomize.h" #include "llgesturemgr.h" #include "llinventorybridge.h" -#include "llwearablelist.h" -#include "llagentwearables.h" -#include "llagent.h" +#include "llinventoryobserver.h" +#include "llnotifications.h" +#include "llsidepanelappearance.h" +#include "llsidetray.h" #include "llvoavatar.h" #include "llvoavatarself.h" #include "llviewerregion.h" -#include "llfloatercustomize.h" +#include "llwearablelist.h" class LLWearInventoryCategoryCallback : public LLInventoryCallback { @@ -72,7 +74,7 @@ class LLWearInventoryCategoryCallback : public LLInventoryCallback // If the inventory callback manager goes away, we're shutting down, no longer want the callback. if( LLInventoryCallbackManager::is_instantiated() ) { - LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); + LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); } else { @@ -94,7 +96,8 @@ class LLOutfitObserver : public LLInventoryFetchObserver mAppend(append) {} ~LLOutfitObserver() {} - virtual void done(); //public + virtual void done(); + void doWearCategory(); protected: LLUUID mCatID; @@ -103,6 +106,12 @@ class LLOutfitObserver : public LLInventoryFetchObserver }; void LLOutfitObserver::done() +{ + gInventory.removeObserver(this); + doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this)); +} + +void LLOutfitObserver::doWearCategory() { // We now have an outfit ready to be copied to agent inventory. Do // it, and wear that outfit normally. @@ -171,8 +180,9 @@ void LLOutfitObserver::done() else { // Wear the inventory category. - LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); + LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); } + delete this; } class LLOutfitFetch : public LLInventoryFetchDescendentsObserver @@ -220,7 +230,6 @@ void LLOutfitFetch::done() // loop. //dec_busy_count(); gInventory.removeObserver(this); - delete this; // increment busy count and either tell the inventory to check & // call done, or add this object to the inventory for observation. @@ -239,6 +248,7 @@ void LLOutfitFetch::done() // will call done for us when everything is here. gInventory.addObserver(outfit_observer); } + delete this; } class LLUpdateAppearanceOnDestroy: public LLInventoryCallback @@ -251,7 +261,7 @@ class LLUpdateAppearanceOnDestroy: public LLInventoryCallback virtual ~LLUpdateAppearanceOnDestroy() { - LLAppearanceManager::updateAppearanceFromCOF(); + LLAppearanceManager::instance().updateAppearanceFromCOF(); } /* virtual */ void fire(const LLUUID& inv_item) @@ -296,7 +306,7 @@ struct LLWearableHoldingPattern bool append; }; -/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items) +static void removeDuplicateItems(LLInventoryModel::item_array_t& items) { LLInventoryModel::item_array_t new_items; std::set<LLUUID> items_seen; @@ -323,175 +333,73 @@ struct LLWearableHoldingPattern items = new_items; } -void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src) +static void onWearableAssetFetch(LLWearable* wearable, void* data) { - LLInventoryModel::item_array_t new_dst; - std::set<LLUUID> mark_inventory; - - S32 inventory_dups = 0; + LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; + bool append = holder->append; - for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin(); - src_pos != src.end(); - ++src_pos) - { - LLUUID src_item_id = (*src_pos)->getLinkedUUID(); - mark_inventory.insert(src_item_id); - } - - for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin(); - dst_pos != dst.end(); - ++dst_pos) + if(wearable) { - LLUUID dst_item_id = (*dst_pos)->getLinkedUUID(); - - if (mark_inventory.find(dst_item_id) == mark_inventory.end()) - { - // Item is not already present in COF. - new_dst.put(*dst_pos); - mark_inventory.insert(dst_item_id); - } - else + for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); + iter != holder->mFoundList.end(); ++iter) { - inventory_dups++; + LLFoundData* data = *iter; + if(wearable->getAssetID() == data->mAssetID) + { + data->mWearable = wearable; + break; + } } } - llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count() - << " inventory dups " << inventory_dups << llendl; - - dst = new_dst; + holder->mResolved += 1; + if(holder->mResolved >= (S32)holder->mFoundList.size()) + { + LLAppearanceManager::instance().updateAgentWearables(holder, append); + } } -/* static */ LLUUID LLAppearanceManager::getCOF() { return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); } -// Update appearance from outfit folder. -/* static */ -void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append) -{ - if (!proceed) - return; -#if 1 - updateCOF(category,append); -#else - if (append) - { - updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF. - } - else +const LLViewerInventoryItem* LLAppearanceManager::getCurrentOutfitLink() +{ + const LLUUID& current_outfit_cat = getCOF(); + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + // Can't search on FT_OUTFIT since links to categories return FT_CATEGORY for type since they don't + // return preferred type. + LLIsType is_category( LLAssetType::AT_CATEGORY ); + gInventory.collectDescendentsIf(current_outfit_cat, + cat_array, + item_array, + false, + is_category, + false); + for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin(); + iter != item_array.end(); + iter++) { - LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp->getPreferredType() == LLFolderType::FT_NONE || - LLFolderType::lookupIsEnsembleType(catp->getPreferredType())) - { - updateCOFFromCategory(category, append); // append is false - rebuild COF. - } - else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT) + const LLViewerInventoryItem *item = (*iter); + const LLViewerInventoryCategory *cat = item->getLinkedCategory(); + if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) { - rebuildCOFFromOutfit(category); + return item; } } -#endif + return NULL; } -// Append to current COF contents by recursively traversing a folder. -/* static */ -void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append) +// Update appearance from outfit folder. +void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append) { - // BAP consolidate into one "get all 3 types of descendents" function, use both places. - LLInventoryModel::item_array_t wear_items; - LLInventoryModel::item_array_t obj_items; - LLInventoryModel::item_array_t gest_items; - bool follow_folder_links = false; - getUserDescendents(category, wear_items, obj_items, gest_items, follow_folder_links); - - // Find all the wearables that are in the category's subtree. - lldebugs << "appendCOFFromCategory()" << llendl; - if( !wear_items.count() && !obj_items.count() && !gest_items.count()) - { - LLNotifications::instance().add("CouldNotPutOnOutfit"); + if (!proceed) return; - } - - const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); - // Processes that take time should show the busy cursor - //inc_busy_count(); - - LLInventoryModel::cat_array_t cof_cats; - LLInventoryModel::item_array_t cof_items; - gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items, - LLInventoryModel::EXCLUDE_TRASH); - // Remove duplicates - if (append) - { - removeDuplicateItems(wear_items, cof_items); - removeDuplicateItems(obj_items, cof_items); - removeDuplicateItems(gest_items, cof_items); - } - - S32 total_links = gest_items.count() + wear_items.count() + obj_items.count(); - - if (!append && total_links > 0) - { - purgeCOFBeforeRebuild(category); - } - - LLPointer<LLUpdateAppearanceOnDestroy> link_waiter = new LLUpdateAppearanceOnDestroy; - - // Link all gestures in this folder - if (gest_items.count() > 0) - { - llinfos << "Linking " << gest_items.count() << " gestures" << llendl; - for (S32 i = 0; i < gest_items.count(); ++i) - { - const LLInventoryItem* gest_item = gest_items.get(i).get(); - link_inventory_item(gAgent.getID(), gest_item->getLinkedUUID(), current_outfit_id, - gest_item->getName(), - LLAssetType::AT_LINK, link_waiter); - } - } - - // Link all wearables - if(wear_items.count() > 0) - { - llinfos << "Linking " << wear_items.count() << " wearables" << llendl; - for(S32 i = 0; i < wear_items.count(); ++i) - { - // Populate the current outfit folder with links to the newly added wearables - const LLInventoryItem* wear_item = wear_items.get(i).get(); - link_inventory_item(gAgent.getID(), - wear_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. - current_outfit_id, - wear_item->getName(), - LLAssetType::AT_LINK, - link_waiter); - } - } - - // Link all attachments. - if( obj_items.count() > 0 ) - { - llinfos << "Linking " << obj_items.count() << " attachments" << llendl; - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if( avatar ) - { - for(S32 i = 0; i < obj_items.count(); ++i) - { - const LLInventoryItem* obj_item = obj_items.get(i).get(); - link_inventory_item(gAgent.getID(), - obj_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. - current_outfit_id, - obj_item->getName(), - LLAssetType::AT_LINK, link_waiter); - } - } - } + LLAppearanceManager::instance().updateCOF(category,append); } -/* static */ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, LLPointer<LLInventoryCallback> cb) { @@ -535,7 +443,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID } } } -/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) + +void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; @@ -552,7 +461,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID // Keep the last N wearables of each type. For viewer 2.0, N is 1 for // both body parts and clothing items. -/* static */ void LLAppearanceManager::filterWearableItems( +void LLAppearanceManager::filterWearableItems( LLInventoryModel::item_array_t& items, S32 max_per_type) { // Divvy items into arrays by wearable type. @@ -583,9 +492,9 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID } // Create links to all listed items. -/* static */ void LLAppearanceManager::linkAll(const LLUUID& category, - LLInventoryModel::item_array_t& items, - LLPointer<LLInventoryCallback> cb) +void LLAppearanceManager::linkAll(const LLUUID& category, + LLInventoryModel::item_array_t& items, + LLPointer<LLInventoryCallback> cb) { for (S32 i=0; i<items.count(); i++) { @@ -599,7 +508,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID } } -/* static */ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) +void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) { const LLUUID cof = getCOF(); @@ -651,150 +560,30 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID linkAll(cof, gest_items, link_waiter); // Add link to outfit if category is an outfit. - LLViewerInventoryCategory* catp = gInventory.getCategory(category); + const LLViewerInventoryCategory* catp = gInventory.getCategory(category); + LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); + if (!append && catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) { link_inventory_item(gAgent.getID(), category, cof, catp->getName(), LLAssetType::AT_LINK_FOLDER, link_waiter); - } - -} - -/* static */ -bool LLAppearanceManager::isMandatoryWearableType(EWearableType type) -{ - return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES); -} - -// For mandatory body parts. -/* static */ -void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found) -{ - LLInventoryModel::cat_array_t new_cats; - LLInventoryModel::item_array_t new_items; - gInventory.collectDescendents(category, new_cats, new_items, - LLInventoryModel::EXCLUDE_TRASH); - std::set<EWearableType> wt_types_found; - for (S32 i = 0; i < new_items.count(); ++i) - { - LLViewerInventoryItem *itemp = new_items.get(i); - if (itemp->isWearableType()) - { - EWearableType type = itemp->getWearableType(); - if (isMandatoryWearableType(type)) - { - types_found.insert(type); - } - } - } -} -// Remove everything from the COF that we safely can before replacing -// with contents of new category. This means preserving any mandatory -// body parts that aren't present in the new category, and getting rid -// of everything else. -/* static */ -void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category) -{ - // See which mandatory body types are present in the new category. - std::set<EWearableType> wt_types_found; - checkMandatoryWearableTypes(category,wt_types_found); - - LLInventoryModel::cat_array_t cof_cats; - LLInventoryModel::item_array_t cof_items; - gInventory.collectDescendents(getCOF(), cof_cats, cof_items, - LLInventoryModel::EXCLUDE_TRASH); - for (S32 i = 0; i < cof_items.count(); ++i) - { - LLViewerInventoryItem *itemp = cof_items.get(i); - if (itemp->isWearableType()) + // Update the current outfit name of the appearance sidepanel. + if (panel_appearance) { - EWearableType type = itemp->getWearableType(); - if (!isMandatoryWearableType(type) || (wt_types_found.find(type) != wt_types_found.end())) - { - // Not mandatory or supplied by the new category - OK to delete - gInventory.purgeObject(cof_items.get(i)->getUUID()); - } + panel_appearance->refreshCurrentOutfitName(catp->getName()); } - else - { - // Not a wearable - always purge - gInventory.purgeObject(cof_items.get(i)->getUUID()); - } - } - gInventory.notifyObservers(); -} - -// Replace COF contents from a given outfit folder. -/* static */ -void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) -{ - lldebugs << "rebuildCOFFromOutfit()" << llendl; - - dumpCat(category,"start, source outfit"); - dumpCat(getCOF(),"start, COF"); - - // Find all the wearables that are in the category's subtree. - LLInventoryModel::item_array_t items; - getCOFValidDescendents(category, items); - - if( items.count() == 0) - { - LLNotifications::instance().add("CouldNotPutOnOutfit"); - return; - } - - // Processes that take time should show the busy cursor - //inc_busy_count(); - - //dumpCat(current_outfit_id,"COF before remove:"); - - //dumpCat(current_outfit_id,"COF after remove:"); - - purgeCOFBeforeRebuild(category); - - LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; - LLUUID current_outfit_id = getCOF(); - LLAppearanceManager::shallowCopyCategory(category, current_outfit_id, link_waiter); - - //dumpCat(current_outfit_id,"COF after shallow copy:"); - - // Create a link to the outfit that we wore. - LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) - { - link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), - LLAssetType::AT_LINK_FOLDER, link_waiter); } -} - -/* static */ -void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data) -{ - LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; - bool append = holder->append; - - if(wearable) + else { - for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); - iter != holder->mFoundList.end(); ++iter) + // Update the current outfit name of the appearance sidepanel. + if (panel_appearance) { - LLFoundData* data = *iter; - if(wearable->getAssetID() == data->mAssetID) - { - data->mWearable = wearable; - break; - } + panel_appearance->refreshCurrentOutfitName(); } } - holder->mResolved += 1; - if(holder->mResolved >= (S32)holder->mFoundList.size()) - { - LLAppearanceManager::updateAgentWearables(holder, append); - } } -/* static */ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append) { lldebugs << "updateAgentWearables()" << llendl; @@ -827,7 +616,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, if(wearables.count() > 0) { gAgentWearables.setWearableOutfit(items, wearables, !append); - gInventory.notifyObservers(); } delete holder; @@ -835,7 +623,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, // dec_busy_count(); } -/* static */ void LLAppearanceManager::updateAppearanceFromCOF() { dumpCat(getCOF(),"COF, start"); @@ -903,7 +690,7 @@ void LLAppearanceManager::updateAppearanceFromCOF() LLWearableList::instance().getAsset(found->mAssetID, found->mName, found->mAssetType, - LLAppearanceManager::onWearableAssetFetch, + onWearableAssetFetch, (void*)holder); } } @@ -916,22 +703,6 @@ void LLAppearanceManager::updateAppearanceFromCOF() } } -/* static */ -void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category, - LLInventoryModel::item_array_t& items) -{ - LLInventoryModel::cat_array_t cats; - LLFindCOFValidItems is_cof_valid; - bool follow_folder_links = false; - gInventory.collectDescendentsIf(category, - cats, - items, - LLInventoryModel::EXCLUDE_TRASH, - is_cof_valid, - follow_folder_links); -} - -/* static */ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, LLInventoryModel::item_array_t& items, LLAssetType::EType type, @@ -947,7 +718,6 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, follow_folder_links); } -/* static */ void LLAppearanceManager::getUserDescendents(const LLUUID& category, LLInventoryModel::item_array_t& wear_items, LLInventoryModel::item_array_t& obj_items, @@ -1011,7 +781,6 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b } // *NOTE: hack to get from avatar inventory to avatar -/* static */ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append ) { // Avoid unintentionally overwriting old wearables. We have to do @@ -1023,7 +792,9 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca if( gFloaterCustomize ) { - gFloaterCustomize->askToSaveIfDirty(boost::bind(LLAppearanceManager::changeOutfit, _1, category->getUUID(), append)); + gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit, + &LLAppearanceManager::instance(), + _1, category->getUUID(), append)); } else { @@ -1031,7 +802,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca } } -/* static */ void LLAppearanceManager::wearOutfitByName(const std::string& name) { llinfos << "Wearing category " << name << llendl; @@ -1084,16 +854,24 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor return (a->isWearableType() && b->isWearableType() && (a->getWearableType() == b->getWearableType())); } -/* static */ -void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) + +void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update ) { - LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item); + const LLInventoryItem *item = gInventory.getItem(item_id); + addCOFItemLink(item); +} + +void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update ) +{ + const LLViewerInventoryItem *vitem = dynamic_cast<const LLViewerInventoryItem*>(item); if (!vitem) { llwarns << "not an llviewerinventoryitem, failed" << llendl; return; } - + + gInventory.addChangedMask(LLInventoryObserver::LABEL, vitem->getLinkedUUID()); + LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; gInventory.collectDescendents(LLAppearanceManager::getCOF(), @@ -1105,7 +883,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) { // Are these links to the same object? const LLViewerInventoryItem* inv_item = item_array.get(i).get(); - if (inv_item->getLinkedUUID() == item->getLinkedUUID()) + if (inv_item->getLinkedUUID() == vitem->getLinkedUUID()) { linked_already = true; } @@ -1116,13 +894,13 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) { gAgentWearables.removeWearable(inv_item->getWearableType(),true,0); gInventory.purgeObject(inv_item->getUUID()); - gInventory.notifyObservers(); } } if (linked_already) { if (do_update) LLAppearanceManager::updateAppearanceFromCOF(); + return; } else { @@ -1134,10 +912,10 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) LLAssetType::AT_LINK, cb); } + return; } -/* static */ -void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update ) +void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update ) { #if SUPPORT_ENSEMBLES // BAP add check for already in COF. @@ -1151,9 +929,10 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update #endif } -/* static */ -void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update) +void LLAppearanceManager::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(), @@ -1165,7 +944,8 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update) const LLInventoryItem* item = item_array.get(i).get(); if (item->getLinkedUUID() == item_id) { - gInventory.purgeObject(item_array.get(i)->getUUID()); + const LLUUID& item_id = item_array.get(i)->getUUID(); + gInventory.purgeObject(item_id); } } if (do_update) @@ -1176,7 +956,6 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update) //#define DUMP_CAT_VERBOSE -/* static */ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) { LLInventoryModel::cat_array_t cats; @@ -1198,7 +977,6 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) llinfos << msg << " count " << items.count() << llendl; } -/* static */ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg) { @@ -1211,15 +989,19 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it llinfos << llendl; } +LLAppearanceManager::LLAppearanceManager(): + mAttachmentInvLinkEnabled(false) +{ +} -std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments; -bool LLAppearanceManager::sAttachmentInvLinkEnabled(false); +LLAppearanceManager::~LLAppearanceManager() +{ +} -/* static */ void LLAppearanceManager::setAttachmentInvLinkEnable(bool val) { llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl; - sAttachmentInvLinkEnabled = val; + mAttachmentInvLinkEnabled = val; } void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) @@ -1239,22 +1021,16 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) llinfos << llendl; } -/* static */ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) { - sRegisteredAttachments.insert(item_id); - //dumpAttachmentSet(sRegisteredAttachments,"after register:"); + mRegisteredAttachments.insert(item_id); + gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + //dumpAttachmentSet(mRegisteredAttachments,"after register:"); - if (sAttachmentInvLinkEnabled) + if (mAttachmentInvLinkEnabled) { - LLViewerInventoryItem *item = gInventory.getItem(item_id); - if (item) - { - //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); - LLAppearanceManager::wearItem(item,false); // Add COF link for item. - gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); - gInventory.notifyObservers(); - } + //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); + LLAppearanceManager::addCOFItemLink(item_id, false); // Add COF link for item. } else { @@ -1262,22 +1038,32 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) } } -/* static */ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) { - sRegisteredAttachments.erase(item_id); - //dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); + mRegisteredAttachments.erase(item_id); + gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + + //dumpAttachmentSet(mRegisteredAttachments,"after unregister:"); - if (sAttachmentInvLinkEnabled) + if (mAttachmentInvLinkEnabled) { //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); - LLAppearanceManager::removeItemLinks(item_id, false); - // BAP - needs to change for label to track link. - gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); - gInventory.notifyObservers(); + LLAppearanceManager::removeCOFItemLinks(item_id, false); } else { //llinfos << "no link changes, inv link not enabled" << llendl; } } + +void LLAppearanceManager::linkRegisteredAttachments() +{ + for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin(); + it != mRegisteredAttachments.end(); + ++it) + { + LLUUID item_id = *it; + addCOFItemLink(item_id, false); + } + mRegisteredAttachments.clear(); +} diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 56f54dfc23d095119af9ebf65129f959ab533818..7038d1a35b7a35c627c4b5df4d73c7230093faad 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -36,73 +36,118 @@ #include "llsingleton.h" #include "llinventorymodel.h" #include "llviewerinventory.h" +#include "llcallbacklist.h" class LLWearable; struct LLWearableHoldingPattern; class LLAppearanceManager: public LLSingleton<LLAppearanceManager> { + friend class LLSingleton<LLAppearanceManager>; + public: - static void updateAppearanceFromCOF(); - static bool needToSaveCOF(); - static void changeOutfit(bool proceed, const LLUUID& category, bool append); - static void updateCOF(const LLUUID& category, bool append = false); - static void updateCOFFromCategory(const LLUUID& category, bool append); - static void rebuildCOFFromOutfit(const LLUUID& category); - static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); - static void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); - static void wearOutfitByName(const std::string& name); - static void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, - LLPointer<LLInventoryCallback> cb); + 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 wearOutfitByName(const std::string& name); + void changeOutfit(bool proceed, const LLUUID& category, bool append); - // Add COF link to individual item. - static void wearItem(LLInventoryItem* item, bool do_update = true); + // Copy all items in a category. + void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, + LLPointer<LLInventoryCallback> cb); - // Add COF link to ensemble folder. - static void wearEnsemble(LLInventoryCategory* item, bool do_update = true); - static LLUUID getCOF(); + // Find the Current Outfit folder. + LLUUID getCOF(); - // Remove COF entries - static void removeItemLinks(const LLUUID& item_id, bool do_update = true); + // Finds the folder link to the currently worn outfit + const LLViewerInventoryItem *getCurrentOutfitLink(); + + void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); // For debugging - could be moved elsewhere. - static void dumpCat(const LLUUID& cat_id, const std::string& msg); - static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); - static void unregisterAttachment(const LLUUID& item_id); - static void registerAttachment(const LLUUID& item_id); - static void setAttachmentInvLinkEnable(bool val); + void dumpCat(const LLUUID& cat_id, const std::string& msg); + void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); + + // Attachment link management + void unregisterAttachment(const LLUUID& item_id); + void registerAttachment(const LLUUID& item_id); + void setAttachmentInvLinkEnable(bool val); + void linkRegisteredAttachments(); + + // utility function for bulk linking. + void linkAll(const LLUUID& category, + LLInventoryModel::item_array_t& items, + LLPointer<LLInventoryCallback> cb); + + // Add COF link to individual item. + void addCOFItemLink(const LLUUID& item_id, bool do_update = true); + void addCOFItemLink(const LLInventoryItem *item, bool do_update = true); + + // Remove COF entries + void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true); + + // Add COF link to ensemble folder. + void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); + +protected: + LLAppearanceManager(); + ~LLAppearanceManager(); private: - static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); - static void linkAll(const LLUUID& category, - LLInventoryModel::item_array_t& items, - LLPointer<LLInventoryCallback> cb); + + void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); - static void getDescendentsOfAssetType(const LLUUID& category, + void getDescendentsOfAssetType(const LLUUID& category, LLInventoryModel::item_array_t& items, LLAssetType::EType type, bool follow_folder_links); - static void getCOFValidDescendents(const LLUUID& category, - LLInventoryModel::item_array_t& items); - - static void getUserDescendents(const LLUUID& category, + void getUserDescendents(const LLUUID& category, LLInventoryModel::item_array_t& wear_items, LLInventoryModel::item_array_t& obj_items, LLInventoryModel::item_array_t& gest_items, bool follow_folder_links); - static void onWearableAssetFetch(LLWearable* wearable, void* data); - static void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); - static bool isMandatoryWearableType(EWearableType type); - static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found); - static void purgeCOFBeforeRebuild(const LLUUID& category); - static void purgeCategory(const LLUUID& category, bool keep_outfit_links); - static std::set<LLUUID> sRegisteredAttachments; - static bool sAttachmentInvLinkEnabled; + void purgeCategory(const LLUUID& category, bool keep_outfit_links); + std::set<LLUUID> mRegisteredAttachments; + bool mAttachmentInvLinkEnabled; }; #define SUPPORT_ENSEMBLES 0 +// Shim class and template function to allow arbitrary boost::bind +// expressions to be run as one-time idle callbacks. +template <typename T> +class OnIdleCallback +{ +public: + OnIdleCallback(T callable): + mCallable(callable) + { + } + static void onIdle(void *data) + { + gIdleCallbacks.deleteFunction(onIdle, data); + OnIdleCallback<T>* self = reinterpret_cast<OnIdleCallback<T>*>(data); + self->call(); + delete self; + } + void call() + { + mCallable(); + } +private: + T mCallable; +}; + +template <typename T> +void doOnIdle(T callable) +{ + OnIdleCallback<T>* cb_functor = new OnIdleCallback<T>(callable); + gIdleCallbacks.addFunction(&OnIdleCallback<T>::onIdle,cb_functor); +} + #endif diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 8e6d6b885d696ab4dddf62c240901fc60d817224..edad76a072d3e9c30217040274aed55ae4b3f5e0 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -89,6 +89,8 @@ #include "llvfsthread.h" #include "llvolumemgr.h" +#include "llnotificationmanager.h" + // Third party library includes #include <boost/bind.hpp> @@ -207,7 +209,7 @@ #pragma warning (disable:4702) #endif -static LLAppViewerListener sAppViewerListener("LLAppViewer", LLAppViewer::instance); +static LLAppViewerListener sAppViewerListener(LLAppViewer::instance); ////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor // @@ -797,13 +799,6 @@ bool LLAppViewer::init() // call all self-registered classes LLInitClassList::instance().fireCallbacks(); - #if LL_LCD_COMPILE - // start up an LCD window on a logitech keyboard, if there is one - HINSTANCE hInstance = GetModuleHandle(NULL); - gLcdScreen = new LLLCD(hInstance); - CreateLCDDebugWindows(); -#endif - LLFolderViewItem::initClass(); // SJB: Needs to happen after initWindow(), not sure why but related to fonts gGLManager.getGLInfo(gDebugInfo); @@ -983,7 +978,8 @@ bool LLAppViewer::mainLoop() #endif //memory leaking simulation - LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking"); + LLFloaterMemLeak* mem_leak_instance = + LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); if(mem_leak_instance) { mem_leak_instance->idle() ; @@ -1169,7 +1165,8 @@ bool LLAppViewer::mainLoop() catch(std::bad_alloc) { //stop memory leaking simulation - LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking"); + LLFloaterMemLeak* mem_leak_instance = + LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); if(mem_leak_instance) { mem_leak_instance->stop() ; @@ -1197,7 +1194,8 @@ bool LLAppViewer::mainLoop() llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ; //stop memory leaking simulation - LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking"); + LLFloaterMemLeak* mem_leak_instance = + LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); if(mem_leak_instance) { mem_leak_instance->stop() ; @@ -1355,19 +1353,25 @@ bool LLAppViewer::cleanup() llinfos << "Waiting for pending IO to finish: " << pending << llendflush; ms_sleep(100); } - llinfos << "Shutting down." << llendflush; + llinfos << "Shutting down Views" << llendflush; // Destroy the UI if( gViewerWindow) gViewerWindow->shutdownViews(); + + llinfos << "Cleaning up Inevntory" << llendflush; // Cleanup Inventory after the UI since it will delete any remaining observers // (Deleted observers should have already removed themselves) gInventory.cleanupInventory(); + + llinfos << "Cleaning up Selections" << llendflush; // Clean up selection managers after UI is destroyed, as UI may be observing them. // Clean up before GL is shut down because we might be holding on to objects with texture references LLSelectMgr::cleanupGlobals(); + + llinfos << "Shutting down OpenGL" << llendflush; // Shut down OpenGL if( gViewerWindow) @@ -1381,11 +1385,18 @@ bool LLAppViewer::cleanup() gViewerWindow = NULL; llinfos << "ViewerWindow deleted" << llendflush; } + + llinfos << "Cleaning up Keyboard & Joystick" << llendflush; // viewer UI relies on keyboard so keep it aound until viewer UI isa gone delete gKeyboard; gKeyboard = NULL; + // Turn off Space Navigator and similar devices + LLViewerJoystick::getInstance()->terminate(); + + llinfos << "Cleaning up Objects" << llendflush; + LLViewerObject::cleanupVOClasses(); LLWaterParamManager::cleanupClass(); @@ -1408,6 +1419,8 @@ bool LLAppViewer::cleanup() } LLPrimitive::cleanupVolumeManager(); + llinfos << "Additional Cleanup..." << llendflush; + LLViewerParcelMgr::cleanupGlobals(); // *Note: this is where gViewerStats used to be deleted. @@ -1427,9 +1440,11 @@ bool LLAppViewer::cleanup() // Also after shutting down the messaging system since it has VFS dependencies // + llinfos << "Cleaning up VFS" << llendflush; LLVFile::cleanupClass(); - llinfos << "VFS cleaned up" << llendflush; + 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")) @@ -1471,13 +1486,16 @@ bool LLAppViewer::cleanup() gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask); } - // Turn off Space Navigator and similar devices - LLViewerJoystick::getInstance()->terminate(); - removeMarkerFile(); // Any crashes from here on we'll just have to ignore writeDebugInfo(); + LLLocationHistory::getInstance()->save(); + + LLAvatarIconIDCache::getInstance()->save(); + + llinfos << "Shutting down Threads" << llendflush; + // Let threads finish LLTimer idleTimer; idleTimer.reset(); @@ -1510,14 +1528,9 @@ bool LLAppViewer::cleanup() sTextureFetch = NULL; delete sImageDecodeThread; sImageDecodeThread = NULL; - - LLLocationHistory::getInstance()->save(); - - LLAvatarIconIDCache::getInstance()->save(); - delete mFastTimerLogThread; mFastTimerLogThread = NULL; - + if (LLFastTimerView::sAnalyzePerformance) { llinfos << "Analyzing performance" << llendl; @@ -1539,6 +1552,8 @@ bool LLAppViewer::cleanup() } LLMetricPerformanceTester::cleanClass() ; + llinfos << "Cleaning up Media and Textures" << llendflush; + //Note: //LLViewerMedia::cleanupClass() has to be put before gTextureList.shutdown() //because some new image might be generated during cleaning up media. --bao @@ -1552,13 +1567,13 @@ bool LLAppViewer::cleanup() LLVFSThread::cleanupClass(); LLLFSThread::cleanupClass(); - llinfos << "VFS Thread finished" << llendflush; - #ifndef LL_RELEASE_FOR_DOWNLOAD llinfos << "Auditing VFS" << llendl; gVFS->audit(); #endif + llinfos << "Misc Cleanup" << llendflush; + // For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up. // (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve delete gStaticVFS; @@ -1572,12 +1587,11 @@ bool LLAppViewer::cleanup() LLWatchdog::getInstance()->cleanup(); + llinfos << "Shutting down message system" << llendflush; end_messaging_system(); - llinfos << "Message system deleted." << llendflush; // *NOTE:Mani - The following call is not thread safe. LLCurl::cleanupClass(); - llinfos << "LLCurl cleaned up." << llendflush; // If we're exiting to launch an URL, do that here so the screen // is at the right resolution before we launch IE. @@ -1598,7 +1612,7 @@ bool LLAppViewer::cleanup() ll_close_fail_log(); - llinfos << "Goodbye" << llendflush; + llinfos << "Goodbye!" << llendflush; // return 0; return true; @@ -2340,6 +2354,8 @@ bool LLAppViewer::initWindow() gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"), gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"), FALSE, ignorePixelDepth); + + LLNotificationsUI::LLNotificationManager::getInstance(); if (gSavedSettings.getBOOL("WindowFullScreen")) { @@ -3282,7 +3298,7 @@ void LLAppViewer::saveFinalSnapshot() snap_filename += gDirUtilp->getDirDelimiter(); snap_filename += SCREEN_LAST_FILENAME; // use full pixel dimensions of viewer window (not post-scale dimensions) - gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, TRUE); + gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, TRUE); mSavedFinalSnapshot = TRUE; } } @@ -3530,6 +3546,7 @@ void LLAppViewer::idle() gEventNotifier.update(); gIdleCallbacks.callFunctions(); + gInventory.notifyObservers(); } if (gDisconnected) @@ -4181,7 +4198,7 @@ void LLAppViewer::loadEventHostModule(S32 listen_port) if(dso_path == "") { - llwarns << "QAModeEventHost requested but module \"" << dso_name << "\" not found!" << llendl; + llerrs << "QAModeEventHost requested but module \"" << dso_name << "\" not found!" << llendl; return; } @@ -4209,7 +4226,7 @@ void LLAppViewer::loadEventHostModule(S32 listen_port) if(status != 0) { - llwarns << "problem loading eventhost plugin, status: " << status << llendl; + llerrs << "problem loading eventhost plugin, status: " << status << llendl; } mPlugins.insert(eventhost_dso_handle); diff --git a/indra/newview/llappviewerlistener.cpp b/indra/newview/llappviewerlistener.cpp index 3259309eee76872a69e8aa2b8cd16563c77dd10a..adb5f43c1a8a701f093cfe9214b89280531e987c 100644 --- a/indra/newview/llappviewerlistener.cpp +++ b/indra/newview/llappviewerlistener.cpp @@ -19,14 +19,18 @@ // other Linden headers #include "llappviewer.h" -LLAppViewerListener::LLAppViewerListener(const std::string& pumpname, - const LLAppViewerGetter& getter): - LLDispatchListener(pumpname, "op"), +LLAppViewerListener::LLAppViewerListener(const LLAppViewerGetter& getter): + LLEventAPI("LLAppViewer", + "LLAppViewer listener to (e.g.) request shutdown"), mAppViewerGetter(getter) { // add() every method we want to be able to invoke via this event API. - add("requestQuit", &LLAppViewerListener::requestQuit); - add("forceQuit", &LLAppViewerListener::forceQuit); + add("requestQuit", + "Ask to quit nicely", + &LLAppViewerListener::requestQuit); + add("forceQuit", + "Quit abruptly", + &LLAppViewerListener::forceQuit); } void LLAppViewerListener::requestQuit(const LLSD& event) diff --git a/indra/newview/llappviewerlistener.h b/indra/newview/llappviewerlistener.h index 73227cb95a771e2a74092f3cf74197ae230a2c52..deedcbc17976db460bcbfbb88d4771104ceef697 100644 --- a/indra/newview/llappviewerlistener.h +++ b/indra/newview/llappviewerlistener.h @@ -12,20 +12,19 @@ #if ! defined(LL_LLAPPVIEWERLISTENER_H) #define LL_LLAPPVIEWERLISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" #include <boost/function.hpp> class LLAppViewer; class LLSD; /// Listen on an LLEventPump with specified name for LLAppViewer request events. -class LLAppViewerListener: public LLDispatchListener +class LLAppViewerListener: public LLEventAPI { public: typedef boost::function<LLAppViewer*(void)> LLAppViewerGetter; - /// Specify the pump name on which to listen, and bind the LLAppViewer - /// instance to use (e.g. LLAppViewer::instance()). - LLAppViewerListener(const std::string& pumpname, const LLAppViewerGetter& getter); + /// Bind the LLAppViewer instance to use (e.g. LLAppViewer::instance()). + LLAppViewerListener(const LLAppViewerGetter& getter); private: void requestQuit(const LLSD& event); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 4d85ecb97cd522d0893844095d0540713640f0d4..38843c72215f3f96d499c2d25b886b25590b3cab 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -40,7 +40,7 @@ #include "llfloaterbuycurrency.h" #include "llfilepicker.h" #include "llnotify.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llpermissionsflags.h" diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index dae4296a82ede79c202988180741751ed0bf5e9c..839a84f2d2916dc909d5efc31050527b3f389f3f 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -54,11 +54,15 @@ #include "llmutelist.h" #include "llrecentpeople.h" #include "llsidetray.h" +#include "lltrans.h" #include "llviewerobjectlist.h" #include "llviewermessage.h" // for handle_lure #include "llviewerregion.h" #include "llimfloater.h" +#include "lltrans.h" +// callback connection to auto-call when the IM floater initializes +boost::signals2::connection gAdhocAutoCall; // static void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name) @@ -185,10 +189,23 @@ void LLAvatarActions::startIM(const LLUUID& id) make_ui_sound("UISndStartIM"); } +// static +void LLAvatarActions::endIM(const LLUUID& id) +{ + if (id.isNull()) + return; + + LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id); + if (session_id != LLUUID::null) + { + gIMMgr->leaveSession(session_id); + } +} + // static void LLAvatarActions::startCall(const LLUUID& id) { - if (id.isNull() || isCalling(id)) + if (id.isNull()) { return; } @@ -205,6 +222,39 @@ void LLAvatarActions::startCall(const LLUUID& id) make_ui_sound("UISndStartIM"); } +// static +void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids) +{ + if (ids.size() == 0) + { + return; + } + + // convert vector into LLDynamicArray for addSession + LLDynamicArray<LLUUID> id_array; + for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it) + { + id_array.push_back(*it); + } + + // create the new ad hoc voice session + const std::string title = LLTrans::getString("conference-title"); + LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, + ids[0], id_array); + if (session_id == LLUUID::null) + { + return; + } + + // always open IM window when connecting to voice + LLIMFloater::show(session_id); + + // start the call once the floater has fully initialized + gAdhocAutoCall = LLIMModel::getInstance()->addSessionInitializedCallback(callbackAutoStartCall); + + make_ui_sound("UISndStartIM"); +} + // static bool LLAvatarActions::isCalling(const LLUUID &id) { @@ -226,7 +276,8 @@ void LLAvatarActions::startConference(const std::vector<LLUUID>& ids) { id_array.push_back(*it); } - LLUUID session_id = gIMMgr->addSession("Friends Conference", IM_SESSION_CONFERENCE_START, ids[0], id_array); + const std::string title = LLTrans::getString("conference-title"); + LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, ids[0], id_array); if (session_id != LLUUID::null) { LLIMFloater::show(session_id); @@ -246,7 +297,7 @@ void LLAvatarActions::showProfile(const LLUUID& id) //Show own profile if(gAgent.getID() == id) { - LLSideTray::getInstance()->showPanel("panel_me_profile", params); + LLSideTray::getInstance()->showPanel("panel_me", params); } //Show other user profile else @@ -296,9 +347,9 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id) LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id)); if (widget) { - widget->removeNoneOption(); widget->center(); widget->setPowersMask(GP_MEMBER_INVITE); + widget->removeNoneOption(); widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, id)); } } @@ -393,6 +444,17 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re return false; } +// static +void LLAvatarActions::callbackAutoStartCall(const LLSD& data) +{ + // start the adhoc voice call now the IM panel has initialized + LLUUID session_id = data["session_id"].asUUID(); + gIMMgr->startCall(session_id); + + // and deschedule this callback as its work is done now + gAdhocAutoCall.disconnect(); +} + // static void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message) { diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 0ec20ae3572477764a2ffed0c9e881682b9cbb83..d9dab95a77016e540f61bdd45f7a4ae7a557d2db 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -33,6 +33,13 @@ #ifndef LL_LLAVATARACTIONS_H #define LL_LLAVATARACTIONS_H +#include "lldarray.h" +#include "llsd.h" +#include "lluuid.h" + +#include <string> +#include <vector> + /** * Friend-related actions (add, remove, offer teleport, etc) */ @@ -66,11 +73,21 @@ class LLAvatarActions */ static void startIM(const LLUUID& id); + /** + * End instant messaging session. + */ + static void endIM(const LLUUID& id); + /** * Start an avatar-to-avatar voice call with another user */ static void startCall(const LLUUID& id); + /** + * Start an ad-hoc conference voice call with multiple users + */ + static void startAdhocCall(const std::vector<LLUUID>& ids); + /** * Start conference chat with the given avatars. */ @@ -117,6 +134,7 @@ class LLAvatarActions static bool handleRemove(const LLSD& notification, const LLSD& response); static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id); static void callback_invite_to_group(LLUUID group_id, LLUUID id); + static void callbackAutoStartCall(const LLSD& data); // Just request friendship, no dialog. static void requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message); diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 0ee3e784095094fef1f601fb2824973bd14431e7..327d80ba34e7db1692696bac685f49779a623698 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -143,7 +143,8 @@ void LLAvatarIconIDCache::remove (const LLUUID& avatar_id) LLAvatarIconCtrl::Params::Params() : avatar_id("avatar_id"), - draw_tooltip("draw_tooltip", true) + draw_tooltip("draw_tooltip", true), + default_icon_name("default_icon_name") { name = "avatar_icon"; } @@ -151,7 +152,8 @@ LLAvatarIconCtrl::Params::Params() LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p) : LLIconCtrl(p), - mDrawTooltip(p.draw_tooltip) + mDrawTooltip(p.draw_tooltip), + mDefaultIconName(p.default_icon_name) { mPriority = LLViewerFetchedTexture::BOOST_ICON; @@ -193,16 +195,8 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p) } else { - LLIconCtrl::setValue("default_profile_picture.j2c"); + LLIconCtrl::setValue(mDefaultIconName); } - - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - - registrar.add("AvatarIcon.Action", boost::bind(&LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked, this, _2)); - - LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - - mPopupMenuHandle = menu->getHandle(); } LLAvatarIconCtrl::~LLAvatarIconCtrl() @@ -212,8 +206,6 @@ LLAvatarIconCtrl::~LLAvatarIconCtrl() LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId, this); // Name callbacks will be automatically disconnected since LLUICtrl is trackable } - - LLView::deleteViewByHandle(mPopupMenuHandle); } //virtual @@ -270,7 +262,7 @@ bool LLAvatarIconCtrl::updateFromCache() } else { - LLIconCtrl::setValue("default_profile_picture.j2c"); + LLIconCtrl::setValue(mDefaultIconName); } return true; @@ -295,32 +287,6 @@ void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type) } } -BOOL LLAvatarIconCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get(); - - if(menu) - { - bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarId) != NULL; - - menu->setItemEnabled("Add Friend", !is_friend); - menu->setItemEnabled("Remove Friend", is_friend); - - if(gAgentID == mAvatarId) - { - menu->setItemEnabled("Add Friend", false); - menu->setItemEnabled("Send IM", false); - menu->setItemEnabled("Remove Friend", false); - } - - menu->buildDrawLabels(); - menu->updateParent(LLMenuGL::sMenuContainer); - LLMenuGL::showPopup(this, menu, x, y); - } - - return TRUE; -} - void LLAvatarIconCtrl::nameUpdatedCallback( const LLUUID& id, const std::string& first, @@ -338,40 +304,3 @@ void LLAvatarIconCtrl::nameUpdatedCallback( } } } - -void LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked(const LLSD& userdata) -{ - std::string level = userdata.asString(); - LLUUID id = getAvatarId(); - - if (level == "profile") - { - LLAvatarActions::showProfile(id); - } - else if (level == "im") - { - std::string name; - name.assign(getFirstName()); - name.append(" "); - name.append(getLastName()); - - LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); - if (session_id != LLUUID::null) - { - LLIMFloater::show(session_id); - } - } - else if (level == "add") - { - std::string name; - name.assign(getFirstName()); - name.append(" "); - name.append(getLastName()); - - LLAvatarActions::requestFriendshipDialog(id, name); - } - else if (level == "remove") - { - LLAvatarActions::removeFriendDialog(id); - } -} diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h index 65b5c86ed54302a26fc203f113642d46fcd6cf33..38616b7852e2597accf4de6c099b2afadb1886af 100644 --- a/indra/newview/llavatariconctrl.h +++ b/indra/newview/llavatariconctrl.h @@ -74,6 +74,7 @@ class LLAvatarIconCtrl { Optional <LLUUID> avatar_id; Optional <bool> draw_tooltip; + Optional <std::string> default_icon_name; Params(); }; @@ -81,8 +82,6 @@ class LLAvatarIconCtrl LLAvatarIconCtrl(const Params&); friend class LLUICtrlFactory; - void onAvatarIconContextMenuItemClicked(const LLSD& userdata); - public: virtual ~LLAvatarIconCtrl(); @@ -91,8 +90,6 @@ class LLAvatarIconCtrl // LLAvatarPropertiesProcessor observer trigger virtual void processProperties(void* data, EAvatarProcessorType type); - BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - void nameUpdatedCallback( const LLUUID& id, const std::string& first, @@ -109,9 +106,8 @@ class LLAvatarIconCtrl LLUUID mAvatarId; std::string mFirstName; std::string mLastName; - LLHandle<LLView> mPopupMenuHandle; bool mDrawTooltip; - + std::string mDefaultIconName; bool updateFromCache(); }; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 7df278d887bf6815d3a17926c3af569eef3a464a..c670a65bcc0e968909ac12dab1fbe1c9ab6d9b62 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -311,3 +311,18 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str mAvatarName->setValue(name); mAvatarName->setToolTip(name); } + +void LLAvatarListItem::reshapeAvatarName() +{ + S32 width_delta = 0; + width_delta += mShowProfileBtn ? mProfileBtnWidth : 0; + width_delta += mSpeakingIndicator->getVisible() ? mSpeakingIndicatorWidth : 0; + width_delta += mAvatarIcon->getVisible() ? mIconWidth : 0; + width_delta += mShowInfoBtn ? mInfoBtnWidth : 0; + width_delta += mLastInteractionTime->getVisible() ? mLastInteractionTime->getRect().getWidth() : 0; + + S32 height = mAvatarName->getRect().getHeight(); + S32 width = getRect().getWidth() - width_delta; + + mAvatarName->reshape(width, height); +} diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index d379797a464b8c47206709640e39863d76ca086f..9d48101a44caa63d9dc04ce9ff96f05f6ad75573 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -82,6 +82,8 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver void setContextMenu(ContextMenu* menu) { mContextMenu = menu; } + void reshapeAvatarName(); + private: typedef enum e_online_status { diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 73e24ca8e76f2eaa57627fd6515ab0d94cc1b8d2..7cda2d31e66ec154a91874b993a04e6913b0acaa 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -158,6 +158,11 @@ void LLAvatarPropertiesProcessor::sendAvatarTexturesRequest(const LLUUID& avatar removePendingRequest(avatar_id, APT_TEXTURES); } +void LLAvatarPropertiesProcessor::sendAvatarClassifiedsRequest(const LLUUID& avatar_id) +{ + sendGenericRequest(avatar_id, APT_CLASSIFIEDS, "avatarclassifiedsrequest"); +} + void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props) { llinfos << "Sending avatarinfo update" << llendl; @@ -284,12 +289,60 @@ void LLAvatarPropertiesProcessor::processAvatarInterestsReply(LLMessageSystem* m */ } -void LLAvatarPropertiesProcessor::processAvatarClassifiedReply(LLMessageSystem* msg, void**) +void LLAvatarPropertiesProcessor::processAvatarClassifiedsReply(LLMessageSystem* msg, void**) { - // avatarclassifiedsrequest is not sent according to new UI design but - // keep this method according to resolved issues. + LLAvatarClassifieds classifieds; + + msg->getUUID(_PREHASH_AgentData, _PREHASH_AgentID, classifieds.agent_id); + msg->getUUID(_PREHASH_AgentData, _PREHASH_TargetID, classifieds.target_id); + + S32 block_count = msg->getNumberOfBlocks(_PREHASH_Data); + + for(int n = 0; n < block_count; ++n) + { + LLAvatarClassifieds::classified_data data; + + msg->getUUID(_PREHASH_Data, _PREHASH_ClassifiedID, data.classified_id, n); + msg->getString(_PREHASH_Data, _PREHASH_Name, data.name, n); + + classifieds.classifieds_list.push_back(data); + } + + LLAvatarPropertiesProcessor* self = getInstance(); + // Request processed, no longer pending + self->removePendingRequest(classifieds.target_id, APT_CLASSIFIEDS); + self->notifyObservers(classifieds.target_id,&classifieds,APT_CLASSIFIEDS); } +void LLAvatarPropertiesProcessor::processClassifiedInfoReply(LLMessageSystem* msg, void**) +{ + LLAvatarClassifiedInfo c_info; + + msg->getUUID(_PREHASH_AgentData, _PREHASH_AgentID, c_info.agent_id); + + msg->getUUID(_PREHASH_Data, _PREHASH_ClassifiedID, c_info.classified_id); + msg->getUUID(_PREHASH_Data, _PREHASH_CreatorID, c_info.creator_id); + msg->getU32(_PREHASH_Data, _PREHASH_CreationDate, c_info.creation_date); + msg->getU32(_PREHASH_Data, _PREHASH_ExpirationDate, c_info.expiration_date); + msg->getU32(_PREHASH_Data, _PREHASH_Category, c_info.category); + msg->getString(_PREHASH_Data, _PREHASH_Name, c_info.name); + msg->getString(_PREHASH_Data, _PREHASH_Desc, c_info.description); + msg->getUUID(_PREHASH_Data, _PREHASH_ParcelID, c_info.parcel_id); + msg->getU32(_PREHASH_Data, _PREHASH_ParentEstate, c_info.parent_estate); + msg->getUUID(_PREHASH_Data, _PREHASH_SnapshotID, c_info.snapshot_id); + msg->getString(_PREHASH_Data, _PREHASH_SimName, c_info.sim_name); + msg->getVector3d(_PREHASH_Data, _PREHASH_PosGlobal, c_info.pos_global); + msg->getString(_PREHASH_Data, _PREHASH_ParcelName, c_info.parcel_name); + msg->getU8(_PREHASH_Data, _PREHASH_ClassifiedFlags, c_info.flags); + msg->getS32(_PREHASH_Data, _PREHASH_PriceForListing, c_info.price_for_listing); + + LLAvatarPropertiesProcessor* self = getInstance(); + // Request processed, no longer pending + self->removePendingRequest(c_info.creator_id, APT_CLASSIFIED_INFO); + self->notifyObservers(c_info.creator_id, &c_info, APT_CLASSIFIED_INFO); +} + + void LLAvatarPropertiesProcessor::processAvatarNotesReply(LLMessageSystem* msg, void**) { LLAvatarNotes avatar_notes; @@ -451,6 +504,22 @@ void LLAvatarPropertiesProcessor::sendPickDelete( const LLUUID& pick_id ) LLAgentPicksInfo::getInstance()->decrementNumberOfPicks(); } +void LLAvatarPropertiesProcessor::sendClassifiedDelete(const LLUUID& classified_id) +{ + LLMessageSystem* msg = gMessageSystem; + + msg->newMessage(_PREHASH_ClassifiedDelete); + + msg->nextBlock(_PREHASH_AgentData); + msg->addUUID(_PREHASH_AgentID, gAgent.getID()); + msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlock(_PREHASH_Data); + msg->addUUID(_PREHASH_ClassifiedID, classified_id); + + gAgent.sendReliableMessage(); +} + void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick) { if (!new_pick) return; @@ -485,6 +554,36 @@ void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick) LLAgentPicksInfo::getInstance()->requestNumberOfPicks(); } +void LLAvatarPropertiesProcessor::sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data) +{ + if(!c_data) + { + return; + } + + LLMessageSystem* msg = gMessageSystem; + + msg->newMessage(_PREHASH_ClassifiedInfoUpdate); + + msg->nextBlock(_PREHASH_AgentData); + msg->addUUID(_PREHASH_AgentID, gAgent.getID()); + msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlock(_PREHASH_Data); + msg->addUUID(_PREHASH_ClassifiedID, c_data->classified_id); + msg->addU32(_PREHASH_Category, c_data->category); + msg->addString(_PREHASH_Name, c_data->name); + msg->addString(_PREHASH_Desc, c_data->description); + msg->addUUID(_PREHASH_ParcelID, c_data->parcel_id); + msg->addU32(_PREHASH_ParentEstate, 0); + msg->addUUID(_PREHASH_SnapshotID, c_data->snapshot_id); + msg->addVector3d(_PREHASH_PosGlobal, c_data->pos_global); + msg->addU8(_PREHASH_ClassifiedFlags, c_data->flags); + msg->addS32(_PREHASH_PriceForListing, c_data->price_for_listing); + + gAgent.sendReliableMessage(); +} + void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id) { // Must ask for a pick based on the creator id because @@ -495,6 +594,21 @@ void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, send_generic_message("pickinforequest", request_params); } +void LLAvatarPropertiesProcessor::sendClassifiedInfoRequest(const LLUUID& classified_id) +{ + LLMessageSystem* msg = gMessageSystem; + + msg->newMessage(_PREHASH_ClassifiedInfoRequest); + msg->nextBlock(_PREHASH_AgentData); + + msg->addUUID(_PREHASH_AgentID, gAgent.getID()); + msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlock(_PREHASH_Data); + msg->addUUID(_PREHASH_ClassifiedID, classified_id); + + gAgent.sendReliableMessage(); +} bool LLAvatarPropertiesProcessor::isPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type) { diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h index e6563024b28651c4e8f7c9c1c578cee4e013545d..716c1b8065869026c2026d7b54c296df45193b2d 100644 --- a/indra/newview/llavatarpropertiesprocessor.h +++ b/indra/newview/llavatarpropertiesprocessor.h @@ -53,7 +53,9 @@ enum EAvatarProcessorType APT_GROUPS, APT_PICKS, APT_PICK_INFO, - APT_TEXTURES + APT_TEXTURES, + APT_CLASSIFIEDS, + APT_CLASSIFIED_INFO }; struct LLAvatarData @@ -136,6 +138,43 @@ struct LLAvatarGroups }; }; +struct LLAvatarClassifieds +{ + LLUUID agent_id; + LLUUID target_id; + + struct classified_data; + typedef std::list<classified_data> classifieds_list_t; + + classifieds_list_t classifieds_list; + + struct classified_data + { + LLUUID classified_id; + std::string name; + }; +}; + +struct LLAvatarClassifiedInfo +{ + LLUUID agent_id; + LLUUID classified_id; + LLUUID creator_id; + U32 creation_date; + U32 expiration_date; + U32 category; + std::string name; + std::string description; + LLUUID parcel_id; + U32 parent_estate; + LLUUID snapshot_id; + std::string sim_name; + LLVector3d pos_global; + std::string parcel_name; + U8 flags; + S32 price_for_listing; +}; + class LLAvatarPropertiesObserver { public: @@ -162,20 +201,27 @@ class LLAvatarPropertiesProcessor void sendAvatarNotesRequest(const LLUUID& avatar_id); void sendAvatarGroupsRequest(const LLUUID& avatar_id); void sendAvatarTexturesRequest(const LLUUID& avatar_id); + void sendAvatarClassifiedsRequest(const LLUUID& avatar_id); // Duplicate pick info requests are not suppressed. void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id); + void sendClassifiedInfoRequest(const LLUUID& classified_id); + void sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props); void sendPickInfoUpdate(const LLPickData* new_pick); + void sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data); + void sendFriendRights(const LLUUID& avatar_id, S32 rights); void sendNotes(const LLUUID& avatar_id, const std::string notes); void sendPickDelete(const LLUUID& pick_id); + void sendClassifiedDelete(const LLUUID& classified_id); + // Returns translated, human readable string for account type, such // as "Resident" or "Linden Employee". Used for profiles, inspectors. static std::string accountType(const LLAvatarData* avatar_data); @@ -189,7 +235,9 @@ class LLAvatarPropertiesProcessor static void processAvatarInterestsReply(LLMessageSystem* msg, void**); - static void processAvatarClassifiedReply(LLMessageSystem* msg, void**); + static void processAvatarClassifiedsReply(LLMessageSystem* msg, void**); + + static void processClassifiedInfoReply(LLMessageSystem* msg, void**); static void processAvatarGroupsReply(LLMessageSystem* msg, void**); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 832694873f995f1749f2890a04aa6f2cae1c80cb..c4f0fa53a79c21f8ccea2a8cbcadb154983dde40 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -40,6 +40,7 @@ #include "llimfloater.h" // for LLIMFloater #include "lllayoutstack.h" #include "llnearbychatbar.h" +#include "llspeakbutton.h" #include "llsplitbutton.h" #include "llsyswellwindow.h" #include "llfloatercamera.h" @@ -47,9 +48,13 @@ LLBottomTray::LLBottomTray(const LLSD&) : mChicletPanel(NULL), mSysWell(NULL), + mSpeakPanel(NULL), mSpeakBtn(NULL), mNearbyChatBar(NULL), mToolbarStack(NULL) +, mMovementButton(NULL) +, mResizeState(RS_NORESIZE) +// Add more members { mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); @@ -72,6 +77,8 @@ LLBottomTray::LLBottomTray(const LLSD&) //destroyed LLBottomTray requires some subsystems that are long gone //LLUI::getRootView()->addChild(this); + initStateProcessedObjectMap(); + // Necessary for focus movement among child controls setFocusRoot(TRUE); } @@ -181,6 +188,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& } } +// virtual +void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal) +{ + // Time it takes to connect to voice channel might be pretty long, + // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED. + BOOL enable = FALSE; + + switch (status) + { + // Do not add STATUS_VOICE_ENABLED because voice chat is + // inactive until STATUS_JOINED + case STATUS_JOINED: + enable = TRUE; + break; + default: + enable = FALSE; + break; + } + + mSpeakBtn->setEnabled(enable); +} + //virtual void LLBottomTray::onFocusLost() { @@ -209,7 +238,7 @@ void LLBottomTray::setVisible(BOOL visible) LLView* viewp = *child_it; std::string name = viewp->getName(); - if ("chat_bar" == name || "movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name) + if ("chat_bar" == name || "movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name || "gesture_panel" == name) continue; else { @@ -234,30 +263,31 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask) void LLBottomTray::showGestureButton(BOOL visible) { - mGesturePanel->setVisible(visible); + setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible); } void LLBottomTray::showMoveButton(BOOL visible) { - mMovementPanel->setVisible(visible); + setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible); } void LLBottomTray::showCameraButton(BOOL visible) { - mCamPanel->setVisible(visible); + setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible); } void LLBottomTray::showSnapshotButton(BOOL visible) { - mSnapshotPanel->setVisible(visible); + setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible); } namespace { - const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel"; - const std::string& PANEL_CHATBAR_NAME = "chat_bar"; - const std::string& PANEL_MOVEMENT_NAME = "movement_panel"; - const std::string& PANEL_CAMERA_NAME = "cam_panel"; + const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel"; + const std::string& PANEL_CHATBAR_NAME = "chat_bar"; + const std::string& PANEL_MOVEMENT_NAME = "movement_panel"; + const std::string& PANEL_CAMERA_NAME = "cam_panel"; + const std::string& PANEL_GESTURE_NAME = "gesture_panel"; } BOOL LLBottomTray::postBuild() @@ -275,167 +305,644 @@ BOOL LLBottomTray::postBuild() mSnapshotPanel = getChild<LLPanel>("snapshot_panel"); setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); - if (mChicletPanel && mToolbarStack && mNearbyChatBar) - { - verifyChildControlsSizes(); - } + mSpeakPanel = getChild<LLPanel>("speak_panel"); + mSpeakBtn = getChild<LLSpeakButton>("talk"); + + // Speak button should be initially disabled because + // it takes some time between logging in to world and connecting to voice channel. + mSpeakBtn->setEnabled(FALSE); + + // Localization tool doesn't understand custom buttons like <talk_button> + mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); + 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(); return TRUE; } -void LLBottomTray::verifyChildControlsSizes() +void LLBottomTray::log(LLView* panel, const std::string& descr) { - LLRect rect = mChicletPanel->getRect(); - if (rect.getWidth() < mChicletPanel->getMinWidth()) - { - mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight()); - } + if (NULL == panel) return; + LLView* layout = panel->getParent(); + lldebugs << descr << ": " + << "panel: " << panel->getName() + << ", rect: " << panel->getRect() + + + << "layout: " << layout->getName() + << ", rect: " << layout->getRect() + << llendl + ; +} + +void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + static S32 debug_calling_number = 0; + lldebugs << "**************************************** " << ++debug_calling_number << llendl; + + S32 current_width = getRect().getWidth(); + S32 delta_width = width - current_width; + lldebugs << "Reshaping: " + << ", width: " << width + << ", cur width: " << current_width + << ", delta_width: " << delta_width + << ", called_from_parent: " << called_from_parent + << llendl; - rect = mNearbyChatBar->getRect(); - if (rect.getWidth() < mNearbyChatBar->getMinWidth()) + if (mNearbyChatBar) log(mNearbyChatBar, "before"); + if (mChicletPanel) log(mChicletPanel, "before"); + + // stores width size on which bottom tray is less than width required by its children. EXT-991 + static S32 extra_shrink_width = 0; + bool should_be_reshaped = true; + + if (mChicletPanel && mToolbarStack && mNearbyChatBar) { - mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight()); + mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); + + // bottom tray is narrowed + if (delta_width < 0) + { + if (extra_shrink_width > 0) + { + // is world rect was extra shrunk and decreasing again only update this value + // to delta_width negative + extra_shrink_width -= delta_width; // use "-=" because delta_width is negative + should_be_reshaped = false; + } + else + { + extra_shrink_width = processWidthDecreased(delta_width); + + // increase new width to extra_shrink_width value to not reshape less than bottom tray minimum + width += extra_shrink_width; + } + } + // bottom tray is widen + else + { + if (extra_shrink_width > delta_width) + { + // Less than minimum width is more than increasing (delta_width) + // only reduce it value and make no reshape + extra_shrink_width -= delta_width; + should_be_reshaped = false; + } + else + { + if (extra_shrink_width > 0) + { + // If we have some extra shrink width let's reduce delta_width & width + delta_width -= extra_shrink_width; + width -= extra_shrink_width; + extra_shrink_width = 0; + } + processWidthIncreased(delta_width); + } + } } - else if (rect.getWidth() > mNearbyChatBar->getMaxWidth()) + + if (should_be_reshaped) { - rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight()); - mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight()); - mNearbyChatBar->setRect(rect); + lldebugs << "Reshape all children with width: " << width << llendl; + LLPanel::reshape(width, height, called_from_parent); } + + if (mNearbyChatBar) log(mNearbyChatBar, "after"); + if (mChicletPanel) log(mChicletPanel, "after"); } -void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) +S32 LLBottomTray::processWidthDecreased(S32 delta_width) { + bool still_should_be_processed = true; - if (mChicletPanel && mToolbarStack && mNearbyChatBar) + const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); + const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + + if (chiclet_panel_width > chiclet_panel_min_width) { -#ifdef __FEATURE_EXT_991__ - BOOL shrink = width < getRect().getWidth(); - const S32 MIN_RENDERED_CHARS = 3; -#endif + // we have some space to decrease chiclet panel + S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width; - verifyChildControlsSizes(); - updateResizeState(width, height); + S32 delta_panel = llmin(-delta_width, panel_delta_min); - switch (mResizeState) - { - case STATE_CHICLET_PANEL: - mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); + lldebugs << "delta_width: " << delta_width + << ", panel_delta_min: " << panel_delta_min + << ", delta_panel: " << delta_panel + << llendl; - mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE); - mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE); - mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE); + // is chiclet panel width enough to process resizing? + delta_width += panel_delta_min; - break; - case STATE_CHATBAR_INPUT: - mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE); + still_should_be_processed = delta_width < 0; - mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE); - mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE); - mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE); + mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight()); + log(mChicletPanel, "after processing panel decreasing via chiclet panel"); - break; + lldebugs << "RS_CHICLET_PANEL" + << ", delta_width: " << delta_width + << llendl; + } -#ifdef __FEATURE_EXT_991__ + const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); + const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); + if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) + { + // we have some space to decrease chatbar panel + S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width; - case STATE_BUTTONS: - mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE); - mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, TRUE); + S32 delta_panel = llmin(-delta_width, panel_delta_min); - mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE); - mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE); + // whether chatbar panel width is enough to process resizing? + delta_width += panel_delta_min; - if (shrink) - { + still_should_be_processed = delta_width < 0; - if (mSnapshotPanel->getVisible()) - { - showSnapshotButton(FALSE); - } + mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight()); - if (mCamPanel->getVisible() && mCamButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS) - { - showCameraButton(FALSE); - } + log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel"); - if (mMovementPanel->getVisible() && mMovementButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS) - { - showMoveButton(FALSE); - } + lldebugs << "RS_CHATBAR_INPUT" + << ", delta_panel: " << delta_panel + << ", delta_width: " << delta_width + << llendl; + } - } - else - { - showMoveButton(TRUE); - mMovementPanel->draw(); + S32 extra_shrink_width = 0; + S32 buttons_freed_width = 0; + if (still_should_be_processed) + { + processShrinkButtons(&delta_width, &buttons_freed_width); - if (mMovementButton->getLastDrawCharsCount() >= MIN_RENDERED_CHARS) - { - showMoveButton(TRUE); - } - else - { - showMoveButton(FALSE); - } - } - break; -#endif + if (delta_width < 0) + { + processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width); + } - default: - break; + 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); + } + + if (delta_width < 0) + { + extra_shrink_width = -delta_width; + llwarns << "There is no enough width to reshape all children: " + << extra_shrink_width << llendl; + } + + if (buttons_freed_width > 0) + { + log(mNearbyChatBar, "before applying compensative width"); + mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() ); + log(mNearbyChatBar, "after applying compensative width"); + lldebugs << buttons_freed_width << llendl; } } - LLPanel::reshape(width, height, called_from_parent); + return extra_shrink_width; } -void LLBottomTray::updateResizeState(S32 width, S32 height) +void LLBottomTray::processWidthIncreased(S32 delta_width) { - mResizeState = STATE_BUTTONS; + if (delta_width <= 0) return; - const S32 chiclet_panel_width = mChicletPanel->getRect().getWidth(); + const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); 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(); - // bottom tray is narrowed - if (width < getRect().getWidth()) + 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; + + // how many room we have to show hidden buttons + S32 total_available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet; + + lldebugs << "Processing extending, available width:" + << ", chatbar - " << chatbar_available_shrink_width + << ", chiclets - " << available_width_chiclet + << ", total - " << total_available_width + << llendl; + + S32 available_width = total_available_width; + if (available_width > 0) { - if (chiclet_panel_width > chiclet_panel_min_width) + 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); + } + + 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; + if (processed_width > delta_width) + { + // ... let's shrink nearby chat & chiclet panels + S32 required_to_process_width = processed_width; + + // 1. use delta width of resizing + required_to_process_width -= delta_width; + + // 2. use width available via decreasing of nearby chat panel + S32 chatbar_shrink_width = required_to_process_width; + if (chatbar_available_shrink_width < chatbar_shrink_width) { - mResizeState = STATE_CHICLET_PANEL; + chatbar_shrink_width = chatbar_available_shrink_width; } - else if (chatbar_panel_width > chatbar_panel_min_width) + + log(mNearbyChatBar, "increase width: before applying compensative width"); + mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() ); + if (mNearbyChatBar) log(mNearbyChatBar, "after applying compensative width"); + lldebugs << chatbar_shrink_width << llendl; + + // 3. use width available via decreasing of chiclet panel + required_to_process_width -= chatbar_shrink_width; + + if (required_to_process_width > 0) { - mResizeState = STATE_CHATBAR_INPUT; + mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight()); + log(mChicletPanel, "after applying compensative width for chiclets: "); + lldebugs << required_to_process_width << llendl; } - else + + } + + // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels + delta_width -= processed_width; + + + // how many space can nearby chatbar take? + S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth(); + if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width) + { + S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_; + S32 delta_panel = llmin(delta_width, delta_panel_max); + lldebugs << "Unprocesed delta width: " << delta_width + << ", can be applied to chatbar: " << delta_panel_max + << ", will be applied: " << delta_panel + << llendl; + + delta_width -= delta_panel_max; + mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight()); + log(mNearbyChatBar, "applied unprocessed delta width"); + } +} + +bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width) +{ + lldebugs << "Trying to show object type: " << shown_object_type << llendl; + + LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; + if (NULL == panel) + { + lldebugs << "There is no object to process for state: " << shown_object_type << llendl; + return false; + } + bool can_be_shown = canButtonBeShown(shown_object_type); + if (can_be_shown) + { + //validate if we have enough room to show this button + const S32 required_width = panel->getRect().getWidth(); + can_be_shown = *available_width >= required_width; + if (can_be_shown) { - mResizeState = STATE_BUTTONS; + *available_width -= required_width; + + setTrayButtonVisible(shown_object_type, true); + + lldebugs << "processed object type: " << shown_object_type + << ", rest available width: " << *available_width + << llendl; + mResizeState &= ~shown_object_type; } } - // bottom tray is widen - else + return can_be_shown; +} + +void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width) +{ + lldebugs << "Trying to hide object type: " << processed_object_type << llendl; + + LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; + if (NULL == panel) + { + lldebugs << "There is no object to process for state: " << processed_object_type << llendl; + return; + } + + if (panel->getVisible()) { -#ifdef __FEATURE_EXT_991__ - if (!mMovementPanel->getVisible()) + *required_width += panel->getRect().getWidth(); + + if (*required_width > 0) { - mResizeState = STATE_BUTTONS; + *buttons_freed_width += *required_width; } - else -#endif - if (chatbar_panel_width < chatbar_panel_max_width) + + setTrayButtonVisible(processed_object_type, false); + + mResizeState |= processed_object_type; + + lldebugs << "processing object type: " << processed_object_type + << ", buttons_freed_width: " << *buttons_freed_width + << llendl; + } +} + +void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_width) +{ + processShrinkButton(RS_BUTTON_CAMERA, required_width); + + if (*required_width < 0) + { + processShrinkButton(RS_BUTTON_MOVEMENT, required_width); + } + if (*required_width < 0) + { + processShrinkButton(RS_BUTTON_GESTURES, required_width); + } + if (*required_width < 0) + { + + S32 panel_min_width = 0; + std::string panel_name = mSpeakPanel->getName(); + bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL); + if (!success) { - mResizeState = STATE_CHATBAR_INPUT; + lldebugs << "Panel was not found to get its min width: " << panel_name << llendl; } else { - mResizeState = STATE_CHICLET_PANEL; + // + mSpeakBtn->setLabelVisible(false); + S32 panel_width = mSpeakPanel->getRect().getWidth(); + S32 possible_shrink_width = panel_width - panel_min_width; + + if (possible_shrink_width > 0) + { + mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight()); + + *required_width += possible_shrink_width; + + if (*required_width > 0) + { + *buttons_freed_width += *required_width; + } + + lldebugs << "Shrunk panel: " << panel_name + << ", shrunk width: " << possible_shrink_width + << ", rest width to process: " << *required_width + << llendl; + } } } +} + +void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* required_width) +{ + LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; + if (NULL == panel) + { + lldebugs << "There is no object to process for type: " << processed_object_type << llendl; + return; + } + + if (panel->getVisible()) + { + S32 panel_width = panel->getRect().getWidth(); + S32 panel_min_width = 0; + std::string panel_name = panel->getName(); + bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL); + S32 possible_shrink_width = panel_width - panel_min_width; + + if (!success) + { + lldebugs << "Panel was not found to get its min width: " << panel_name << llendl; + } + // we have some space to free by shrinking the button + else if (possible_shrink_width > 0) + { + // let calculate real width to shrink + + // 1. apply all possible width + *required_width += possible_shrink_width; + // 2. it it is too much... + if (*required_width > 0) + { + // reduce applied shrunk width to the excessive value. + possible_shrink_width -= *required_width; + *required_width = 0; + } + panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight()); - // TODO: finish implementation + lldebugs << "Shrunk panel: " << panel_name + << ", shrunk width: " << possible_shrink_width + << ", rest width to process: " << *required_width + << llendl; + } + } } + + +void LLBottomTray::processExtendButtons(S32* available_width) +{ + // do not allow extending any buttons if we have some buttons hidden + if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return; + + processExtendButton(RS_BUTTON_GESTURES, available_width); + + if (*available_width > 0) + { + processExtendButton(RS_BUTTON_CAMERA, available_width); + } + if (*available_width > 0) + { + processExtendButton(RS_BUTTON_MOVEMENT, available_width); + } + 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) + { + mSpeakBtn->setLabelVisible(true); + mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); + log(mSpeakBtn, "speak button is extended"); + + *available_width -= possible_extend_width; + + lldebugs << "Extending panel: " << mSpeakPanel->getName() + << ", extended width: " << possible_extend_width + << ", rest width to process: " << *available_width + << llendl; + } + } +} + +void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width) +{ + LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; + if (NULL == panel) + { + lldebugs << "There is no object to process for type: " << processed_object_type << llendl; + return; + } + + if (!panel->getVisible()) return; + + S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type]; + S32 panel_width = panel->getRect().getWidth(); + S32 possible_extend_width = panel_max_width - panel_width; + + if (possible_extend_width > 0) + { + // let calculate real width to extend + + // 1. apply all possible width + *available_width -= possible_extend_width; + + // 2. it it is too much... + if (*available_width < 0) + { + // reduce applied extended width to the excessive value. + 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 + << llendl; + } +} + +bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const +{ + 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; + + switch(processed_object_type) + { + 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; + } + } + return can_be_shown; +} + +void LLBottomTray::initStateProcessedObjectMap() +{ + 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)); +} + +void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) +{ + LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; + if (NULL == panel) + { + lldebugs << "There is no object to show for state: " << shown_object_type << llendl; + return; + } + + panel->setVisible(visible); +} + +void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible) +{ + bool can_be_set = true; + + if (visible) + { + LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; + if (NULL == panel) + { + lldebugs << "There is no object to process for state: " << shown_object_type << llendl; + return; + } + + const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); + const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); + + const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); + const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + + const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width) + + (chiclet_panel_width - chiclet_panel_min_width); + + const S32 required_width = panel->getRect().getWidth(); + can_be_set = available_width >= required_width; + } + + if (can_be_set) + { + setTrayButtonVisible(shown_object_type, visible); + + // if we hide the button mark it NOT to show while future bottom tray extending + if (!visible) + { + mResizeState &= ~shown_object_type; + } + } + else + { + // mark this button to show it while future bottom tray extending + mResizeState |= shown_object_type; + LLNotifications::instance().add("BottomTrayButtonCanNotBeShown"); + } +} + +//EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 02588a1975f09822182b70ead37219df08b96366..7640cdcf9d57d0ea2451b8d16a2ab56983f96968 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -33,7 +33,7 @@ #ifndef LL_LLBOTTOMPANEL_H #define LL_LLBOTTOMPANEL_H -#include <llmenugl.h> +#include "llmenugl.h" #include "llpanel.h" #include "llimview.h" @@ -51,7 +51,9 @@ class LLBottomTray : public LLSingleton<LLBottomTray> , public LLPanel , public LLIMSessionObserver + , public LLVoiceClientStatusObserver { + LOG_CLASS(LLBottomTray); friend class LLSingleton<LLBottomTray>; public: ~LLBottomTray(); @@ -74,6 +76,10 @@ class LLBottomTray virtual void onFocusLost(); virtual void setVisible(BOOL visible); + // Implements LLVoiceClientStatusObserver::onChange() to enable the speak + // button when voice is available + /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); + void showBottomTrayContextMenu(S32 x, S32 y, MASK mask); void showGestureButton(BOOL visible); @@ -82,18 +88,83 @@ class LLBottomTray void showSnapshotButton(BOOL visible); private: - - enum EResizeState + typedef enum e_resize_status_type { - STATE_CHICLET_PANEL = 1, - STATE_CHATBAR_INPUT, - STATE_BUTTONS - }; + RS_NORESIZE = 0x0000 + , RS_CHICLET_PANEL = 0x0001 + , RS_CHATBAR_INPUT = 0x0002 + , RS_BUTTON_SNAPSHOT = 0x0004 + , RS_BUTTON_CAMERA = 0x0008 + , RS_BUTTON_MOVEMENT = 0x0010 + , RS_BUTTON_GESTURES = 0x0020 + , RS_BUTTON_SPEAK = 0x0040 + + /** + * Specifies buttons which can be hidden when bottom tray is shrunk. + * They are: Gestures, Movement (Move), Camera (View), Snapshot + */ + , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES + }EResizeState; + + S32 processWidthDecreased(S32 delta_width); + void processWidthIncreased(S32 delta_width); + 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); + + /** + * Shrinks shown buttons to reduce total taken space. + * + * @param - required_width - width which buttons can use to be shrunk. It is a negative value. + * It is increased on the value processed by buttons. + */ + void processShrinkButtons(S32* required_width, S32* buttons_freed_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. + */ + void processExtendButtons(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. + * + * Processes buttons a such way to show buttons in constant order: + * - Gestures, Move, View, Snapshot + */ + bool canButtonBeShown(EResizeState processed_object_type) const; + void initStateProcessedObjectMap(); + + /** + * Sets passed visibility to object specified by resize type. + */ + void setTrayButtonVisible(EResizeState shown_object_type, bool visible); + + /** + * Sets passed visibility to object specified by resize type if it is possible. + * + * If it is impossible to show required button due to there is no enough room in bottom tray + * it will no be shown. Is called via context menu commands. + * In this case Alert Dialog will be shown to notify user about that. + * + * Method also stores resize state to be processed while future bottom tray extending: + * - if hidden while resizing button should be hidden it will not be shown while extending; + * - if hidden via context menu button should be shown but there is no enough room for now + * it will be shown while extending. + */ + void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible); + + MASK mResizeState; - void updateResizeState(S32 width, S32 height); - void verifyChildControlsSizes(); + typedef std::map<EResizeState, LLPanel*> state_object_map_t; + state_object_map_t mStateProcessedObjectMap; - EResizeState mResizeState; + typedef std::map<EResizeState, S32> state_object_width_map_t; + state_object_width_map_t mObjectDefaultWidthMap; protected: @@ -110,6 +181,7 @@ class LLBottomTray LLChicletPanel* mChicletPanel; LLNotificationChiclet* mSysWell; + LLPanel* mSpeakPanel; LLSpeakButton* mSpeakBtn; LLNearbyChatBar* mNearbyChatBar; LLLayoutStack* mToolbarStack; diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index e8812d87ee0501fe0be05c9fb99a68cbd65ef36a..0b10255c2f2395b8aa224dbe655fde71a90cd272 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -51,7 +51,7 @@ #include "llagent.h" #include "llbutton.h" -//#include "llinventory.h" +#include "llinventoryobserver.h" #include "llinventorymodel.h" #include "llnotify.h" #include "llresmgr.h" diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h index bd58b2fbe617b6273a81e8e0869bd0a07310ac0c..47b0dcb9039d497c62516e95417af9eb308dd774 100644 --- a/indra/newview/llcallingcard.h +++ b/indra/newview/llcallingcard.h @@ -45,6 +45,7 @@ //class LLInventoryObserver; class LLMessageSystem; class LLTrackingData; + class LLFriendObserver { public: diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 642742257264bbd1595b42b29c80ba9408f77b8f..94c303a30f797313138a6011ab837bbf97fe12ea 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -37,7 +37,6 @@ #include "llappviewer.h" #include "llviewercontrol.h" #include "llimview.h" -#include "llbottomtray.h" #include "llviewerwindow.h" #include "llrootview.h" #include "llsyswellwindow.h" @@ -127,7 +126,7 @@ void LLChannelManager::onLoginCompleted() gViewerWindow->getRootView()->addChild(mStartUpChannel); // init channel's position and size - S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + 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(&LLSysWellWindow::onStartUpToastClick, LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window"), _2, _3, _4)); @@ -220,5 +219,12 @@ void LLChannelManager::removeChannelByID(const LLUUID id) } //-------------------------------------------------------------------------- - +void LLChannelManager::muteAllChannels(bool mute) +{ + for (std::vector<ChannelElem>::iterator it = mChannelList.begin(); + it != mChannelList.end(); it++) + { + it->channel->setShowToasts(!mute); + } +} diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h index b927d369cd4b6d17cfd5339d3c1371c53e59ac4f..4b66a1ef8922bed27e92d18dd239d5c1b7b687cc 100644 --- a/indra/newview/llchannelmanager.h +++ b/indra/newview/llchannelmanager.h @@ -102,6 +102,13 @@ class LLChannelManager : public LLSingleton<LLChannelManager> // remove channel methods void removeChannelByID(const LLUUID id); + /** + * Manages toasts showing for all channels. + * + * @param mute Flag to disable/enable toasts showing. + */ + void muteAllChannels(bool mute); + private: LLScreenChannel* createChannel(LLChannelManager::Params& p); diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 4523267eddbaa6342b2af0365850f0d82d2f1b91..442dc660cdb22da74eef0982dc1d13835ec486b6 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -210,8 +210,9 @@ void LLChatBar::refreshGestures() // collect list of unique gestures std::map <std::string, BOOL> unique; - LLGestureManager::item_map_t::iterator it; - for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it) + LLGestureManager::item_map_t::const_iterator it; + const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures(); + for (it = active_gestures.begin(); it != active_gestures.end(); ++it) { LLMultiGesture* gesture = (*it).second; if (gesture) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 2ccd6b7d350555d5fce84c7f03d6dd31d6a95cb0..2c9b38b82a2fe005d86813e4981f55bd7d7bb14c 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -33,11 +33,9 @@ #include "llviewerprecompiledheaders.h" #include "llchathistory.h" #include "llpanel.h" -#include "lltextbox.h" #include "lluictrlfactory.h" #include "llscrollcontainer.h" #include "llavatariconctrl.h" - #include "llimview.h" #include "llcallingcard.h" //for LLAvatarTracker #include "llagentdata.h" @@ -46,23 +44,9 @@ #include "llfloaterreg.h" #include "llmutelist.h" -static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history"); -static const std::string MESSAGE_USERNAME_DATE_SEPARATOR(" ----- "); - -std::string formatCurrentTime() -{ - time_t utc_time; - utc_time = time_corrected(); - std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:[" - +LLTrans::getString("TimeMin")+"] "; - - LLSD substitution; - - substitution["datetime"] = (S32) utc_time; - LLStringUtil::format (timeStr, substitution); +#include "llsidetray.h"//for blocked objects panel - return timeStr; -} +static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history"); class LLChatHistoryHeader: public LLPanel { @@ -85,10 +69,16 @@ class LLChatHistoryHeader: public LLPanel if (level == "profile") { + LLSD params; + params["object_id"] = getAvatarId(); + + LLFloaterReg::showInstance("inspect_object", params); } else if (level == "block") { LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT)); + + LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().insert("blocked_to_select", getAvatarId())); } } @@ -132,7 +122,7 @@ class LLChatHistoryHeader: public LLPanel menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mPopupMenuHandleObject = menu->getHandle(); - setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4)); + setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4)); return LLPanel::postBuild(); } @@ -168,14 +158,22 @@ class LLChatHistoryHeader: public LLPanel void onHeaderPanelClick(S32 x, S32 y, MASK mask) { - LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID)); + if (mSourceType == CHAT_SOURCE_OBJECT) + { + LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", mAvatarID)); + } + else if (mSourceType == CHAT_SOURCE_AGENT) + { + LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID)); + } + //if chat source is system, you may add "else" here to define behaviour. } 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) + void setup(const LLChat& chat,const LLStyle::Params& style_params) { mAvatarID = chat.mFromID; mSourceType = chat.mSourceType; @@ -185,8 +183,10 @@ class LLChatHistoryHeader: public LLPanel 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()) { @@ -198,10 +198,9 @@ class LLChatHistoryHeader: public LLPanel std::string SL = LLTrans::getString("SECOND_LIFE"); userName->setValue(SL); } - - LLTextBox* timeBox = getChild<LLTextBox>("time_box"); - timeBox->setValue(formatCurrentTime()); + setTimeField(chat.mTimeStr); + LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); if(mSourceType != CHAT_SOURCE_AGENT) @@ -267,7 +266,28 @@ class LLChatHistoryHeader: public LLPanel } } - +private: + void setTimeField(const std::string& time_value) + { + LLTextBox* time_box = getChild<LLTextBox>("time_box"); + + LLRect rect_before = time_box->getRect(); + time_box->setValue(time_value); + + // set necessary textbox width to fit all text + time_box->reshapeToFitText(); + LLRect rect_after = time_box->getRect(); + + // move rect to the left to correct position... + S32 delta_pos_x = rect_before.getWidth() - rect_after.getWidth(); + S32 delta_pos_y = rect_before.getHeight() - rect_after.getHeight(); + time_box->translate(delta_pos_x, delta_pos_y); + + //... & change width of the name control + LLTextBox* user_name = getChild<LLTextBox>("user_name"); + const LLRect& user_rect = user_name->getRect(); + user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight()); + } protected: LLHandle<LLView> mPopupMenuHandleAvatar; @@ -323,57 +343,90 @@ LLView* LLChatHistory::getSeparator() return separator; } -LLView* LLChatHistory::getHeader(const LLChat& chat) +LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params) { LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename); - header->setup(chat); + header->setup(chat,style_params); return header; } -void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params) +void LLChatHistory::clear() { - LLView* view = NULL; - std::string view_text; - - LLInlineViewSegment::Params p; - p.force_newline = true; - p.left_pad = mLeftWidgetPad; - p.right_pad = mRightWidgetPad; + mLastFromName.clear(); + LLTextEditor::clear(); +} - if (mLastFromName == chat.mFromName) +void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params) +{ + LLColor4 txt_color = LLUIColorTable::instance().getColor("White"); + LLViewerChat::getChatColor(chat,txt_color); + LLFontGL* fontp = LLViewerChat::getChatFont(); + std::string font_name = LLFontGL::nameFromFont(fontp); + std::string font_size = LLFontGL::sizeFromFont(fontp); + LLStyle::Params style_params; + style_params.color(txt_color); + style_params.readonly_color(txt_color); + style_params.font.name(font_name); + style_params.font.size(font_size); + style_params.font.style(input_append_params.font.style); + + std::string header_text = "[" + chat.mTimeStr + "] "; + if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM) + header_text += chat.mFromName + ": "; + + if (use_plain_text_chat_history) { - view = getSeparator(); - view_text = "\n"; - p.top_pad = mTopSeparatorPad; - p.bottom_pad = mBottomSeparatorPad; + appendText(header_text, getText().size() != 0, style_params); } else { - view = getHeader(chat); - view_text = chat.mFromName + MESSAGE_USERNAME_DATE_SEPARATOR + formatCurrentTime() + '\n'; - if (getText().size() == 0) - p.top_pad = 0; + LLView* view = NULL; + LLInlineViewSegment::Params p; + p.force_newline = true; + p.left_pad = mLeftWidgetPad; + p.right_pad = mRightWidgetPad; + + if (mLastFromName == chat.mFromName) + { + view = getSeparator(); + p.top_pad = mTopSeparatorPad; + p.bottom_pad = mBottomSeparatorPad; + } else - p.top_pad = mTopHeaderPad; - p.bottom_pad = mBottomHeaderPad; + { + view = getHeader(chat, style_params); + if (getText().size() == 0) + p.top_pad = 0; + else + p.top_pad = mTopHeaderPad; + p.bottom_pad = mBottomHeaderPad; + + } + p.view = view; + + //Prepare the rect for the view + LLRect target_rect = getDocumentView()->getRect(); + // squeeze down the widget by subtracting padding off left and right + target_rect.mLeft += mLeftWidgetPad + mHPad; + target_rect.mRight -= mRightWidgetPad; + view->reshape(target_rect.getWidth(), view->getRect().getHeight()); + view->setOrigin(target_rect.mLeft, view->getRect().mBottom); + + appendWidget(p, header_text, false); + mLastFromName = chat.mFromName; } - p.view = view; - - //Prepare the rect for the view - LLRect target_rect = getDocumentView()->getRect(); - // squeeze down the widget by subtracting padding off left and right - target_rect.mLeft += mLeftWidgetPad + mHPad; - target_rect.mRight -= mRightWidgetPad; - view->reshape(target_rect.getWidth(), view->getRect().getHeight()); - view->setOrigin(target_rect.mLeft, view->getRect().mBottom); - - appendWidget(p, view_text, false); - - //Append the text message - std::string message = chat.mText + '\n'; - appendText(message, FALSE, style_params); + //Handle IRC styled /me messages. + std::string prefix = chat.mText.substr(0, 4); + if (prefix == "/me " || prefix == "/me'") + { + style_params.font.style = "ITALIC"; - mLastFromName = chat.mFromName; + if (chat.mFromName.size() > 0) + appendText(chat.mFromName + " ", TRUE, style_params); + appendText(chat.mText.substr(4), FALSE, style_params); + } + else + appendText(chat.mText, FALSE, style_params); blockUndo(); - setCursorAndScrollToEnd(); } + diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 3789ebff4e94273e56fd4c2de55c5a9747790ac4..ef5839ff2f7a480140e2ba928824eb9de8b0ac2c 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -34,7 +34,7 @@ #define LLCHATHISTORY_H_ #include "lltexteditor.h" -#include "llchat.h" +#include "llviewerchat.h" //Chat log widget allowing addition of a message as a widget class LLChatHistory : public LLTextEditor @@ -94,11 +94,9 @@ class LLChatHistory : public LLTextEditor LLView* getSeparator(); /** * Builds a message header. - * @param from owner of a message. - * @param time time of a message. * @return pointer to LLView header object. */ - LLView* getHeader(const LLChat& chat); + LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params); public: ~LLChatHistory(); @@ -108,10 +106,11 @@ class LLChatHistory : public LLTextEditor * If last user appended message, concurs with current user, * separator is added before the message, otherwise header is added. * @param chat - base chat message. - * @param time time of a message. - * @param message message itself. + * @param use_plain_text_chat_history - whether to add message as plain text. + * @param input_append_params - font style. */ - void appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params); + void appendMessage(const LLChat& chat, const bool use_plain_text_chat_history = false, const LLStyle::Params& input_append_params = LLStyle::Params()); + /*virtual*/ void clear(); private: std::string mLastFromName; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 63b9fd8e66c54c70e78ad822b7f9bf5488156869..8a6935b71bf91d9b9767c6540de1d099c2221d5d 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -120,10 +120,10 @@ std::string LLNearbyChatToastPanel::appendTime() -void LLNearbyChatToastPanel::addText (const std::string& message) +void LLNearbyChatToastPanel::addText (const std::string& message , const LLStyle::Params& input_params) { LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); - msg_text->addText(message); + msg_text->addText(message , input_params); mMessages.push_back(message); } @@ -134,24 +134,79 @@ void LLNearbyChatToastPanel::init(LLSD& notification) mText = notification["message"].asString(); // UTF-8 line of text mFromName = notification["from"].asString(); // agent or object name mFromID = notification["from_id"].asUUID(); // agent id or object id + int sType = notification["source"].asInteger(); mSourceType = (EChatSourceType)sType; + + std::string color_name = notification["text_color"].asString(); + + mTextColor = LLUIColorTable::instance().getColor(color_name); + mTextColor.mV[VALPHA] =notification["color_alpha"].asReal(); + + S32 font_size = notification["font_size"].asInteger(); + switch(font_size) + { + case 0: + mFont = LLFontGL::getFontSansSerifSmall(); + break; + default: + case 1: + mFont = LLFontGL::getFontSansSerif(); + break; + case 2: + mFont = LLFontGL::getFontSansSerifBig(); + break; + } + + LLStyle::Params style_params; + style_params.color(mTextColor); +// style_params.font(mFont); + std::string font_name = LLFontGL::nameFromFont(mFont); + std::string font_style_size = LLFontGL::sizeFromFont(mFont); + style_params.font.name(font_name); + style_params.font.size(font_style_size); std::string str_sender; - + if(gAgentID != mFromID) str_sender = mFromName; else str_sender = LLTrans::getString("You");; - caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender); + caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params); - caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime()); + LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); - LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); - msg_text->setText(mText); + if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC) + { + if (mFromName.size() > 0) + { + style_params.font.style = "ITALIC"; + + msg_text->setText(mFromName, style_params); + } + mText = mText.substr(3); + style_params.font.style = "ITALIC"; +#define INFINITE_REFLOW_BUG 0 +#if INFINITE_REFLOW_BUG + // This causes LLTextBase::reflow() to infinite loop until the viewer + // runs out of memory, throws a bad_alloc exception from std::vector + // in mLineInfoList, and the main loop catches it and continues. + // It appears to be caused by addText() adding a line separator in the + // middle of a line. See EXT-2579, EXT-1949 + msg_text->addText(mText,style_params); +#else + msg_text->appendText(mText, FALSE, style_params); +#endif + } + else + { + msg_text->setText(mText, style_params); + } + + LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); if(mSourceType != CHAT_SOURCE_AGENT) msg_inspector->setVisible(false); @@ -171,7 +226,17 @@ void LLNearbyChatToastPanel::setMessage (const LLChat& chat_msg) notification["from_id"] = chat_msg.mFromID; notification["time"] = chat_msg.mTime; notification["source"] = (S32)chat_msg.mSourceType; - + notification["chat_type"] = (S32)chat_msg.mChatType; + notification["chat_style"] = (S32)chat_msg.mChatStyle; + + std::string r_color_name="White"; + F32 r_color_alpha = 1.0f; + LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha); + + notification["text_color"] = r_color_name; + notification["color_alpha"] = r_color_alpha; + + notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ; init(notification); } @@ -201,11 +266,17 @@ void LLNearbyChatToastPanel::setWidth(S32 width) text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/); LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); + + LLStyle::Params style_params; + style_params.color(mTextColor); + style_params.font(mFont); + + if(mText.length()) - msg_text->setText(mText); + msg_text->setText(mText, style_params); for(size_t i=0;i<mMessages.size();++i) - msg_text->addText(mMessages[i]); + msg_text->addText(mMessages[i] , style_params); setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width , getRect().mBottom)); snapToMessageHeight (); diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h index 8fb045b6d912f7bac2c2eeba3513093219730977..a65bfedd0964f61786e2a2539d4beeaab7e672ee 100644 --- a/indra/newview/llchatitemscontainerctrl.h +++ b/indra/newview/llchatitemscontainerctrl.h @@ -36,7 +36,7 @@ #include "llpanel.h" #include "llscrollbar.h" #include "string" -#include "llchat.h" +#include "llviewerchat.h" #include "lltoastpanel.h" typedef enum e_show_item_header @@ -59,7 +59,7 @@ class LLNearbyChatToastPanel: public LLToastPanelBase const LLUUID& getFromID() const { return mFromID;} - void addText (const std::string& message); + void addText (const std::string& message , const LLStyle::Params& input_params = LLStyle::Params()); void setMessage (const LLChat& msg); void setWidth (S32 width); void snapToMessageHeight (); @@ -89,6 +89,8 @@ class LLNearbyChatToastPanel: public LLToastPanelBase std::string mFromName; // agent or object name LLUUID mFromID; // agent id or object id EChatSourceType mSourceType; + LLColor4 mTextColor; + LLFontGL* mFont; std::vector<std::string> mMessages; diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp index 12626e3b43b60254c0dfacd22bb32819a83c233c..bb0ec2db27ee8c5f9ced894da3fcfe2a9971ed05 100644 --- a/indra/newview/llchatmsgbox.cpp +++ b/indra/newview/llchatmsgbox.cpp @@ -84,7 +84,7 @@ LLChatMsgBox::LLChatMsgBox(const Params& p) : mBlockSpacing(p.block_spacing) {} -void LLChatMsgBox::addText( const LLStringExplicit& text ) +void LLChatMsgBox::addText( const LLStringExplicit& text , const LLStyle::Params& input_params ) { S32 length = getLength(); // if there is existing text, add a separator @@ -94,5 +94,5 @@ void LLChatMsgBox::addText( const LLStringExplicit& text ) insertSegment(new ChatSeparator(length - 1, length - 1)); } // prepend newline only if there is some existing text - appendText(text, length > 0); + appendText(text, length > 0, input_params); } diff --git a/indra/newview/llchatmsgbox.h b/indra/newview/llchatmsgbox.h index df29db58c320891f00373cb6b12b8d62661ea05d..9e1661672925d32749f5dcfbef53665902216b02 100644 --- a/indra/newview/llchatmsgbox.h +++ b/indra/newview/llchatmsgbox.h @@ -61,7 +61,7 @@ class LLChatMsgBox : friend class LLUICtrlFactory; public: - void addText(const LLStringExplicit &text); + void addText(const LLStringExplicit &text, const LLStyle::Params& input_params = LLStyle::Params()); private: S32 mBlockSpacing; diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index c200a97058826779c1acd96c6c1aa01246819384..90f246ddaffdfdd9a928943b5b314a6d297e443a 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1,34 +1,34 @@ /** -* @file llchiclet.cpp -* @brief LLChiclet 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$ -*/ + * @file llchiclet.cpp + * @brief LLChiclet 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" // must be first include #include "llchiclet.h" @@ -43,6 +43,7 @@ #include "lllocalcliprect.h" #include "llmenugl.h" #include "lloutputmonitorctrl.h" +#include "llscriptfloater.h" #include "lltextbox.h" #include "llvoiceclient.h" #include "llvoicecontrolpanel.h" @@ -54,6 +55,16 @@ static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel"); static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification"); static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p"); static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group"); +static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc"); +static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script"); + +static const LLRect CHICLET_RECT(0, 25, 25, 0); +static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0); +static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0); +static const S32 OVERLAY_ICON_SHIFT = 2; // used for shifting of an overlay icon for new massages in a chiclet + +// static +const S32 LLChicletPanel::s_scroll_ratio = 10; S32 LLNotificationChiclet::mUreadSystemNotifications = 0; @@ -72,30 +83,21 @@ LLNotificationChiclet::Params::Params() button.tab_stop(FALSE); button.label(LLStringUtil::null); - unread_notifications.name("unread"); - unread_notifications.font(LLFontGL::getFontSansSerif()); - unread_notifications.text_color=(LLColor4::white); - unread_notifications.font_halign(LLFontGL::HCENTER); - unread_notifications.mouse_opaque(FALSE); } LLNotificationChiclet::LLNotificationChiclet(const Params& p) : LLChiclet(p) , mButton(NULL) -, mCounterCtrl(NULL) +, mCounter(0) { LLButton::Params button_params = p.button; - button_params.rect(p.rect()); mButton = LLUICtrlFactory::create<LLButton>(button_params); addChild(mButton); - LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications; - mCounterCtrl = LLUICtrlFactory::create<LLChicletNotificationCounterCtrl>(unread_params); - addChild(mCounterCtrl); - // connect counter handlers to the signals connectCounterUpdatersToSignal("notify"); connectCounterUpdatersToSignal("groupnotify"); + connectCounterUpdatersToSignal("offer"); } LLNotificationChiclet::~LLNotificationChiclet() @@ -116,13 +118,15 @@ void LLNotificationChiclet::connectCounterUpdatersToSignal(std::string notificat void LLNotificationChiclet::setCounter(S32 counter) { - mCounterCtrl->setCounter(counter); -} + std::string s_count; + if(counter != 0) + { + s_count = llformat("%d", counter); + } -void LLNotificationChiclet::setShowCounter(bool show) -{ - LLChiclet::setShowCounter(show); - mCounterCtrl->setVisible(getShowCounter()); + mButton->setLabel(s_count); + + mCounter = counter; } boost::signals2::connection LLNotificationChiclet::setClickCallback( @@ -161,7 +165,7 @@ LLChiclet::~LLChiclet() boost::signals2::connection LLChiclet::setLeftButtonClickCallback( const commit_callback_t& cb) { - return mCommitSignal.connect(cb); + return setCommitCallback(cb); } BOOL LLChiclet::handleMouseDown(S32 x, S32 y, MASK mask) @@ -199,7 +203,9 @@ void LLChiclet::setValue(const LLSD& value) LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) : LLChiclet(p) +, mShowSpeaker(false) , mNewMessagesIcon(NULL) +, mSpeakerCtrl(NULL) , mCounterCtrl(NULL) { // initialize an overlay icon for new messages @@ -207,17 +213,53 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) icon_params.visible = false; icon_params.image = LLUI::getUIImage(p.new_messages_icon_name); mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mNewMessagesIcon); + // adjust size and position of an icon LLRect chiclet_rect = p.rect; - LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2); - // shift an icon a little bit to the right and up corner of a chiclet - overlay_icon_rect.translate(overlay_icon_rect.getWidth()/5, overlay_icon_rect.getHeight()/5); + LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.getHeight(), chiclet_rect.getWidth(), chiclet_rect.getHeight()/2); mNewMessagesIcon->setRect(overlay_icon_rect); - addChild(mNewMessagesIcon); + + // shift an icon a little bit to the right and up corner of a chiclet + overlay_icon_rect.translate(OVERLAY_ICON_SHIFT, OVERLAY_ICON_SHIFT); setShowCounter(false); } +void LLIMChiclet::setShowSpeaker(bool show) +{ + bool needs_resize = getShowSpeaker() != show; + if(needs_resize) + { + mShowSpeaker = show; + toggleSpeakerControl(); + onChicletSizeChanged(); + } +} +void LLIMChiclet::initSpeakerControl() +{ + // virtual +} + +void LLIMChiclet::toggleSpeakerControl() +{ + LLRect speaker_rect = mSpeakerCtrl->getRect(); + S32 required_width = getRect().getWidth(); + + if(getShowSpeaker()) + { + required_width = required_width + speaker_rect.getWidth(); + initSpeakerControl(); + } + else + { + required_width = required_width - speaker_rect.getWidth(); + } + + reshape(required_width, getRect().getHeight()); + mSpeakerCtrl->setVisible(getShowSpeaker()); +} + void LLIMChiclet::setShowNewMessagesIcon(bool show) { if(mNewMessagesIcon) @@ -300,7 +342,7 @@ LLIMP2PChiclet::Params::Params() , show_speaker("show_speaker") { // *TODO Vadim: Get rid of hardcoded values. - rect(LLRect(0, 25, 25, 0)); + rect(CHICLET_RECT); avatar_icon.name("avatar_icon"); avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM); @@ -309,11 +351,10 @@ LLIMP2PChiclet::Params::Params() // Changed icon height from 25 to 24 to fix ticket EXT-794. // In some cases(after changing UI scale) 25 pixel height icon was // drawn incorrectly, i'm not sure why. - avatar_icon.rect(LLRect(0, 24, 25, 0)); + avatar_icon.rect(CHICLET_ICON_RECT); avatar_icon.mouse_opaque(false); unread_notifications.name("unread"); - unread_notifications.rect(LLRect(25, 25, 45, 0)); unread_notifications.font(LLFontGL::getFontSansSerif()); unread_notifications.font_halign(LLFontGL::HCENTER); unread_notifications.v_pad(5); @@ -322,7 +363,9 @@ LLIMP2PChiclet::Params::Params() unread_notifications.visible(false); speaker.name("speaker"); - speaker.rect(LLRect(45, 25, 65, 0)); + speaker.rect(VOICE_INDICATOR_RECT); + speaker.auto_update(true); + speaker.draw_border(false); show_speaker = false; } @@ -330,7 +373,6 @@ LLIMP2PChiclet::Params::Params() LLIMP2PChiclet::LLIMP2PChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon; @@ -358,18 +400,9 @@ void LLIMP2PChiclet::setCounter(S32 counter) setShowNewMessagesIcon(counter); } -LLRect LLIMP2PChiclet::getRequiredRect() +void LLIMP2PChiclet::initSpeakerControl() { - LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); - if(getShowCounter()) - { - rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); - } - if(getShowSpeaker()) - { - rect.mRight += mSpeakerCtrl->getRect().getWidth(); - } - return rect; + mSpeakerCtrl->setSpeakerId(getOtherParticipantId()); } void LLIMP2PChiclet::setOtherParticipantId(const LLUUID& other_participant_id) @@ -388,7 +421,6 @@ void LLIMP2PChiclet::updateMenuItems() bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId()); mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend); - mPopupMenu->getChild<LLUICtrl>("Remove Friend")->setEnabled(is_friend); } BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -444,17 +476,9 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data) { LLAvatarActions::requestFriendshipDialog(other_participant_id); } -} - -void LLIMP2PChiclet::setShowSpeaker(bool show) -{ - LLIMChiclet::setShowSpeaker(show); - - bool needs_resize = getShowSpeaker() != show; - mSpeakerCtrl->setVisible(getShowSpeaker()); - if(needs_resize) + else if("end" == level) { - onChicletSizeChanged(); + LLAvatarActions::endIM(other_participant_id); } } @@ -470,7 +494,7 @@ LLAdHocChiclet::Params::Params() , avatar_icon_color("avatar_icon_color", LLColor4::green) { // *TODO Vadim: Get rid of hardcoded values. - rect(LLRect(0, 25, 25, 0)); + rect(CHICLET_RECT); avatar_icon.name("avatar_icon"); avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM); @@ -479,11 +503,10 @@ LLAdHocChiclet::Params::Params() // Changed icon height from 25 to 24 to fix ticket EXT-794. // In some cases(after changing UI scale) 25 pixel height icon was // drawn incorrectly, i'm not sure why. - avatar_icon.rect(LLRect(0, 24, 25, 0)); + avatar_icon.rect(CHICLET_ICON_RECT); avatar_icon.mouse_opaque(false); unread_notifications.name("unread"); - unread_notifications.rect(LLRect(25, 25, 45, 0)); unread_notifications.font(LLFontGL::getFontSansSerif()); unread_notifications.font_halign(LLFontGL::HCENTER); unread_notifications.v_pad(5); @@ -493,7 +516,9 @@ LLAdHocChiclet::Params::Params() speaker.name("speaker"); - speaker.rect(LLRect(45, 25, 65, 0)); + speaker.rect(VOICE_INDICATOR_RECT); + speaker.auto_update(true); + speaker.draw_border(false); show_speaker = false; } @@ -501,7 +526,6 @@ LLAdHocChiclet::Params::Params() LLAdHocChiclet::LLAdHocChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon; @@ -532,24 +556,40 @@ void LLAdHocChiclet::setSessionId(const LLUUID& session_id) mChicletIconCtrl->setValue(im_session->mOtherParticipantID); } -void LLAdHocChiclet::setCounter(S32 counter) +void LLAdHocChiclet::draw() { - mCounterCtrl->setCounter(counter); - setShowNewMessagesIcon(counter); + switchToCurrentSpeaker(); + LLIMChiclet::draw(); } -LLRect LLAdHocChiclet::getRequiredRect() +void LLAdHocChiclet::initSpeakerControl() { - LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); - if(getShowCounter()) - { - rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); - } - if(getShowSpeaker()) + switchToCurrentSpeaker(); +} + +void LLAdHocChiclet::switchToCurrentSpeaker() +{ + LLUUID speaker_id; + LLSpeakerMgr::speaker_list_t speaker_list; + + LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE); + for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) { - rect.mRight += mSpeakerCtrl->getRect().getWidth(); + LLPointer<LLSpeaker> s = *i; + if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING) + { + speaker_id = s->mID; + break; + } } - return rect; + + mSpeakerCtrl->setSpeakerId(speaker_id); +} + +void LLAdHocChiclet::setCounter(S32 counter) +{ + mCounterCtrl->setCounter(counter); + setShowNewMessagesIcon(counter); } BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -563,8 +603,11 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) LLIMGroupChiclet::Params::Params() : group_icon("group_icon") +, unread_notifications("unread_notifications") +, speaker("speaker") +, show_speaker("show_speaker") { - rect(LLRect(0, 25, 25, 0)); + rect(CHICLET_RECT); group_icon.name("group_icon"); @@ -572,10 +615,9 @@ LLIMGroupChiclet::Params::Params() // Changed icon height from 25 to 24 to fix ticket EXT-794. // In some cases(after changing UI scale) 25 pixel height icon was // drawn incorrectly, i'm not sure why. - group_icon.rect(LLRect(0, 24, 25, 0)); + group_icon.rect(CHICLET_ICON_RECT); unread_notifications.name("unread"); - unread_notifications.rect(LLRect(25, 25, 45, 0)); unread_notifications.font(LLFontGL::getFontSansSerif()); unread_notifications.font_halign(LLFontGL::HCENTER); unread_notifications.v_pad(5); @@ -583,7 +625,9 @@ LLIMGroupChiclet::Params::Params() unread_notifications.visible(false); speaker.name("speaker"); - speaker.rect(LLRect(45, 25, 65, 0)); + speaker.rect(VOICE_INDICATOR_RECT); + speaker.auto_update(true); + speaker.draw_border(false); show_speaker = false; } @@ -592,7 +636,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p) : LLIMChiclet(p) , LLGroupMgrObserver(LLUUID::null) , mChicletIconCtrl(NULL) -, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletGroupIconCtrl::Params avatar_params = p.group_icon; @@ -625,18 +668,34 @@ void LLIMGroupChiclet::setCounter(S32 counter) setShowNewMessagesIcon(counter); } -LLRect LLIMGroupChiclet::getRequiredRect() +void LLIMGroupChiclet::draw() { - LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); - if(getShowCounter()) - { - rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); - } - if(getShowSpeaker()) + switchToCurrentSpeaker(); + LLIMChiclet::draw(); +} + +void LLIMGroupChiclet::initSpeakerControl() +{ + switchToCurrentSpeaker(); +} + +void LLIMGroupChiclet::switchToCurrentSpeaker() +{ + LLUUID speaker_id; + LLSpeakerMgr::speaker_list_t speaker_list; + + LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE); + for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) { - rect.mRight += mSpeakerCtrl->getRect().getWidth(); + LLPointer<LLSpeaker> s = *i; + if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING) + { + speaker_id = s->mID; + break; + } } - return rect; + + mSpeakerCtrl->setSpeakerId(speaker_id); } void LLIMGroupChiclet::setSessionId(const LLUUID& session_id) @@ -715,26 +774,19 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data) if("group chat" == level) { - LLGroupActions::startChat(group_id); + LLGroupActions::startIM(group_id); } else if("info" == level) { LLGroupActions::show(group_id); } -} - -void LLIMGroupChiclet::setShowSpeaker(bool show) -{ - LLIMChiclet::setShowSpeaker(show); - - bool needs_resize = getShowSpeaker() != show; - mSpeakerCtrl->setVisible(getShowSpeaker()); - if(needs_resize) + else if("end" == level) { - onChicletSizeChanged(); + LLGroupActions::endIM(group_id); } } + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -742,8 +794,6 @@ void LLIMGroupChiclet::setShowSpeaker(bool show) LLChicletPanel::Params::Params() : chiclet_padding("chiclet_padding") , scrolling_offset("scrolling_offset") -, left_scroll_button("left_scroll_button") -, right_scroll_button("right_scroll_button") , min_width("min_width") { chiclet_padding = 3; @@ -752,26 +802,8 @@ LLChicletPanel::Params::Params() if (!min_width.isProvided()) { // min_width = 4 chiclets + 3 paddings - min_width = 179 + 3*chiclet_padding; + min_width = 180 + 3*chiclet_padding; } - - LLRect scroll_button_rect(0, 25, 19, 5); - - left_scroll_button.name("left_scroll"); - left_scroll_button.label(LLStringUtil::null); - left_scroll_button.rect(scroll_button_rect); - left_scroll_button.tab_stop(false); - left_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga")); - left_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_left.tga")); - left_scroll_button.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga")); - - right_scroll_button.name("right_scroll"); - right_scroll_button.label(LLStringUtil::null); - right_scroll_button.rect(scroll_button_rect); - right_scroll_button.tab_stop(false); - right_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga")); - right_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_right.tga")); - right_scroll_button.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga")); }; LLChicletPanel::LLChicletPanel(const Params&p) @@ -784,24 +816,8 @@ LLChicletPanel::LLChicletPanel(const Params&p) , mMinWidth(p.min_width) , mShowControls(true) { - LLButton::Params scroll_button_params = p.left_scroll_button; - - mLeftScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params); - addChild(mLeftScrollButton); - LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton); - - mLeftScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this)); - mLeftScrollButton->setEnabled(false); - - scroll_button_params = p.right_scroll_button; - mRightScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params); - addChild(mRightScrollButton); - LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton); - - mRightScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this)); - mRightScrollButton->setEnabled(false); - LLPanel::Params panel_params; + panel_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT); mScrollArea = LLUICtrlFactory::create<LLPanel>(panel_params,this); // important for Show/Hide Camera and Move controls menu in bottom tray to work properly @@ -820,8 +836,17 @@ LLChicletPanel::~LLChicletPanel() void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ LLUUID session_id = data["session_id"].asUUID(); + LLUUID from_id = data["from_id"].asUUID(); + const std::string from = data["from"].asString(); S32 unread = data["num_unread"].asInteger(); + // if new message came + if(unread != 0) + { + //we do not show balloon (indicator of new messages) for system messages and our own messages + if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return; + } + LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); if (im_floater && im_floater->getVisible()) { @@ -841,7 +866,6 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ llwarns << "Unable to set counter for chiclet " << session_id << llendl; } } - } @@ -851,38 +875,94 @@ BOOL LLChicletPanel::postBuild() LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1)); LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1)); LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1)); + LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1)); + + mLeftScrollButton=getChild<LLButton>("chicklet_left_scroll_button"); + LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton); + mLeftScrollButton->setMouseDownCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this)); + mLeftScrollButton->setHeldDownCallback(boost::bind(&LLChicletPanel::onLeftScrollHeldDown,this)); + mLeftScrollButton->setEnabled(false); + + mRightScrollButton=getChild<LLButton>("chicklet_right_scroll_button"); + LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton); + mRightScrollButton->setMouseDownCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this)); + mRightScrollButton->setHeldDownCallback(boost::bind(&LLChicletPanel::onRightScrollHeldDown,this)); + mRightScrollButton->setEnabled(false); return TRUE; } -S32 LLChicletPanel::calcChickletPanleWidth() +void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id) { - S32 res = 0; + static LLUUID s_previous_active_voice_session_id; - for (chiclet_list_t::iterator it = mChicletList.begin(); it - != mChicletList.end(); it++) + std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id); + + for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it) { - res = (*it)->getRect().getWidth() + getChicletPadding(); + LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it); + if(chiclet) + { + chiclet->setShowSpeaker(true); + } } - return res; + + if(!s_previous_active_voice_session_id.isNull() && s_previous_active_voice_session_id != session_id) + { + chiclets = LLIMChiclet::sFindChicletsSignal(s_previous_active_voice_session_id); + + for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it) + { + LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it); + if(chiclet) + { + chiclet->setShowSpeaker(false); + } + } + } + + s_previous_active_voice_session_id = session_id; } bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index) { if(mScrollArea->addChild(chiclet)) { - // chicklets should be aligned to right edge of scroll panel - S32 offset = 0; + // chiclets should be aligned to right edge of scroll panel + S32 left_shift = 0; if (!canScrollLeft()) { - offset = mScrollArea->getRect().getWidth() - - chiclet->getRect().getWidth() - calcChickletPanleWidth(); + // init left shift for the first chiclet in the list... + if (mChicletList.empty()) + { + // ...start from the right border of the scroll area for the first added chiclet + left_shift = mScrollArea->getRect().getWidth(); + } + else + { + // ... start from the left border of the first chiclet minus padding + left_shift = getChiclet(0)->getRect().mLeft - getChicletPadding(); + } + + // take into account width of the being added chiclet + left_shift -= chiclet->getRequiredRect().getWidth(); + + // if we overflow the scroll area we do not need to shift chiclets + if (left_shift < 0) + { + left_shift = 0; + } } mChicletList.insert(mChicletList.begin() + index, chiclet); - getChiclet(0)->translate(offset, 0); + // shift first chiclet to place it in correct position. + // rest ones will be placed in arrange() + if (!canScrollLeft()) + { + getChiclet(0)->translate(left_shift - getChiclet(0)->getRect().mLeft, 0); + } chiclet->setLeftButtonClickCallback(boost::bind(&LLChicletPanel::onChicletClick, this, _1, _2)); chiclet->setChicletSizeChangedCallback(boost::bind(&LLChicletPanel::onChicletSizeChanged, this, _1, index)); @@ -898,30 +978,17 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index) void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param) { - S32 chiclet_width = ctrl->getRect().getWidth(); - S32 chiclet_new_width = ctrl->getRequiredRect().getWidth(); - - if(chiclet_new_width == chiclet_width) - { - return; - } - - LLRect chiclet_rect = ctrl->getRect(); - chiclet_rect.mRight = chiclet_rect.mLeft + chiclet_new_width; - - ctrl->setRect(chiclet_rect); - - S32 offset = chiclet_new_width - chiclet_width; - S32 index = getChicletIndex(ctrl); - - shiftChiclets(offset, index + 1); + arrange(); trimChiclets(); showScrollButtonsIfNeeded(); } void LLChicletPanel::onChicletClick(LLUICtrl*ctrl,const LLSD¶m) { - mCommitSignal(ctrl,param); + if (mCommitSignal) + { + (*mCommitSignal)(ctrl,param); + } } void LLChicletPanel::removeChiclet(chiclet_list_t::iterator it) @@ -1026,23 +1093,24 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent ) static const S32 SCROLL_BUTTON_PAD = 5; + //Needed once- to avoid error at first call of reshape() before postBuild() + if(!mLeftScrollButton||!mRightScrollButton) + return; + LLRect scroll_button_rect = mLeftScrollButton->getRect(); - mLeftScrollButton->setRect(LLRect(0,height,scroll_button_rect.getWidth(), - height - scroll_button_rect.getHeight())); - + mLeftScrollButton->setRect(LLRect(0,scroll_button_rect.mTop,scroll_button_rect.getWidth(), + scroll_button_rect.mBottom)); scroll_button_rect = mRightScrollButton->getRect(); - mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),height, - width, height - scroll_button_rect.getHeight())); - + mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),scroll_button_rect.mTop, + width, scroll_button_rect.mBottom)); mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD, height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0)); - - mShowControls = width > mMinWidth; + mShowControls = width >= mMinWidth; mScrollArea->setVisible(mShowControls); trimChiclets(); - showScrollButtonsIfNeeded(); + } void LLChicletPanel::arrange() @@ -1206,10 +1274,26 @@ void LLChicletPanel::onRightScrollClick() scrollRight(); } +void LLChicletPanel::onLeftScrollHeldDown() +{ + S32 offset = mScrollingOffset; + mScrollingOffset = mScrollingOffset / s_scroll_ratio; + scrollLeft(); + mScrollingOffset = offset; +} + +void LLChicletPanel::onRightScrollHeldDown() +{ + S32 offset = mScrollingOffset; + mScrollingOffset = mScrollingOffset / s_scroll_ratio; + scrollRight(); + mScrollingOffset = offset; +} + boost::signals2::connection LLChicletPanel::setChicletClickedCallback( const commit_callback_t& cb) { - return mCommitSignal.connect(cb); + return setCommitCallback(cb); } BOOL LLChicletPanel::handleScrollWheel(S32 x, S32 y, S32 clicks) @@ -1329,6 +1413,54 @@ void LLChicletGroupIconCtrl::setValue(const LLSD& value ) ////////////////////////////////////////////////////////////////////////// LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p) - : LLIconCtrl(p) + : LLOutputMonitorCtrl(p) { } + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLScriptChiclet::Params::Params() + : icon("icon") +{ + // *TODO Vadim: Get rid of hardcoded values. + rect(CHICLET_RECT); + icon.rect(CHICLET_ICON_RECT); +} + +LLScriptChiclet::LLScriptChiclet(const Params&p) + : LLIMChiclet(p) + , mChicletIconCtrl(NULL) +{ + LLIconCtrl::Params icon_params = p.icon; + mChicletIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + // Let "new message" icon be on top, else it will be hidden behind chiclet icon. + addChildInBack(mChicletIconCtrl); +} + +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()); + } +} + +void LLScriptChiclet::onMouseDown() +{ + LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId()); +} + +BOOL LLScriptChiclet::handleMouseDown(S32 x, S32 y, MASK mask) +{ + onMouseDown(); + return LLChiclet::handleMouseDown(x, y, mask); +} + +// EOF diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index b50702205cda88abc1759ad9962df512a2cf568e..1ea141e6c4766d16faf3a990d0c0e54877c59323 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -1,34 +1,34 @@ /** -* @file llchiclet.h -* @brief LLChiclet 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$ -*/ + * @file llchiclet.h + * @brief LLChiclet 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_LLCHICLET_H #define LL_LLCHICLET_H @@ -44,9 +44,9 @@ class LLVoiceControlPanel; class LLMenuGL; class LLIMFloater; -/* +/** * Class for displaying amount of messages/notifications(unread). -*/ + */ class LLChicletNotificationCounterCtrl : public LLTextBox { public: @@ -57,30 +57,30 @@ class LLChicletNotificationCounterCtrl : public LLTextBox {}; }; - /* + /** * Sets number of notifications - */ + */ virtual void setCounter(S32 counter); - /* + /** * Returns number of notifications - */ + */ virtual S32 getCounter() const { return mCounter; } - /* + /** * Returns width, required to display amount of notifications in text form. * Width is the only valid value. - */ + */ /*virtual*/ LLRect getRequiredRect(); - /* + /** * Sets number of notifications using LLSD - */ + */ /*virtual*/ void setValue(const LLSD& value); - /* + /** * Returns number of notifications wrapped in LLSD - */ + */ /*virtual*/ LLSD getValue() const; protected: @@ -94,9 +94,9 @@ class LLChicletNotificationCounterCtrl : public LLTextBox S32 mInitialWidth; }; -/* +/** * Class for displaying avatar's icon in P2P chiclet. -*/ + */ class LLChicletAvatarIconCtrl : public LLAvatarIconCtrl { public: @@ -107,6 +107,7 @@ class LLChicletAvatarIconCtrl : public LLAvatarIconCtrl { draw_tooltip(FALSE); mouse_opaque(FALSE); + default_icon_name("Generic_Person"); }; }; @@ -128,7 +129,7 @@ class LLChicletGroupIconCtrl : public LLIconCtrl Optional<std::string> default_icon; Params() - : default_icon("default_icon", "default_land_picture.j2c") + : default_icon("default_icon", "Generic_Group") { }; }; @@ -146,14 +147,14 @@ class LLChicletGroupIconCtrl : public LLIconCtrl std::string mDefaultIcon; }; -/* - * Class for displaying status of Voice Chat -*/ -class LLChicletSpeakerCtrl : public LLIconCtrl +/** + * Class for displaying of speaker's voice indicator + */ +class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl { public: - struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params> + struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params> { Params(){}; }; @@ -163,7 +164,7 @@ class LLChicletSpeakerCtrl : public LLIconCtrl friend class LLUICtrlFactory; }; -/* +/** * Base class for all chiclets. */ class LLChiclet : public LLUICtrl @@ -179,59 +180,59 @@ class LLChiclet : public LLUICtrl /*virtual*/ ~LLChiclet(); - /* + /** * Associates chat session id with chiclet. - */ + */ virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; } - /* + /** * Returns associated chat session. - */ + */ virtual const LLUUID& getSessionId() const { return mSessionId; } - /* + /** * Sets number of unread notifications. - */ + */ virtual void setCounter(S32 counter) = 0; - /* + /** * Returns number of unread notifications. - */ + */ virtual S32 getCounter() = 0; - /* + /** * Sets show counter state. - */ + */ virtual void setShowCounter(bool show) { mShowCounter = show; } - /* + /** * Returns show counter state. - */ + */ virtual bool getShowCounter() {return mShowCounter;}; - /* + /** * Connects chiclet clicked event with callback. - */ + */ /*virtual*/ boost::signals2::connection setLeftButtonClickCallback( const commit_callback_t& cb); typedef boost::function<void (LLChiclet* ctrl, const LLSD& param)> chiclet_size_changed_callback_t; - /* + /** * Connects chiclets size changed event with callback. - */ + */ virtual boost::signals2::connection setChicletSizeChangedCallback( const chiclet_size_changed_callback_t& cb); - /* + /** * Sets IM Session id using LLSD - */ + */ /*virtual*/ LLSD getValue() const; - /* + /** * Returns IM Session id using LLSD - */ + */ /*virtual*/ void setValue(const LLSD& value); protected: @@ -239,14 +240,14 @@ class LLChiclet : public LLUICtrl friend class LLUICtrlFactory; LLChiclet(const Params& p); - /* + /** * Notifies subscribers about click on chiclet. - */ + */ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); - /* + /** * Notifies subscribers about chiclet size changed event. - */ + */ virtual void onChicletSizeChanged(); private: @@ -262,13 +263,11 @@ class LLChiclet : public LLUICtrl }; -/* -* Base class for Instant Message chiclets. -* IMChiclet displays icon, number of unread messages(optional) -* and voice chat status(optional). -* Every chiclet should override LLUICtrl::getRequiredRect and return -* desired width. -*/ +/** + * Base class for Instant Message chiclets. + * IMChiclet displays icon, number of unread messages(optional) + * and voice chat status(optional). + */ class LLIMChiclet : public LLChiclet { public: @@ -289,46 +288,53 @@ class LLIMChiclet : public LLChiclet /*virtual*/ ~LLIMChiclet() {}; - /* + /** * Sets IM session name. This name will be displayed in chiclet tooltip. - */ + */ virtual void setIMSessionName(const std::string& name) { setToolTip(name); } - /* + /** * Sets id of person/group user is chatting with. * Session id should be set before calling this - */ + */ virtual void setOtherParticipantId(const LLUUID& other_participant_id) { mOtherParticipantId = other_participant_id; } - /* + /** * Gets id of person/group user is chatting with. */ virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; } - /* - * Shows/hides voice chat status control. - */ - virtual void setShowSpeaker(bool show) { mShowSpeaker = show; } + /** + * Init Speaker Control with speaker's ID + */ + virtual void initSpeakerControl(); + + /** + * set status (Shows/Hide) for voice control. + */ + virtual void setShowSpeaker(bool show); - /* + /** * Returns voice chat status control visibility. - */ + */ virtual bool getShowSpeaker() {return mShowSpeaker;}; - /* - * Shows/hides overlay icon concerning new unread messages. - */ + /** + * Shows/Hides for voice control for a chiclet. + */ + virtual void toggleSpeakerControl(); + + /** + * Shows/hides overlay icon concerning new unread messages. + */ virtual void setShowNewMessagesIcon(bool show); - /* - * Returns visibility of overlay icon concerning new unread messages. - */ + /** + * Returns visibility of overlay icon concerning new unread messages. + */ virtual bool getShowNewMessagesIcon(); - /* - * Draws border around chiclet. - */ - /*virtual*/ void draw(); + virtual void draw(); /** * Determine whether given ID refers to a group or an IM chat session. @@ -363,6 +369,8 @@ class LLIMChiclet : public LLChiclet LLIconCtrl* mNewMessagesIcon; LLChicletNotificationCounterCtrl* mCounterCtrl; + LLChicletSpeakerCtrl* mSpeakerCtrl; + /** the id of another participant, either an avatar id or a group id*/ LLUUID mOtherParticipantId; @@ -410,54 +418,50 @@ class LLIMP2PChiclet : public LLIMChiclet /* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id); - /*virtual*/ void setShowSpeaker(bool show); - - /* - * Sets number of unread messages. Will update chiclet's width if number text - * exceeds size of counter and notify it's parent about size change. - */ + /** + * Sets number of unread messages. Will update chiclet's width if number text + * exceeds size of counter and notify it's parent about size change. + */ /*virtual*/ void setCounter(S32); - /* - * Returns number of unread messages. - */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /** + * Init Speaker Control with speaker's ID + */ + /*virtual*/ void initSpeakerControl(); - /* - * Returns rect, required to display chiclet. - * Width is the only valid value. - */ - /*virtual*/ LLRect getRequiredRect(); + /** + * Returns number of unread messages. + */ + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } protected: LLIMP2PChiclet(const Params& p); friend class LLUICtrlFactory; - /* - * Creates chiclet popup menu. Will create P2P or Group IM Chat menu - * based on other participant's id. - */ + /** + * Creates chiclet popup menu. Will create P2P or Group IM Chat menu + * based on other participant's id. + */ virtual void createPopupMenu(); - /* - * Processes clicks on chiclet popup menu. - */ + /** + * Processes clicks on chiclet popup menu. + */ virtual void onMenuItemClicked(const LLSD& user_data); - /* - * Displays popup menu. - */ + /** + * Displays popup menu. + */ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - /* - * Enables/disables menus based on relationship with other participant. - */ + /** + * Enables/disables menus based on relationship with other participant. + */ virtual void updateMenuItems(); private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -488,39 +492,87 @@ class LLAdHocChiclet : public LLIMChiclet */ /*virtual*/ void setSessionId(const LLUUID& session_id); - /* - * Sets number of unread messages. Will update chiclet's width if number text - * exceeds size of counter and notify it's parent about size change. - */ + /** + * Sets number of unread messages. Will update chiclet's width if number text + * exceeds size of counter and notify it's parent about size change. + */ /*virtual*/ void setCounter(S32); - /* - * Returns number of unread messages. - */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /** + * Keep Speaker Control with actual speaker's ID + */ + /*virtual*/ void draw(); - /* - * Returns rect, required to display chiclet. - * Width is the only valid value. - */ - /*virtual*/ LLRect getRequiredRect(); + /** + * Init Speaker Control with speaker's ID + */ + /*virtual*/ void initSpeakerControl(); + + /** + * Returns number of unread messages. + */ + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } protected: LLAdHocChiclet(const Params& p); friend class LLUICtrlFactory; - /* - * Displays popup menu. - */ + /** + * 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(); + private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; +/** + * Chiclet for script floaters. + */ +class LLScriptChiclet : public LLIMChiclet +{ +public: + + struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params> + { + Optional<LLIconCtrl::Params> icon; + + Params(); + }; + + /*virtual*/ void setSessionId(const LLUUID& session_id); + + /*virtual*/ void setCounter(S32 counter){} + + /*virtual*/ S32 getCounter() { return 0; } + + /** + * Toggle script floater + */ + /*virtual*/ void onMouseDown(); + + /** + * Override default handler + */ + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); + +protected: + + LLScriptChiclet(const Params&); + friend class LLUICtrlFactory; + +private: + + LLIconCtrl* mChicletIconCtrl; +}; + /** * Implements Group chat chiclet. */ @@ -547,30 +599,32 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver */ /*virtual*/ void setSessionId(const LLUUID& session_id); + /** + * Keep Speaker Control with actual speaker's ID + */ + /*virtual*/ void draw(); + /** * Callback for LLGroupMgrObserver, we get this when group data is available or changed. * Sets group icon. */ /*virtual*/ void changed(LLGroupChange gc); - /*virtual*/ void setShowSpeaker(bool show); - - /* - * Sets number of unread messages. Will update chiclet's width if number text - * exceeds size of counter and notify it's parent about size change. - */ + /** + * Sets number of unread messages. Will update chiclet's width if number text + * exceeds size of counter and notify it's parent about size change. + */ /*virtual*/ void setCounter(S32); - /* - * Returns number of unread messages. - */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /** + * Init Speaker Control with speaker's ID + */ + /*virtual*/ void initSpeakerControl(); - /* - * Returns rect, required to display chiclet. - * Width is the only valid value. - */ - /*virtual*/ LLRect getRequiredRect(); + /** + * Returns number of unread messages. + */ + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } ~LLIMGroupChiclet(); @@ -578,33 +632,37 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver LLIMGroupChiclet(const Params& p); friend class LLUICtrlFactory; - /* - * Creates chiclet popup menu. Will create P2P or Group IM Chat menu - * based on other participant's id. - */ + /** + * Finds a current speaker and resets the SpeakerControl with speaker's ID + */ + /*virtual*/ void switchToCurrentSpeaker(); + + /** + * Creates chiclet popup menu. Will create P2P or Group IM Chat menu + * based on other participant's id. + */ virtual void createPopupMenu(); - /* - * Processes clicks on chiclet popup menu. - */ + /** + * Processes clicks on chiclet popup menu. + */ virtual void onMenuItemClicked(const LLSD& user_data); - /* - * Displays popup menu. - */ + /** + * Displays popup menu. + */ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); private: LLChicletGroupIconCtrl* mChicletIconCtrl; - LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; -/* +/** * Implements notification chiclet. Used to display total amount of unread messages * across all IM sessions, total amount of system notifications. -*/ + */ class LLNotificationChiclet : public LLChiclet { public: @@ -620,13 +678,14 @@ class LLNotificationChiclet : public LLChiclet /*virtual*/ void setCounter(S32 counter); - /*virtual*/S32 getCounter() { return mCounterCtrl->getCounter(); } - - /*virtual*/ void setShowCounter(bool show); + // *TODO: mantipov: seems getCounter is not necessary for LLNotificationChiclet + // but inherited interface requires it to implement. + // Probably it can be safe removed. + /*virtual*/S32 getCounter() { return mCounter; } boost::signals2::connection setClickCallback(const commit_callback_t& cb); - /*virtual*/ ~ LLNotificationChiclet(); + /*virtual*/ ~LLNotificationChiclet(); // methods for updating a number of unread System notifications void incUreadSystemNotifications() { setCounter(++mUreadSystemNotifications); } @@ -644,13 +703,13 @@ class LLNotificationChiclet : public LLChiclet protected: LLButton* mButton; - LLChicletNotificationCounterCtrl* mCounterCtrl; + S32 mCounter; }; -/* +/** * Storage class for all IM chiclets. Provides mechanism to display, * scroll, create, remove chiclets. -*/ + */ class LLChicletPanel : public LLPanel { public: @@ -660,9 +719,6 @@ class LLChicletPanel : public LLPanel Optional<S32> chiclet_padding, scrolling_offset; - Optional<LLButton::Params> left_scroll_button, - right_scroll_button; - Optional<S32> min_width; Params(); @@ -670,62 +726,62 @@ class LLChicletPanel : public LLPanel virtual ~LLChicletPanel(); - /* + /** * Creates chiclet and adds it to chiclet list at specified index. - */ + */ template<class T> T* createChiclet(const LLUUID& session_id, S32 index); - /* + /** * Creates chiclet and adds it to chiclet list at right. - */ + */ template<class T> T* createChiclet(const LLUUID& session_id); - /* + /** * Returns pointer to chiclet of specified type at specified index. - */ + */ template<class T> T* getChiclet(S32 index); - /* + /** * Returns pointer to LLChiclet at specified index. - */ + */ LLChiclet* getChiclet(S32 index) { return getChiclet<LLChiclet>(index); } - /* + /** * Searches a chiclet using IM session id. - */ + */ template<class T> T* findChiclet(const LLUUID& im_session_id); - /* + /** * Returns number of hosted chiclets. - */ + */ S32 getChicletCount() {return mChicletList.size();}; - /* + /** * Returns index of chiclet in list. - */ + */ S32 getChicletIndex(const LLChiclet* chiclet); - /* + /** * Removes chiclet by index. - */ + */ void removeChiclet(S32 index); - /* + /** * Removes chiclet by pointer. - */ + */ void removeChiclet(LLChiclet* chiclet); - /* + /** * Removes chiclet by IM session id. - */ + */ void removeChiclet(const LLUUID& im_session_id); - /* + /** * Removes all chiclets. - */ + */ void removeAll(); - /* + /** * Scrolls the panel to the specified chiclet */ void scrollToChiclet(const LLChiclet* chiclet); @@ -735,9 +791,14 @@ class LLChicletPanel : public LLPanel /*virtual*/ BOOL postBuild(); - /* + /** + * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl + */ + void onCurrentVoiceChannelChanged(const LLUUID& session_id); + + /** * Reshapes controls and rearranges chiclets if needed. - */ + */ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE ); /*virtual*/ void draw(); @@ -748,90 +809,107 @@ class LLChicletPanel : public LLPanel LLChicletPanel(const Params&p); friend class LLUICtrlFactory; - S32 calcChickletPanleWidth(); - - /* - * Adds chiclet to list and rearranges all chiclets. - */ + /** + * Adds chiclet to list and rearranges all chiclets. + * They should be right aligned, most recent right. See EXT-1293 + * + * It calculates position of the first chiclet in the list. Other chiclets are placed in arrange(). + * + * @see arrange() + */ bool addChiclet(LLChiclet*, S32 index); - /* - * Arranges chiclets. - */ + /** + * Arranges chiclets to have them in correct positions. + * + * Method bases on assumption that first chiclet has correct rect and starts from the its position. + * + * @see addChiclet() + */ void arrange(); - /* + /** * Returns true if chiclets can be scrolled right. - */ + */ bool canScrollRight(); - /* - * Returns true if chiclets can be scrolled left. - */ + /** + * Returns true if chiclets can be scrolled left. + */ bool canScrollLeft(); - /* - * Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled. - */ + /** + * Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled. + */ void showScrollButtonsIfNeeded(); - /* + /** * Shifts chiclets left or right. - */ + */ void shiftChiclets(S32 offset, S32 start_index = 0); - /* + /** * Removes gaps between first chiclet and scroll area left side, * last chiclet and scroll area right side. - */ + */ void trimChiclets(); - /* + /** * Scrolls chiclets to right or left. - */ + */ void scroll(S32 offset); - /* + /** * Verifies that chiclets can be scrolled left, then calls scroll() - */ + */ void scrollLeft(); - /* + /** * Verifies that chiclets can be scrolled right, then calls scroll() - */ + */ void scrollRight(); - /* + /** * Callback for left scroll button clicked - */ + */ void onLeftScrollClick(); - /* - * Callback for right scroll button clicked - */ + /** + * Callback for right scroll button clicked + */ void onRightScrollClick(); - /* + /** + * Callback for right scroll button held down event + */ + void onLeftScrollHeldDown(); + + /** + * Callback for left scroll button held down event + */ + void onRightScrollHeldDown(); + + /** * Callback for mouse wheel scrolled, calls scrollRight() or scrollLeft() - */ + */ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); - /* + /** * Notifies subscribers about click on chiclet. * Do not place any code here, instead subscribe on event (see setChicletClickedCallback). - */ + */ void onChicletClick(LLUICtrl*ctrl,const LLSD¶m); - /* + /** * Callback for chiclet size changed event, rearranges chiclets. - */ + */ void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param); typedef std::vector<LLChiclet*> chiclet_list_t; - /* + /** * Removes chiclet from scroll area and chiclet list. - */ + */ void removeChiclet(chiclet_list_t::iterator it); S32 getChicletPadding() { return mChicletPadding; } @@ -851,6 +929,7 @@ class LLChicletPanel : public LLPanel S32 mScrollingOffset; S32 mMinWidth; bool mShowControls; + static const S32 s_scroll_ratio; }; template<class T> diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index 040fad3c4a21618b03f1f4dea21d3b6ddec5caa2..10b7935caf00ab6937ff54bfe8098bd26cfa73c5 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -37,52 +37,70 @@ #include "lltrans.h" #include "llui.h" -static S32 age_days_from_date(const std::string& date_string, - const LLDate& now) -{ - // Convert string date to malleable representation - S32 month, day, year; - S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &month, &day, &year); - if (matched != 3) return S32_MIN; - - // Create ISO-8601 date string - std::string iso8601_date_string = - llformat("%04d-%02d-%02dT00:00:00Z", year, month, day); - LLDate date(iso8601_date_string); - - // Correct for the fact that account creation dates are in Pacific time, - // == UTC - 8 - F64 date_secs_since_epoch = date.secondsSinceEpoch(); - date_secs_since_epoch += 8.0 * 60.0 * 60.0; +static S32 DAYS_PER_MONTH_NOLEAP[] = + { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +static S32 DAYS_PER_MONTH_LEAP[] = + { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - // Convert seconds from epoch to seconds from now - F64 now_secs_since_epoch = now.secondsSinceEpoch(); - F64 age_secs = now_secs_since_epoch - date_secs_since_epoch; - - // We don't care about sub-day times - const F64 SEC_PER_DAY = 24.0 * 60.0 * 60.0; - S32 age_days = lltrunc(age_secs / SEC_PER_DAY); - - return age_days; +static S32 days_from_month(S32 year, S32 month) +{ + if (year % 4 == 0 + && year % 100 != 0) + { + // leap year + return DAYS_PER_MONTH_LEAP[month]; + } + else + { + return DAYS_PER_MONTH_NOLEAP[month]; + } } std::string LLDateUtil::ageFromDate(const std::string& date_string, const LLDate& now) { - S32 age_days = age_days_from_date(date_string, now); - if (age_days == S32_MIN) return "???"; + 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); + + S32 now_year, now_month, now_day; + now.split(&now_year, &now_month, &now_day); + + // Do grade-school subtraction, from right-to-left, borrowing from the left + // when things go negative + S32 age_days = (now_day - born_day); + if (age_days < 0) + { + now_month -= 1; + if (now_month == 0) + { + now_year -= 1; + now_month = 12; + } + age_days += days_from_month(now_year, now_month); + } + S32 age_months = (now_month - born_month); + if (age_months < 0) + { + now_year -= 1; + age_months += 12; + } + S32 age_years = (now_year - born_year); // Noun pluralization depends on language std::string lang = LLUI::getLanguage(); // Try for age in round number of years LLStringUtil::format_map_t args; - S32 age_years = age_days / 365; - age_days = age_days % 365; - // *NOTE: This is wrong. Not all months have 30 days, but we don't have a library - // for relative date arithmetic. :-( JC - S32 age_months = age_days / 30; - age_days = age_days % 30; if (age_months > 0 || age_years > 0) { diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index f76ec396ac2e1afc382e305a938cf01b8e7abd43..169a963d0d1b7f84944ee5482aabf637d1436548 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -79,16 +79,16 @@ void LLDebugView::init() r.set(150 - 25, rect.getHeight() - 50, rect.getWidth()/2 - 25, rect.getHeight() - 450); - r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f), - (S32) (gViewerWindow->getVirtualWindowRect().getHeight() * 0.75f)); + 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); - r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f), - (S32) (gViewerWindow->getVirtualWindowRect().getHeight() * 0.75f)); + r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), + (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); LLMemoryView::Params mp; mp.name("memory"); mp.rect(r); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 03a3f2b43de2434606adc8c2e7d16d4cb1b127d6..d60330024afedf42cb35e2dd6e08c7a19c141c29 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -89,7 +89,7 @@ LLDynamicArrayPtr<LLPointer<LLDrawable> > LLDrawable::sDeadList; void LLDrawable::incrementVisible() { sCurVisible++; - sCurPixelAngle = (F32) gViewerWindow->getWindowDisplayHeight()/LLViewerCamera::getInstance()->getView(); + sCurPixelAngle = (F32) gViewerWindow->getWindowHeightRaw()/LLViewerCamera::getInstance()->getView(); } void LLDrawable::init() { diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp index 45f4b4fbd04c47edd184a1e806cca80d86eadbe8..3961afe9af22546b381d92bded3da2db159a2a82 100644 --- a/indra/newview/lldriverparam.cpp +++ b/indra/newview/lldriverparam.cpp @@ -242,7 +242,7 @@ BOOL LLDriverParam::parseData(LLXmlTreeNode* node) } #endif -void LLDriverParam::setWeight(F32 weight, BOOL set_by_user) +void LLDriverParam::setWeight(F32 weight, BOOL upload_bake) { F32 min_weight = getMinWeight(); F32 max_weight = getMaxWeight(); @@ -301,7 +301,7 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user) driven_weight = driven_min; } - setDrivenWeight(driven,driven_weight,set_by_user); + setDrivenWeight(driven,driven_weight,upload_bake); continue; } else @@ -325,13 +325,13 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user) driven_weight = driven_min; } - setDrivenWeight(driven,driven_weight,set_by_user); + setDrivenWeight(driven,driven_weight,upload_bake); continue; } } driven_weight = getDrivenWeight(driven, mCurWeight); - setDrivenWeight(driven,driven_weight,set_by_user); + setDrivenWeight(driven,driven_weight,upload_bake); } } @@ -455,9 +455,9 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_ //----------------------------------------------------------------------------- // setAnimationTarget() //----------------------------------------------------------------------------- -void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user ) +void LLDriverParam::setAnimationTarget( F32 target_value, BOOL upload_bake ) { - LLVisualParam::setAnimationTarget(target_value, set_by_user); + LLVisualParam::setAnimationTarget(target_value, upload_bake); for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) { @@ -466,16 +466,16 @@ void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user ) // this isn't normally necessary, as driver params handle interpolation of their driven params // but texture params need to know to assume their final value at beginning of interpolation - driven->mParam->setAnimationTarget(driven_weight, set_by_user); + driven->mParam->setAnimationTarget(driven_weight, upload_bake); } } //----------------------------------------------------------------------------- // stopAnimating() //----------------------------------------------------------------------------- -void LLDriverParam::stopAnimating(BOOL set_by_user) +void LLDriverParam::stopAnimating(BOOL upload_bake) { - LLVisualParam::stopAnimating(set_by_user); + LLVisualParam::stopAnimating(upload_bake); for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) { @@ -585,7 +585,7 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight return driven_weight; } -void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user) +void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake) { LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject(); if(mWearablep && @@ -593,10 +593,10 @@ void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bo mWearablep->isOnTop()) { // call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values - avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, set_by_user ); + avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake ); } else { - driven->mParam->setWeight( driven_weight, set_by_user ); + driven->mParam->setWeight( driven_weight, upload_bake ); } } diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h index 069e71a2cb3588b5614ff80955bf0f9ceea6fe09..4e2daf5ba79409a76976257e8ea90ff750289c60 100644 --- a/indra/newview/lldriverparam.h +++ b/indra/newview/lldriverparam.h @@ -99,9 +99,9 @@ class LLDriverParam : public LLViewerVisualParam // LLVisualParam Virtual functions ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); /*virtual*/ void apply( ESex sex ) {} // apply is called separately for each driven param. - /*virtual*/ void setWeight(F32 weight, BOOL set_by_user); - /*virtual*/ void setAnimationTarget( F32 target_value, BOOL set_by_user ); - /*virtual*/ void stopAnimating(BOOL set_by_user); + /*virtual*/ void setWeight(F32 weight, BOOL upload_bake); + /*virtual*/ void setAnimationTarget( F32 target_value, BOOL upload_bake ); + /*virtual*/ void stopAnimating(BOOL upload_bake); /*virtual*/ BOOL linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params); /*virtual*/ void resetDrivenParams(); @@ -114,7 +114,7 @@ class LLDriverParam : public LLViewerVisualParam /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh); protected: F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight); - void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user); + void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake); LLVector3 mDefaultVec; // temp holder diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index e41c4104ebe4000b92ff1c6bcf210d57808872f3..9bc7221dc87487bfe851f8023e8cdcea690f56d6 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -126,7 +126,7 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth) // force rendering to on-screen portion of frame buffer LLCoordScreen window_pos; gViewerWindow->getWindow()->getPosition( &window_pos ); - mOrigin.set(0, gViewerWindow->getWindowDisplayHeight() - mFullHeight); // top left corner + mOrigin.set(0, gViewerWindow->getWindowHeightRaw() - mFullHeight); // top left corner if (window_pos.mX < 0) { diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 424d6353211bfec0ad579835ce488ac20e979bdd..bd6936f05c65542188716f5286f3b405fb3caed0 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -129,12 +129,12 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle } } -void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text) +void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params) { // LLTextBox::setText will obliterate the expander segment, so make sure // we generate it again by clearing mExpanderVisible mExpanderVisible = false; - LLTextBox::setText(text); + LLTextBox::setText(text, input_params); // text contents have changed, segments are cleared out // so hide the expander and determine if we need it @@ -164,7 +164,7 @@ void LLExpandableTextBox::LLTextBoxEx::showExpandText() S32 last_line = visible_lines.second - 1; LLStyle::Params expander_style = getDefaultStyle(); - expander_style.font.name.setIfNotProvided(LLFontGL::nameFromFont(expander_style.font)); + expander_style.font.name(LLFontGL::nameFromFont(expander_style.font)); expander_style.font.style = "UNDERLINE"; expander_style.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); LLExpanderSegment* expanderp = new LLExpanderSegment(new LLStyle(expander_style), getLineStart(last_line), getLength() + 1, mExpanderLabel, *this); diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index 3fe646c29c6b7765dfbb875b6a6a939748ed58ee..7c989cfa50ec4fa595fe4660045b2178a1bda398 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -60,7 +60,7 @@ class LLExpandableTextBox : public LLUICtrl // adds or removes "More" link as needed /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - /*virtual*/ void setText(const LLStringExplicit& text); + /*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params()); /** * Returns difference between text box height and text height. diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index c54b83d8655a139a10fb172939574b2ff8891d26..31f1462a12b72581c09c922b09927c3b861a44e9 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1403,7 +1403,7 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) //the projection of the face partially overlaps with the screen F32 LLFace::adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius ) { - F32 screen_radius = (F32)llmax(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()) ; + F32 screen_radius = (F32)llmax(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()) ; F32 center_angle = acosf(cos_angle_to_view_dir) ; F32 d = center_angle * LLDrawable::sCurPixelAngle ; diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 71265fdd2f81f011b8018331ef7ce0a0331e5eb8..0b27001f10300ae8d32ac585e71c876ba5655860 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -303,8 +303,8 @@ void LLFastTimerView::draw() F64 iclock_freq = 1000.0 / clock_freq; S32 margin = 10; - S32 height = (S32) (gViewerWindow->getVirtualWindowRect().getHeight()*0.75f); - S32 width = (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f); + S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f); + S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f); // HACK: casting away const. Should use setRect or some helper function instead. const_cast<LLRect&>(getRect()).setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height); diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 18135fc5587e51a762c6c2745e683bbda45d6157..8406ddeeca04131d8f59744670b0135d96d0dca1 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -74,6 +74,7 @@ class LLLandmarkInfoGetter mName("(Loading...)"), mPosX(0), mPosY(0), + mPosZ(0), mLoaded(false) {} @@ -101,6 +102,14 @@ class LLLandmarkInfoGetter requestNameAndPos(); return mPosY; } + + S32 getPosZ() + { + if (!mLoaded) + requestNameAndPos(); + return mPosZ; + } + private: /** * Requests landmark data from server. @@ -114,14 +123,15 @@ class LLLandmarkInfoGetter if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos)) { LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos, - boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3)); + boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3, _4)); } } - void landmarkNameCallback(const std::string& name, S32 x, S32 y) + void landmarkNameCallback(const std::string& name, S32 x, S32 y, S32 z) { mPosX = x; mPosY = y; + mPosZ = z; mName = name; mLoaded = true; } @@ -130,6 +140,7 @@ class LLLandmarkInfoGetter std::string mName; S32 mPosX; S32 mPosY; + S32 mPosZ; bool mLoaded; }; @@ -151,7 +162,8 @@ class LLFavoriteLandmarkButton : public LLButton if (!region_name.empty()) { LLToolTip::Params params; - params.message = llformat("%s\n%s (%d, %d)", getLabelSelected().c_str(), region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY()); + params.message = llformat("%s\n%s (%d, %d, %d)", getLabelSelected().c_str(), region_name.c_str(), + mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ()); params.sticky_rect = calcScreenRect(); LLToolTipMgr::instance().show(params); } @@ -220,13 +232,15 @@ class LLFavoriteLandmarkMenuItem : public LLMenuItemCallGL virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) { - mMouseDownSignal(this, x, y, mask); + if (mMouseDownSignal) + (*mMouseDownSignal)(this, x, y, mask); return LLMenuItemCallGL::handleMouseDown(x, y, mask); } virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) { - mMouseUpSignal(this, x, y, mask); + if (mMouseUpSignal) + (*mMouseUpSignal)(this, x, y, mask); return LLMenuItemCallGL::handleMouseUp(x, y, mask); } @@ -901,7 +915,10 @@ void LLFavoritesBarCtrl::showDropDownMenu() menu->buildDrawLabels(); menu->updateParent(LLMenuGL::sMenuContainer); - menu->setButtonRect(mChevronRect, this); + if (menu->getButtonRect().isEmpty()) + { + menu->setButtonRect(mChevronRect, this); + } LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0); return; diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index e90d13f9d5157c539590574d56d1416f426b4c11..20a324c67c919ea7680256ee46530597054326a5 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -35,6 +35,7 @@ #include "lluictrl.h" +#include "llinventoryobserver.h" #include "llinventorymodel.h" class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index b01293d17c73ada9fc880c0e8f3f2c5c7cfd8796..80b0a430e0248fc76f95594a80df1bd14b167288 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -64,7 +64,7 @@ #include "llwindow.h" #include "stringize.h" #include "llsdutil_math.h" -#include "lleventdispatcher.h" +#include "lleventapi.h" #if LL_WINDOWS #include "lldxhardware.h" @@ -302,13 +302,17 @@ static std::string get_viewer_release_notes_url() return LLWeb::escapeURL(url.str()); } -class LLFloaterAboutListener: public LLDispatchListener +class LLFloaterAboutListener: public LLEventAPI { public: LLFloaterAboutListener(): - LLDispatchListener("LLFloaterAbout", "op") + LLEventAPI("LLFloaterAbout", + "LLFloaterAbout listener to retrieve About box info") { - add("getInfo", &LLFloaterAboutListener::getInfo, LLSD().insert("reply", LLSD())); + add("getInfo", + "Request an LLSD::Map containing information used to populate About box", + &LLFloaterAboutListener::getInfo, + LLSD().insert("reply", LLSD())); } private: diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 262dc1804d3b5e1e1c0c28b89b5c9a1b6d586eab..9ba61ba92f7e1e0cc8943b51191ed8ca4289f546 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -188,8 +188,8 @@ void LLFloaterAuction::onClickSnapshot(void* data) gForceRenderLandFence = self->childGetValue("fence_check").asBoolean(); BOOL success = gViewerWindow->rawSnapshot(raw, - gViewerWindow->getWindowWidth(), - gViewerWindow->getWindowHeight(), + gViewerWindow->getWindowWidthScaled(), + gViewerWindow->getWindowHeightScaled(), TRUE, FALSE, FALSE, FALSE); gForceRenderLandFence = FALSE; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 8ac7f3fd7e1f952ccaafca6c1fb7059edc0a2b8d..07bb6f832bf2d2f1d5d5cd36c40c6964a863d858 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -42,6 +42,7 @@ #include "llworld.h" // Linden libraries +#include "llbutton.h" #include "lllineeditor.h" #include "llscrolllistctrl.h" #include "llscrolllistitem.h" @@ -56,7 +57,8 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback, BOOL closeOnSelect) { // *TODO: Use a key to allow this not to be an effective singleton - LLFloaterAvatarPicker* floater = LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); + LLFloaterAvatarPicker* floater = + LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); floater->mCallback = callback; floater->mCallbackUserdata = userdata; @@ -64,6 +66,15 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback, floater->mNearMeListComplete = FALSE; floater->mCloseOnSelect = closeOnSelect; + if (!closeOnSelect) + { + // Use Select/Close + std::string select_string = floater->getString("Select"); + std::string close_string = floater->getString("Close"); + floater->getChild<LLButton>("ok_btn")->setLabel(select_string); + floater->getChild<LLButton>("cancel_btn")->setLabel(close_string); + } + return floater; } @@ -102,10 +113,9 @@ BOOL LLFloaterAvatarPicker::postBuild() friends->setDoubleClickCallback(onBtnSelect, this); childSetCommitCallback("Friends", onList, this); - childSetAction("Select", onBtnSelect, this); - childDisable("Select"); - - childSetAction("Cancel", onBtnClose, this); + childSetAction("ok_btn", onBtnSelect, this); + childDisable("ok_btn"); + childSetAction("cancel_btn", onBtnClose, this); childSetFocus("Edit"); @@ -132,7 +142,7 @@ BOOL LLFloaterAvatarPicker::postBuild() void LLFloaterAvatarPicker::onTabChanged() { - childSetEnabled("Select", visibleItemsSelected()); + childSetEnabled("ok_btn", visibleItemsSelected()); } // Destroys the object @@ -234,7 +244,7 @@ void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata) LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; if (self) { - self->childSetEnabled("Select", self->visibleItemsSelected()); + self->childSetEnabled("ok_btn", self->visibleItemsSelected()); } } @@ -270,13 +280,13 @@ void LLFloaterAvatarPicker::populateNearMe() if (empty) { childDisable("NearMe"); - childDisable("Select"); + childDisable("ok_btn"); near_me_scroller->setCommentText(getString("no_one_near")); } else { childEnable("NearMe"); - childEnable("Select"); + childEnable("ok_btn"); near_me_scroller->selectFirstItem(); onList(near_me_scroller, this); near_me_scroller->setFocus(TRUE); @@ -357,7 +367,7 @@ void LLFloaterAvatarPicker::find() getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems(); getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching")); - childSetEnabled("Select", FALSE); + childSetEnabled("ok_btn", FALSE); mNumResultsReturned = 0; } @@ -414,7 +424,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* map["[TEXT]"] = floater->childGetText("Edit"); avatar_name = floater->getString("not_found", map); search_results->setEnabled(FALSE); - floater->childDisable("Select"); + floater->childDisable("ok_btn"); } else { @@ -430,7 +440,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* if (found_one) { - floater->childEnable("Select"); + floater->childEnable("ok_btn"); search_results->selectFirstItem(); floater->onList(search_results, floater); search_results->setFocus(TRUE); diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index cefd7a38080814af9de090bdf3cd0a47ee46fd5f..c8df6c6135862256d8f5b0d7689f2cade0193cfc 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -230,10 +230,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj, if (obj->getType() == LLAssetType::AT_CATEGORY) continue; - // Skip root folders, so we know we have inventory items only - if (obj->getType() == LLAssetType::AT_ROOT_CATEGORY) - continue; - // Skip the mysterious blank InventoryObject if (obj->getType() == LLAssetType::AT_NONE) continue; diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 32802f6a20055309e97088ffdc246e1ff0f94f16..a99d0c918dd7d2ed59d8c78744982053519afcdc 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -187,10 +187,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj, if (asset_type == LLAssetType::AT_CATEGORY) continue; - // Skip root folders, so we know we have inventory items only - if (asset_type == LLAssetType::AT_ROOT_CATEGORY) - continue; - LLInventoryItem* inv_item = (LLInventoryItem*)((LLInventoryObject*)(*it)); inv_type = inv_item->getInventoryType(); @@ -286,7 +282,7 @@ void LLFloaterBuyContents::onClickBuy() // Put the items where we put new folders. LLUUID category_id; - category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY); + category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ROOT_INVENTORY); // *NOTE: doesn't work for multiple object buy, which UI does not // currently support sale info is used for verification only, if diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 467796b4a39b0df33ef1ab3ac12f084069a1193b..976aaf8044727b7c329d5e35925ec335afe828fa 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -903,7 +903,7 @@ void LLFloaterBuyLandUI::tellUserError( // virtual BOOL LLFloaterBuyLandUI::postBuild() { - mVisibleSignal.connect(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2)); + setVisibleCallback(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2)); mCurrency.prepare(); diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index d1317f7c3681b84f3ca09b1583ed7b004b195bc6..92e958b32de901891afb156bce19b5d79e2d86d5 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -40,10 +40,12 @@ // Viewer includes #include "lljoystickbutton.h" #include "llviewercontrol.h" +#include "llviewercamera.h" #include "llbottomtray.h" #include "llagent.h" #include "lltoolmgr.h" #include "lltoolfocus.h" +#include "llslider.h" // Constants const F32 CAMERA_BUTTON_DELAY = 0.0f; @@ -54,6 +56,93 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f; #define PRESETS "camera_presets" #define CONTROLS "controls" +// Zoom the camera in and out +class LLPanelCameraZoom +: public LLPanel +{ + LOG_CLASS(LLPanelCameraZoom); +public: + LLPanelCameraZoom(); + + /* virtual */ BOOL postBuild(); + /* virtual */ void onOpen(const LLSD& key); + +protected: + void onZoomPlusHeldDown(); + void onZoomMinusHeldDown(); + void onSliderValueChanged(); + +private: + F32 mSavedSliderVal; + LLButton* mPlusBtn; + LLButton* mMinusBtn; + LLSlider* mSlider; +}; + +static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel"); + +//------------------------------------------------------------------------------- +// LLPanelCameraZoom +//------------------------------------------------------------------------------- + +LLPanelCameraZoom::LLPanelCameraZoom() +: mPlusBtn( NULL ), + mMinusBtn( NULL ), + mSlider( NULL ), + mSavedSliderVal(0.f) +{ + mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); + mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); + mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this)); +} + +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) +{ + LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal(); + mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current + mSlider->setValue( mSavedSliderVal ); +} + +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(); +} + +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(); +} + +void LLPanelCameraZoom::onSliderValueChanged() +{ + F32 val = mSlider->getValueF32(); + F32 rate = val - mSavedSliderVal; + + gAgent.unlockView(); + gAgent.cameraOrbitIn(rate); + + mSavedSliderVal = val; +} // // Member functions @@ -125,6 +214,7 @@ void LLFloaterCamera::onOpen(const LLSD& key) anchor_panel, this, getDockTongue(), LLDockControl::TOP)); + mZoom->onOpen(key); } void LLFloaterCamera::onClose(bool app_quitting) @@ -147,7 +237,7 @@ BOOL LLFloaterCamera::postBuild() setIsChrome(TRUE); mRotate = getChild<LLJoystickCameraRotate>(ORBIT); - mZoom = getChild<LLJoystickCameraZoom>(ZOOM); + mZoom = getChild<LLPanelCameraZoom>(ZOOM); mTrack = getChild<LLJoystickCameraTrack>(PAN); assignButton2Mode(CAMERA_CTRL_MODE_ORBIT, "orbit_btn"); diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h index 583f279e6276c70d181d9a864f22eee54d10dfa4..4873a34e00ba9672d7407cb71d6e2defffcecf8a 100644 --- a/indra/newview/llfloatercamera.h +++ b/indra/newview/llfloatercamera.h @@ -39,6 +39,7 @@ class LLJoystickCameraRotate; class LLJoystickCameraZoom; class LLJoystickCameraTrack; class LLFloaterReg; +class LLPanelCameraZoom; enum ECameraControlMode { @@ -74,7 +75,7 @@ class LLFloaterCamera virtual void onClose(bool app_quitting); LLJoystickCameraRotate* mRotate; - LLJoystickCameraZoom* mZoom; + LLPanelCameraZoom* mZoom; LLJoystickCameraTrack* mTrack; private: diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index ed14079ae91b93a841024845843160945622a042..57bb93d81afef3ea51355af4372a798bbdd70dd8 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -129,7 +129,7 @@ void LLFloaterChat::draw() BOOL LLFloaterChat::postBuild() { // Hide the chat overlay when our history is visible. - mVisibleSignal.connect(boost::bind(&LLFloaterChat::updateConsoleVisibility, this)); + setVisibleCallback(boost::bind(&LLFloaterChat::updateConsoleVisibility, this)); mPanel = (LLPanelActiveSpeakers*)getChild<LLPanel>("active_speakers_panel"); @@ -180,16 +180,12 @@ void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4& edit->blockUndo(); } -void log_chat_text(const LLChat& chat) -{ - LLLogChat::saveHistory(std::string("chat"), chat.mFromName, chat.mFromID, chat.mText); -} // static void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file) { - if ( (gSavedPerAccountSettings.getS32("IMLogOptions")!=LOG_IM) && log_to_file) + if (log_to_file && (gSavedPerAccountSettings.getBOOL("LogChat"))) { - log_chat_text(chat); + LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText); } LLColor4 color = get_text_color(chat); @@ -305,55 +301,27 @@ void LLFloaterChat::onClickToggleShowMute(LLUICtrl* caller, void *data) } // Put a line of chat in all the right places -void LLFloaterChat::addChat(const LLChat& chat, - BOOL from_instant_message, - BOOL local_agent) +void LLFloaterChat::addChat(const LLChat& chat, BOOL from_instant_message, BOOL local_agent) { - LLColor4 text_color = get_text_color(chat); - - BOOL invisible_script_debug_chat = ((gSavedSettings.getBOOL("ShowScriptErrors") == FALSE) || - (chat.mChatType == CHAT_TYPE_DEBUG_MSG - && (gSavedSettings.getS32("ShowScriptErrorsLocation") == 1))); - - if (!invisible_script_debug_chat - && !chat.mMuted - && gConsole - && !local_agent) - { - F32 size = CHAT_MSG_SIZE; - if (chat.mSourceType == CHAT_SOURCE_SYSTEM) - { - text_color = LLUIColorTable::instance().getColor("SystemChatColor"); - } - else if(from_instant_message) - { - text_color = LLUIColorTable::instance().getColor("IMChatColor"); - size = INSTANT_MSG_SIZE; - } - // Disabling the console for 2.0 - SJB -#if 0 - // We display anything if it's not an IM. If it's an IM, check pref... - if ( !from_instant_message || gSavedSettings.getBOOL("IMInChatConsole") ) - { - gConsole->addLine(chat.mText, size, text_color); - } -#endif - } - - if(from_instant_message && (gSavedPerAccountSettings.getS32("IMLogOptions")== LOG_BOTH_TOGETHER)) - log_chat_text(chat); - - if(from_instant_message && gSavedSettings.getBOOL("IMInChatHistory")) - addChatHistory(chat,false); - triggerAlerts(chat.mText); // Add the sender to the list of people with which we've recently interacted. if(chat.mSourceType == CHAT_SOURCE_AGENT && chat.mFromID.notNull()) LLRecentPeople::instance().add(chat.mFromID); - - if(!from_instant_message) - addChatHistory(chat); + + bool add_chat = true; + bool log_chat = true; + if(from_instant_message) + { + if (!gSavedSettings.getBOOL("IMInChat")) + add_chat = false; + //log_chat = false; +} + + if (add_chat) + { + addChatHistory(chat, log_chat); + } } // Moved from lltextparser.cpp to break llui/llaudio library dependency. diff --git a/indra/newview/llfloaterchat.h b/indra/newview/llfloaterchat.h index aed82a6781ec9f571b6a75b1164deac1bd7887d9..84fc199bfa95756624cfcb68608fd4cc89b4fcd7 100644 --- a/indra/newview/llfloaterchat.h +++ b/indra/newview/llfloaterchat.h @@ -45,14 +45,6 @@ class LLChat; class LLPanelActiveSpeakers; class LLLogChat; -enum ELogOptions -{ - LOG_CHAT = 0, - LOG_IM = 1, - LOG_BOTH_TOGETHER = 2, - LOG_BOTH_SEPARATE = 3 -}; - class LLFloaterChat : public LLFloater { public: diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp index fbf09207feaace624dd085a6d57f913752c249b7..1b14ca573ab64cb2899f49344a27d148e2db90b2 100644 --- a/indra/newview/llfloaterchatterbox.cpp +++ b/indra/newview/llfloaterchatterbox.cpp @@ -114,7 +114,7 @@ LLFloaterChatterBox::~LLFloaterChatterBox() BOOL LLFloaterChatterBox::postBuild() { - mVisibleSignal.connect(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2)); + setVisibleCallback(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2)); if (gSavedSettings.getBOOL("ContactsTornOff")) { diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index c114eed4a2485f043893be704ecde429cb3bb16c..0f8e4c10d78f6e04a614afd8d5db9814068dd584 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -34,32 +34,24 @@ #include "llfloatergesture.h" -#include "lldir.h" #include "llinventory.h" -#include "llmultigesture.h" +#include "llinventorybridge.h" +#include "llinventorymodel.h" +#include "llinventoryclipboard.h" #include "llagent.h" -#include "llviewerwindow.h" -#include "llbutton.h" -#include "llcombobox.h" +#include "llappearancemgr.h" +#include "llclipboard.h" #include "llgesturemgr.h" -#include "llinventorymodel.h" -#include "llinventorypanel.h" -#include "llfloaterinventory.h" #include "llkeyboard.h" -#include "lllineeditor.h" +#include "llmenugl.h" +#include "llmultigesture.h" #include "llpreviewgesture.h" -#include "llresizehandle.h" -#include "llscrollbar.h" -#include "llscrollcontainer.h" #include "llscrolllistctrl.h" -#include "lltextbox.h" #include "lltrans.h" -#include "lluictrlfactory.h" #include "llviewergesture.h" -#include "llviewertexturelist.h" +#include "llviewermenu.h" #include "llviewerinventory.h" -#include "llvoavatar.h" #include "llviewercontrol.h" BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b ) @@ -77,6 +69,35 @@ class LLFloaterGestureObserver : public LLGestureManagerObserver private: LLFloaterGesture* mFloater; }; +//----------------------------- +// GestureCallback +//----------------------------- + +class GestureShowCallback : public LLInventoryCallback +{ +public: + void fire(const LLUUID &inv_item) + { + LLPreviewGesture::show(inv_item, LLUUID::null); + } +}; + +class GestureCopiedCallback : public LLInventoryCallback +{ +private: + LLFloaterGesture* mFloater; + +public: + GestureCopiedCallback(LLFloaterGesture* floater): mFloater(floater) + {} + void fire(const LLUUID &inv_item) + { + if(mFloater) + { + mFloater->addGesture(inv_item,NULL,mFloater->getChild<LLScrollListCtrl>("gesture_list")); + } + } +}; //--------------------------------------------------------------------------- // LLFloaterGesture @@ -86,7 +107,59 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key) { mObserver = new LLFloaterGestureObserver(this); LLGestureManager::instance().addObserver(mObserver); - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml"); + + mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this)); + mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this)); + mCommitCallbackRegistrar.add("Gesture.Action.CopyPast", boost::bind(&LLFloaterGesture::onCopyPastAction, this, _2)); + mCommitCallbackRegistrar.add("Gesture.Action.SaveToCOF", boost::bind(&LLFloaterGesture::addToCurrentOutFit, this)); + + mEnableCallbackRegistrar.add("Gesture.EnableAction", boost::bind(&LLFloaterGesture::isActionEnabled, this, _2)); +} + +void LLFloaterGesture::done() +{ + //this method can be called twice: for GestureFolder and once after loading all sudir of GestureFolder + if (gInventory.isCategoryComplete(mGestureFolderID)) + { + LL_DEBUGS("Gesture")<< "mGestureFolderID loaded" << LL_ENDL; + // we load only gesture folder without childred. + LLInventoryModel::cat_array_t* categories; + LLInventoryModel::item_array_t* items; + LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders; + LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL; + gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items); + if (categories->empty()) + { + gInventory.removeObserver(this); + LL_INFOS("Gesture")<< "Gesture dos NOT contains sub-directories."<< LL_ENDL; + return; + } + LL_DEBUGS("Gesture")<< "There are " << categories->size() << " Folders "<< LL_ENDL; + for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); it++) + { + if (!gInventory.isCategoryComplete(it->get()->getUUID())) + { + unloaded_folders.push_back(it->get()->getUUID()); + LL_DEBUGS("Gesture")<< it->get()->getName()<< " Folder added to fetchlist"<< LL_ENDL; + } + + } + if (!unloaded_folders.empty()) + { + LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL; + fetchDescendents(unloaded_folders); + } + else + { + LL_DEBUGS("Gesture")<< "All Gesture subdirectories have been loaded."<< LL_ENDL; + gInventory.removeObserver(this); + buildGestureList(); + } + } + else + { + LL_WARNS("Gesture")<< "Gesture list was NOT loaded"<< LL_ENDL; + } } // virtual @@ -105,33 +178,39 @@ BOOL LLFloaterGesture::postBuild() label = getTitle(); setTitle(label); - - getChild<LLUICtrl>("gesture_list")->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this)); - getChild<LLScrollListCtrl>("gesture_list")->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this)); - - getChild<LLUICtrl>("inventory_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickInventory, this)); + mGestureList = getChild<LLScrollListCtrl>("gesture_list"); + mGestureList->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this)); + mGestureList->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this)); getChild<LLUICtrl>("edit_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickEdit, this)); getChild<LLUICtrl>("play_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this)); getChild<LLUICtrl>("stop_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this)); - + getChild<LLButton>("activate_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onActivateBtnClick, this)); + getChild<LLUICtrl>("new_gesture_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickNew, this)); + getChild<LLButton>("del_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onDeleteSelected, this)); childSetVisible("play_btn", true); childSetVisible("stop_btn", false); setDefaultBtn("play_btn"); - + mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false); + + folder_ref_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(); - childSetFocus("gesture_list"); + mGestureList->setFocus(TRUE); - LLCtrlListInterface *list = childGetListInterface("gesture_list"); - if (list) + if (mGestureList) { const BOOL ascending = TRUE; - list->sortByColumn(std::string("name"), ascending); - list->selectFirstItem(); + mGestureList->sortByColumn(std::string("name"), ascending); + mGestureList->selectFirstItem(); } // Update button labels @@ -145,18 +224,17 @@ void LLFloaterGesture::refreshAll() { buildGestureList(); - LLCtrlListInterface *list = childGetListInterface("gesture_list"); - if (!list) return; + if (!mGestureList) return; if (mSelectedID.isNull()) { - list->selectFirstItem(); + mGestureList->selectFirstItem(); } else { - if (! list->setCurrentByID(mSelectedID)) + if (! mGestureList->setCurrentByID(mSelectedID)) { - list->selectFirstItem(); + mGestureList->selectFirstItem(); } } @@ -166,143 +244,188 @@ void LLFloaterGesture::refreshAll() void LLFloaterGesture::buildGestureList() { - LLCtrlListInterface *list = childGetListInterface("gesture_list"); - LLCtrlScrollInterface *scroll = childGetScrollInterface("gesture_list"); - - if (! (list && scroll)) return; + std::vector<LLUUID> 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(); + for (it = active_gestures.begin(); it != active_gestures.end(); ++it) + { + addGesture(it->first,it->second, mGestureList); + } + if (gInventory.isCategoryComplete(mGestureFolderID)) + { + LLIsType is_gesture(LLAssetType::AT_GESTURE); + LLInventoryModel::cat_array_t categories; + LLInventoryModel::item_array_t items; + gInventory.collectDescendentsIf(mGestureFolderID, categories, items, + LLInventoryModel::EXCLUDE_TRASH, is_gesture); + for (LLInventoryModel::item_array_t::iterator it = items.begin(); it!= items.end(); ++it) + { + LLInventoryItem* item = it->get(); + if (active_gestures.find(item->getUUID()) == active_gestures.end()) + { + // if gesture wasn't loaded yet, we can display only name + addGesture(item->getUUID(), NULL, mGestureList); + } + } + } // attempt to preserve scroll position through re-builds // since we do re-build any time anything dirties - S32 current_scroll_pos = scroll->getScrollPos(); - - list->operateOnAll(LLCtrlListInterface::OP_DELETE); - - LLGestureManager::item_map_t::iterator it; - for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it) + for(std::vector<LLUUID>::iterator it = selected_items.begin(); it != selected_items.end(); it++) { - const LLUUID& item_id = (*it).first; - LLMultiGesture* gesture = (*it).second; + mGestureList->selectByID(*it); + } + mGestureList->scrollToShowSelected(); +} - // Note: Can have NULL item if inventory hasn't arrived yet. - std::string item_name = getString("loading"); - LLInventoryItem* item = gInventory.getItem(item_id); - if (item) - { - item_name = item->getName(); - } +void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list ) +{ + // Note: Can have NULL item if inventory hasn't arrived yet. + static std::string item_name = getString("loading"); + LLInventoryItem* item = gInventory.getItem(item_id); + if (item) + { + item_name = item->getName(); + } - std::string font_style = "NORMAL"; - // If gesture is playing, bold it + static std::string font_style = "NORMAL"; + // If gesture is playing, bold it - LLSD element; - element["id"] = item_id; + LLSD element; + element["id"] = item_id; - if (gesture) + if (gesture) + { + if (gesture->mPlaying) { - if (gesture->mPlaying) - { - font_style = "BOLD"; - } + font_style = "BOLD"; + } - element["columns"][0]["column"] = "trigger"; - element["columns"][0]["value"] = gesture->mTrigger; - element["columns"][0]["font"]["name"] = "SANSSERIF"; - element["columns"][0]["font"]["style"] = font_style; + element["columns"][0]["column"] = "trigger"; + element["columns"][0]["value"] = gesture->mTrigger; + element["columns"][0]["font"]["name"] = "SANSSERIF"; + element["columns"][0]["font"]["style"] = font_style; - std::string key_string = LLKeyboard::stringFromKey(gesture->mKey); - std::string buffer; + std::string key_string = LLKeyboard::stringFromKey(gesture->mKey); + std::string buffer; - if (gesture->mKey == KEY_NONE) - { - buffer = "---"; - key_string = "~~~"; // alphabetize to end - } - else - { - buffer = LLKeyboard::stringFromAccelerator( gesture->mMask, gesture->mKey ); - } + if (gesture->mKey == KEY_NONE) + { + buffer = "---"; + key_string = "~~~"; // alphabetize to end + } + else + { + buffer = LLKeyboard::stringFromAccelerator(gesture->mMask, + gesture->mKey); + } - element["columns"][1]["column"] = "shortcut"; - element["columns"][1]["value"] = buffer; - element["columns"][1]["font"]["name"] = "SANSSERIF"; - element["columns"][1]["font"]["style"] = font_style; + element["columns"][1]["column"] = "shortcut"; + element["columns"][1]["value"] = buffer; + element["columns"][1]["font"]["name"] = "SANSSERIF"; + element["columns"][1]["font"]["style"] = font_style; - // hidden column for sorting - element["columns"][2]["column"] = "key"; - element["columns"][2]["value"] = key_string; - element["columns"][2]["font"]["name"] = "SANSSERIF"; - element["columns"][2]["font"]["style"] = font_style; + // hidden column for sorting + element["columns"][2]["column"] = "key"; + element["columns"][2]["value"] = key_string; + element["columns"][2]["font"]["name"] = "SANSSERIF"; + element["columns"][2]["font"]["style"] = font_style; - // Only add "playing" if we've got the name, less confusing. JC - if (item && gesture->mPlaying) - { - item_name += " " + getString("playing"); - } - element["columns"][3]["column"] = "name"; - element["columns"][3]["value"] = item_name; - element["columns"][3]["font"]["name"] = "SANSSERIF"; - element["columns"][3]["font"]["style"] = font_style; - } - else + // Only add "playing" if we've got the name, less confusing. JC + if (item && gesture->mPlaying) { - element["columns"][0]["column"] = "trigger"; - 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"][2]["column"] = "key"; - element["columns"][2]["value"] = "~~~"; - element["columns"][2]["font"]["name"] = "SANSSERIF"; - element["columns"][2]["font"]["style"] = font_style; - element["columns"][3]["column"] = "name"; - element["columns"][3]["value"] = item_name; - element["columns"][3]["font"]["name"] = "SANSSERIF"; - element["columns"][3]["font"]["style"] = font_style; + item_name += " " + getString("playing"); } - list->addElement(element, ADD_BOTTOM); + element["columns"][3]["column"] = "name"; + element["columns"][3]["value"] = item_name; + element["columns"][3]["font"]["name"] = "SANSSERIF"; + element["columns"][3]["font"]["style"] = font_style; } - - scroll->setScrollPos(current_scroll_pos); + else + { + element["columns"][0]["column"] = "trigger"; + 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"][2]["column"] = "key"; + element["columns"][2]["value"] = "~~~"; + element["columns"][2]["font"]["name"] = "SANSSERIF"; + element["columns"][2]["font"]["style"] = font_style; + element["columns"][3]["column"] = "name"; + element["columns"][3]["value"] = item_name; + element["columns"][3]["font"]["name"] = "SANSSERIF"; + element["columns"][3]["font"]["style"] = font_style; + } + list->addElement(element, ADD_BOTTOM); } -void LLFloaterGesture::onClickInventory() +void LLFloaterGesture::getSelectedIds(std::vector<LLUUID>& ids) { - LLCtrlListInterface *list = childGetListInterface("gesture_list"); - if (!list) return; - const LLUUID& item_id = list->getCurrentID(); - - LLFloaterInventory* inv = LLFloaterInventory::showAgentInventory(); - if (!inv) return; - inv->getPanel()->setSelection(item_id, TRUE); + std::vector<LLScrollListItem*> items = mGestureList->getAllSelected(); + for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++) + { + ids.push_back((*it)->getUUID()); + } } -void LLFloaterGesture::onClickPlay() +bool LLFloaterGesture::isActionEnabled(const LLSD& command) { - LLCtrlListInterface *list = childGetListInterface("gesture_list"); - if (!list) return; - const LLUUID& item_id = list->getCurrentID(); - - if (LLGestureManager::instance().isGesturePlaying(item_id)) + // paste copy_uuid edit_gesture + std::string command_name = command.asString(); + if("paste" == command_name) { - LLGestureManager::instance().stopGesture(item_id); + if(!LLInventoryClipboard::instance().hasContents()) + return false; + + LLDynamicArray<LLUUID> ids; + LLInventoryClipboard::instance().retrieve(ids); + for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++) + { + LLInventoryItem* item = gInventory.getItem(*it); + + if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE) + { + return true; + } + } + return false; } - else + else if("copy_uuid" == command_name || "edit_gesture" == command_name + || "inspect" == command_name) { - LLGestureManager::instance().playGesture(item_id); + return mGestureList->getAllSelected().size() == 1; } + return true; } -class GestureShowCallback : public LLInventoryCallback +void LLFloaterGesture::onClickPlay() { -public: - void fire(const LLUUID &inv_item) + const LLUUID& item_id = mGestureList->getCurrentID(); + if(item_id.isNull()) return; + + LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL; + if(!LLGestureManager::instance().isGestureActive(item_id)) { - LLPreviewGesture::show(inv_item, LLUUID::null); + // we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboBox. + 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; } -}; + else + { + playGesture(item_id); + } +} void LLFloaterGesture::onClickNew() { @@ -312,12 +435,98 @@ void LLFloaterGesture::onClickNew() LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb); } +void LLFloaterGesture::onActivateBtnClick() +{ + std::vector<LLUUID> ids; + getSelectedIds(ids); + if(ids.empty()) + return; + + LLGestureManager* gm = LLGestureManager::getInstance(); + std::vector<LLUUID>::const_iterator it = ids.begin(); + BOOL first_gesture_state = gm->isGestureActive(*it); + BOOL is_mixed = FALSE; + while( ++it != ids.end() ) + { + if(first_gesture_state != gm->isGestureActive(*it)) + { + is_mixed = TRUE; + break; + } + } + for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++) + { + if(is_mixed) + { + gm->activateGesture(*it); + } + else + { + if(first_gesture_state) + { + gm->deactivateGesture(*it); + } + else + { + gm->activateGesture(*it); + } + } + } +} + +void LLFloaterGesture::onCopyPastAction(const LLSD& command) +{ + std::string command_name = command.asString(); + // since we select this comman inventory item had already arrived . + if("copy_gesture" == command_name) + { + std::vector<LLUUID> ids; + getSelectedIds(ids); + // make sure that clopboard is empty + LLInventoryClipboard::instance().reset(); + for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++) + { + LLInventoryItem* item = gInventory.getItem(*it); + if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE) + { + LLInventoryClipboard::instance().add(item->getUUID()); + } + } + } + else if ("paste" == command_name) + { + LLInventoryClipboard& clipbord = LLInventoryClipboard::instance(); + LLDynamicArray<LLUUID> ids; + clipbord.retrieve(ids); + if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID)) + return; + LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID); + 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) + { + 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(), + gesture_dir->getUUID(), getString("copy_name", string_args), cb); + } + } + clipbord.reset(); + } + else if ("copy_uuid" == command_name) + { + gClipboard.copyFromString(utf8str_to_wstring(mGestureList->getCurrentID().asString()), mGestureList->getCurrentID()); + } +} void LLFloaterGesture::onClickEdit() { - LLCtrlListInterface *list = childGetListInterface("gesture_list"); - if (!list) return; - const LLUUID& item_id = list->getCurrentID(); + const LLUUID& item_id = mGestureList->getCurrentID(); LLInventoryItem* item = gInventory.getItem(item_id); if (!item) return; @@ -331,7 +540,7 @@ void LLFloaterGesture::onClickEdit() void LLFloaterGesture::onCommitList() { - const LLUUID& item_id = childGetValue("gesture_list").asUUID(); + const LLUUID& item_id = mGestureList->getCurrentID(); mSelectedID = item_id; if (LLGestureManager::instance().isGesturePlaying(item_id)) @@ -345,3 +554,66 @@ void LLFloaterGesture::onCommitList() childSetVisible("stop_btn", false); } } + +void LLFloaterGesture::onDeleteSelected() +{ + std::vector<LLUUID> 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++) + { + const LLUUID& selected_item = *it; + LLInventoryItem* inv_item = gInventory.getItem(selected_item); + if (inv_item && inv_item->getInventoryType() == LLInventoryType::IT_GESTURE) + { + if(gm->isGestureActive(selected_item)) + { + gm->deactivateGesture(selected_item); + } + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item); + new_item->setParent(trash_id); + // no need to restamp it though it's a move into trash because + // it's a brand new item already. + new_item->updateParentOnServer(FALSE); + gInventory.updateItem(new_item); + } + } + gInventory.notifyObservers(); + buildGestureList(); +} + +void LLFloaterGesture::addToCurrentOutFit() +{ + std::vector<LLUUID> ids; + getSelectedIds(ids); + LLAppearanceManager* am = LLAppearanceManager::getInstance(); + for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++) + { + am->addCOFItemLink(*it); + } +} + +void LLFloaterGesture::playGesture(LLUUID item_id) +{ + LL_DEBUGS("Gesture")<<"Playing gesture "<< item_id<<LL_ENDL; + + if (LLGestureManager::instance().isGesturePlaying(item_id)) + { + LLGestureManager::instance().stopGesture(item_id); + } + else + { + LLGestureManager::instance().playGesture(item_id); + } +} diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index 9c1ab27cb0c7389491cb6027fa95a23db61bb4b6..14e132900df59d184a6c736efa0021bf6a1446c9 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -36,10 +36,10 @@ #ifndef LL_LLFLOATERGESTURE_H #define LL_LLFLOATERGESTURE_H +#include <vector> #include "llfloater.h" - -#include "lldarray.h" +#include "llinventoryobserver.h" class LLScrollContainer; class LLView; @@ -51,31 +51,60 @@ class LLGestureOptions; class LLScrollListCtrl; class LLFloaterGestureObserver; class LLFloaterGestureInventoryObserver; +class LLMultiGesture; +class LLMenuGL; class LLFloaterGesture -: public LLFloater +: public LLFloater, LLInventoryFetchDescendentsObserver { + LOG_CLASS(LLFloaterGesture); public: LLFloaterGesture(const LLSD& key); virtual ~LLFloaterGesture(); virtual BOOL postBuild(); - + virtual void done (); void refreshAll(); + /** + * @brief Add new scrolllistitem into gesture_list. + * @param item_id inventory id of gesture + * @param gesture can be NULL , if item was not loaded yet + */ + void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list); protected: // Reads from the gesture manager's list of active gestures // and puts them in this list. void buildGestureList(); - - void onClickInventory(); + void playGesture(LLUUID item_id); +private: + void addToCurrentOutFit(); + /** + * @brief This method is using to collect selected items. + * In some places gesture_list can be rebuilt by gestureObservers during iterating data from LLScrollListCtrl::getAllSelected(). + * Therefore we have to copy these items to avoid viewer crash. + * @see LLFloaterGesture::onActivateBtnClick + */ + void getSelectedIds(std::vector<LLUUID>& ids); + bool isActionEnabled(const LLSD& command); + /** + * @brief Activation rules: + * According to Gesture Spec: + * 1. If all selected gestures are active: set to inactive + * 2. If all selected gestures are inactive: set to active + * 3. If selected gestures are in a mixed state: set all to active + */ + void onActivateBtnClick(); void onClickEdit(); void onClickPlay(); void onClickNew(); void onCommitList(); + void onCopyPastAction(const LLSD& command); + void onDeleteSelected(); -protected: LLUUID mSelectedID; + LLUUID mGestureFolderID; + LLScrollListCtrl* mGestureList; LLFloaterGestureObserver* mObserver; }; diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index 886f5ec9249c58b9010c5f89b3375268d6a3ce2c..cd3432190b7f4ea43531f7e15e817f53788a3db0 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -415,7 +415,7 @@ LLPanelRegionTools::LLPanelRegionTools() BOOL LLPanelRegionTools::postBuild() { getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this); - childSetPrevalidate("region name", &LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe); childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32); childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32); childDisable("parentestate"); diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 45af515a869a73d127aa349f5db20a6978c04d7b..7cb925bc0b09a8d795cc9761cb3f41bc812e0421 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -327,7 +327,7 @@ void LLPanelGroups::startIM() if (group_list && (group_id = group_list->getCurrentID()).notNull()) { - LLGroupActions::startChat(group_id); + LLGroupActions::startIM(group_id); } } diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index 92778510e70fb13fc47bcf49e8f566261ab88025..db38fc0fb34f65ec715caef1f09b9598df13e635 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -64,10 +64,7 @@ BOOL LLFloaterInventory::postBuild() void LLFloaterInventory::draw() { - if (LLInventoryModel::isEverythingFetched()) - { - updateTitle(); - } + updateTitle(); LLFloater::draw(); } @@ -85,10 +82,14 @@ void LLFloaterInventory::updateTitle() { setTitle(getString("TitleFetching", string_args)); } - else + else if (LLInventoryModel::isEverythingFetched()) { setTitle(getString("TitleCompleted", string_args)); } + else + { + setTitle(getString("Title")); + } } void LLFloaterInventory::changed(U32 mask) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 015a947d9179a730f4b993a650c256e9907bbd14..d855ab1dfa78fcf06d4f898f244949c24588ed0e 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -239,7 +239,7 @@ LLFloaterLand::LLFloaterLand(const LLSD& seed) BOOL LLFloaterLand::postBuild() { - mVisibleSignal.connect(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2)); + setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2)); LLTabContainer* tab = getChild<LLTabContainer>("landtab"); @@ -347,13 +347,14 @@ BOOL LLPanelLandGeneral::postBuild() { mEditName = getChild<LLLineEditor>("Name"); mEditName->setCommitCallback(onCommitAny, this); - childSetPrevalidate("Name", LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe); mEditDesc = getChild<LLTextEditor>("Description"); mEditDesc->setCommitOnFocusLost(TRUE); mEditDesc->setCommitCallback(onCommitAny, this); - childSetPrevalidate("Description", LLLineEditor::prevalidatePrintableNotPipe); - + // No prevalidate function - historically the prevalidate function was broken, + // allowing residents to put in characters like U+2661 WHITE HEART SUIT, so + // preserve that ability. mTextSalePending = getChild<LLTextBox>("SalePending"); mTextOwnerLabel = getChild<LLTextBox>("Owner:"); diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 3fe711a1664d4f1c972271a7755b33033cfe7afe..d18f127f851ff3d45c2a5656186821ad4dbaa264 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -83,7 +83,6 @@ BOOL LLFloaterMap::postBuild() { mMap = getChild<LLNetMap>("Net Map"); mMap->setScale(gSavedSettings.getF32("MiniMapScale")); - mMap->setRotateMap(gSavedSettings.getBOOL( "MiniMapRotate" )); mMap->setToolTipMsg(getString("ToolTipMsg")); sendChildToBack(mMap); @@ -178,7 +177,8 @@ void LLFloaterMap::draw() { F32 rotation = 0; - if( mMap->getRotateMap() ) + static LLUICachedControl<bool> rotate_map("MiniMapRotate", true); + if( rotate_map ) { // rotate subsequent draws to agent rotation rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ); diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index b7296518d460dddc3066068cb8171b8c7ea908c1..810761e034d4b4e694e21aed522cd841addffc97 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::prevalidatePrintableNotPipe); + NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); } 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::prevalidatePrintableNotPipe); + DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); } y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 2af1313db45d15a3296ef715cdfb73a597deaf46..e20249a737a2abe034af34e42dffd655c497c233 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -56,6 +56,7 @@ #include "llfloaterabout.h" #include "llfloaterhardwaresettings.h" #include "llfloatervoicedevicesettings.h" +#include "llimfloater.h" #include "llkeyboard.h" #include "llmodaldialog.h" #include "llnavigationbar.h" @@ -164,7 +165,6 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask) { mParent->setKey(key); } - closeFloater(); return result; } @@ -310,7 +310,8 @@ F32 LLFloaterPreference::sAspectRatio = 0.0; LLFloaterPreference::LLFloaterPreference(const LLSD& key) : LLFloater(key), mGotPersonalInfo(false), - mOriginalIMViaEmail(false) + mOriginalIMViaEmail(false), + mCancelOnClose(true) { //Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); @@ -338,7 +339,6 @@ 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.Logging", boost::bind(&LLFloaterPreference::onCommitLogging, 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)); @@ -348,6 +348,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.AutoDetectAspect", boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, 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)); sSkin = gSavedSettings.getString("SkinCurrent"); @@ -356,6 +358,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) BOOL LLFloaterPreference::postBuild() { + gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2)); + LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab"))) tabcontainer->selectFirstTab(); @@ -389,6 +393,20 @@ void LLFloaterPreference::draw() LLFloater::draw(); } +void LLFloaterPreference::saveSettings() +{ + LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); + child_list_t::const_iterator iter = tabcontainer->getChildList()->begin(); + child_list_t::const_iterator end = tabcontainer->getChildList()->end(); + for ( ; iter != end; ++iter) + { + LLView* view = *iter; + LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view); + if (panel) + panel->saveSettings(); + } +} + void LLFloaterPreference::apply() { LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); @@ -443,6 +461,8 @@ void LLFloaterPreference::apply() // LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString()); // LLWStringUtil::replaceTabsWithSpaces(busy_response, 4); + + gSavedSettings.setBOOL("PlainTextChatHistory", childGetValue("plain_text_chat_history").asBoolean()); if(mGotPersonalInfo) { @@ -550,6 +570,11 @@ void LLFloaterPreference::onOpen(const LLSD& key) LLPanelLogin::setAlwaysRefresh(true); refresh(); + + // Make sure the current state of prefs are saved away when + // when the floater is opened. That will make cancel do its + // job + saveSettings(); } void LLFloaterPreference::onVertexShaderEnable() @@ -568,7 +593,7 @@ void LLFloaterPreference::onClose(bool app_quitting) { gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex()); LLPanelLogin::setAlwaysRefresh(false); - cancel(); // will be a no-op if OK or apply was performed just prior. + if (mCancelOnClose) cancel(); } void LLFloaterPreference::onOpenHardwareSettings() @@ -591,7 +616,11 @@ void LLFloaterPreference::onBtnOK() if (canClose()) { apply(); + // Here we do not want to cancel on close, so we do this funny thing + // that prevents cancel from undoing our changes when we hit OK + mCancelOnClose = false; closeFloater(false); + mCancelOnClose = true; gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); LLUIColorTable::instance().saveUserSettings(); std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); @@ -619,6 +648,7 @@ void LLFloaterPreference::onBtnApply( ) } } apply(); + saveSettings(); LLPanelLogin::refreshLocation( false ); } @@ -635,7 +665,8 @@ void LLFloaterPreference::onBtnCancel() } refresh(); } - closeFloater(); // side effect will also cancel any unsaved changes. + cancel(); + closeFloater(); } // static @@ -1131,27 +1162,6 @@ void LLFloaterPreference::onClickLogPath() gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder); } -void LLFloaterPreference::onCommitLogging() -{ - enableHistory(); -} - -void LLFloaterPreference::enableHistory() -{ - if (childGetValue("log_instant_messages").asBoolean()) - { - childEnable("ChatIMLogs"); - childEnable("log_path_button"); - childEnable("show_timestamps_check_im"); - } - else - { - childDisable("ChatIMLogs"); - childDisable("log_path_button"); - childDisable("show_timestamps_check_im"); - } -} - void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email) { mGotPersonalInfo = true; @@ -1181,6 +1191,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility); childEnable("send_im_to_email"); childSetValue("send_im_to_email", im_via_email); + childEnable("plain_text_chat_history"); + childSetValue("plain_text_chat_history", gSavedSettings.getBOOL("PlainTextChatHistory")); childEnable("log_instant_messages"); // childEnable("log_chat"); // childEnable("busy_response"); @@ -1191,7 +1203,12 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im // childSetText("busy_response", gSavedSettings.getString("BusyModeResponse2")); - enableHistory(); + childEnable("log_nearby_chat"); + childEnable("log_instant_messages"); + childEnable("show_timestamps_check_im"); + childEnable("log_path_string"); + childEnable("log_path_button"); + std::string display_email(email); childSetText("email_address",display_email); @@ -1332,8 +1349,8 @@ void LLFloaterPreference::initWindowSizeControls(LLPanel* panelp) // Look to see if current window size matches existing window sizes, if so then // just set the selection value... - const U32 height = gViewerWindow->getWindowDisplayHeight(); - const U32 width = gViewerWindow->getWindowDisplayWidth(); + const U32 height = gViewerWindow->getWindowHeightRaw(); + const U32 width = gViewerWindow->getWindowWidthRaw(); for (S32 i=0; i < ctrl_window_size->getItemCount(); i++) { U32 height_test = 0; @@ -1356,18 +1373,24 @@ void LLFloaterPreference::initWindowSizeControls(LLPanel* panelp) } +void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param) +{ + LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue())); +} + +void LLFloaterPreference::getUIColor(LLUICtrl* ctrl, const LLSD& param) +{ + LLColorSwatchCtrl* color_swatch = (LLColorSwatchCtrl*) ctrl; + color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString())); +} + //---------------------------------------------------------------------------- static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference"); LLPanelPreference::LLPanelPreference() : LLPanel() { - mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2)); -} - -static void applyUIColor(const std::string& color_name, LLUICtrl* ctrl, const LLSD& param) -{ - LLUIColorTable::instance().setColor(color_name, LLColor4(param)); + mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2)); } //virtual @@ -1496,60 +1519,16 @@ BOOL LLPanelPreference::postBuild() refresh(); } - - if(hasChild("user") && hasChild("agent") && hasChild("im") - && hasChild("system") && hasChild("script_error") && hasChild("objects") - && hasChild("owner") && hasChild("background") && hasChild("links")) - { - LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("user"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "UserChatColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("UserChatColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("agent"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "AgentChatColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("AgentChatColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("im"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "IMChatColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("IMChatColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("system"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "SystemChatColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("SystemChatColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("script_error"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "ScriptErrorColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("ScriptErrorColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("objects"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "ObjectChatColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("ObjectChatColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("owner"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "llOwnerSayChatColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("llOwnerSayChatColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("background"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "BackgroundChatColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("BackgroundChatColor")); - - color_swatch = getChild<LLColorSwatchCtrl>("links"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "HTMLLinkColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("HTMLLinkColor")); - } - - if(hasChild("effect_color_swatch")) - { - LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("effect_color_swatch"); - color_swatch->setCommitCallback(boost::bind(&applyUIColor, "EffectColor", _1, _2)); - color_swatch->setOriginal(LLUIColorTable::instance().getColor("EffectColor")); - } - apply(); return true; } void LLPanelPreference::apply() +{ + // no-op +} + +void LLPanelPreference::saveSettings() { // Save the value of all controls in the hierarchy mSavedValues.clear(); diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index b1ad0348c0de2b60c8ab16fa91923ff365271eaf..a30422564aec1cc9c455a5d82f82a62d51a1f6c7 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -97,6 +97,10 @@ class LLFloaterPreference : public LLFloater // callback for when client turns on shaders void onVertexShaderEnable(); + // This function squirrels away the current values of the controls so that + // cancel() can restore them. + void saveSettings(); + public: @@ -115,7 +119,6 @@ class LLFloaterPreference : public LLFloater void setAllIgnored(); void onClickLogPath(); void enableHistory(); - void onCommitLogging(); void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email); void refreshEnabledState(); void disableUnavailableSettings(); @@ -133,7 +136,9 @@ class LLFloaterPreference : public LLFloater void onCommitAutoDetectAspect(); void applyResolution(); void applyWindowSize(); - + void applyUIColor(LLUICtrl* ctrl, const LLSD& param); + void getUIColor(LLUICtrl* ctrl, const LLSD& param); + static void initWindowSizeControls(LLPanel* panelp); static void buildLists(void* data); @@ -144,6 +149,7 @@ class LLFloaterPreference : public LLFloater static std::string sSkin; bool mGotPersonalInfo; bool mOriginalIMViaEmail; + bool mCancelOnClose; bool mOriginalHideOnlineStatus; std::string mDirectoryVisibility; @@ -159,6 +165,11 @@ class LLPanelPreference : public LLPanel virtual void apply(); virtual void cancel(); void setControlFalse(const LLSD& user_data); + + // This function squirrels away the current values of the controls so that + // cancel() can restore them. + virtual void saveSettings(); + private: typedef std::map<LLControlVariable*, LLSD> control_values_map_t; control_values_map_t mSavedValues; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 4375787ea2eb0d4add6f915b6a238bbd4aa165e1..ff9002787ce859df3a36e5ce54cefd15c770bfa1 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -44,6 +44,7 @@ #include "llbutton.h" #include "llcheckboxctrl.h" #include "llavataractions.h" +#include "llinventoryobserver.h" #include "llinventorymodel.h" #include "lllineeditor.h" //#include "llspinctrl.h" @@ -129,9 +130,9 @@ BOOL LLFloaterProperties::postBuild() { // build the UI // item name & description - childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this)); - childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this)); // Creator information getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this)); @@ -900,7 +901,7 @@ LLMultiProperties::LLMultiProperties() { // start with a small rect in the top-left corner ; will get resized LLRect rect; - rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeight(), 20, 20); + rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20); setRect(rect); } setTitle(LLTrans::getString("MultiPropertiesTitle")); diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 97c573ddea516ecd6f3b777a8c2ffe9605965ccd..e2df2ffdf700a790ca203e626c03dbb72be1893f 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -36,6 +36,7 @@ #include "llmediactrl.h" #include "lllogininstance.h" #include "lluri.h" +#include "llagent.h" LLFloaterSearch::LLFloaterSearch(const LLSD& key) : LLFloater(key), @@ -122,6 +123,22 @@ void LLFloaterSearch::search(const LLSD &key) LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token"); url += "&p=" + search_token.asString(); + // also append the user's preferred maturity (can be changed via prefs) + std::string maturity; + if (gAgent.prefersAdult()) + { + maturity = "42"; // PG,Mature,Adult + } + else if (gAgent.prefersMature()) + { + maturity = "21"; // PG,Mature + } + else + { + maturity = "13"; // PG + } + url += "&r=" + maturity; + // and load the URL in the web view mBrowser->navigateTo(url); } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index e570072803016deff8f1398ccaed0274d29e4566..1cc7042c3a0bb60c645623c5b784efb9113ad459 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -245,10 +245,10 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Param // gIdleCallbacks.addFunction( &LLSnapshotLivePreview::onIdle, (void*)this ); sList.insert(this); setFollowsAll(); - mWidth[0] = gViewerWindow->getWindowDisplayWidth(); - mWidth[1] = gViewerWindow->getWindowDisplayWidth(); - mHeight[0] = gViewerWindow->getWindowDisplayHeight(); - mHeight[1] = gViewerWindow->getWindowDisplayHeight(); + mWidth[0] = gViewerWindow->getWindowWidthRaw(); + mWidth[1] = gViewerWindow->getWindowWidthRaw(); + mHeight[0] = gViewerWindow->getWindowHeightRaw(); + mHeight[1] = gViewerWindow->getWindowHeightRaw(); mImageScaled[0] = FALSE; mImageScaled[1] = FALSE; @@ -494,27 +494,27 @@ void LLSnapshotLivePreview::draw() LLLocalClipRect clip(getLocalRect()); { // draw diagonal stripe with gradient that passes over screen - S32 x1 = gViewerWindow->getWindowWidth() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f))); - S32 x2 = x1 + llround(gViewerWindow->getWindowWidth() * SHINE_WIDTH); - S32 x3 = x2 + llround(gViewerWindow->getWindowWidth() * SHINE_WIDTH); + S32 x1 = gViewerWindow->getWindowWidthScaled() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f))); + S32 x2 = x1 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH); + S32 x3 = x2 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH); S32 y1 = 0; - S32 y2 = gViewerWindow->getWindowHeight(); + S32 y2 = gViewerWindow->getWindowHeightScaled(); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.begin(LLRender::QUADS); { gGL.color4f(1.f, 1.f, 1.f, 0.f); gGL.vertex2i(x1, y1); - gGL.vertex2i(x1 + gViewerWindow->getWindowWidth(), y2); + gGL.vertex2i(x1 + gViewerWindow->getWindowWidthScaled(), y2); gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY); - gGL.vertex2i(x2 + gViewerWindow->getWindowWidth(), y2); + gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2); gGL.vertex2i(x2, y1); gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY); gGL.vertex2i(x2, y1); - gGL.vertex2i(x2 + gViewerWindow->getWindowWidth(), y2); + gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2); gGL.color4f(1.f, 1.f, 1.f, 0.f); - gGL.vertex2i(x3 + gViewerWindow->getWindowWidth(), y2); + gGL.vertex2i(x3 + gViewerWindow->getWindowWidthScaled(), y2); gGL.vertex2i(x3, y1); } gGL.end(); @@ -617,8 +617,8 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize() { return FALSE ; } - S32 window_width = gViewerWindow->getWindowDisplayWidth() ; - S32 window_height = gViewerWindow->getWindowDisplayHeight() ; + S32 window_width = gViewerWindow->getWindowWidthRaw() ; + S32 window_height = gViewerWindow->getWindowHeightRaw() ; F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height); @@ -1168,7 +1168,7 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) gSavedSettings.setS32("SnapshotLocalLastResolution", 0); LLSnapshotLivePreview* previewp = getPreviewView(floaterp); - previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); + previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); } bool use_freeze_frame = floaterp->childGetValue("freeze_frame_check").asBoolean(); @@ -1693,7 +1693,7 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL if (width == 0 || height == 0) { // take resolution from current window size - previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); + previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); } else if (width == -1 || height == -1) { @@ -1846,13 +1846,13 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3 #endif if(previewp && previewp->mKeepAspectRatio) { - if(gViewerWindow->getWindowDisplayWidth() < 1 || gViewerWindow->getWindowDisplayHeight() < 1) + if(gViewerWindow->getWindowWidthRaw() < 1 || gViewerWindow->getWindowHeightRaw() < 1) { return FALSE ; } //aspect ratio of the current window - F32 aspect_ratio = (F32)gViewerWindow->getWindowDisplayWidth() / gViewerWindow->getWindowDisplayHeight() ; + F32 aspect_ratio = (F32)gViewerWindow->getWindowWidthRaw() / gViewerWindow->getWindowHeightRaw() ; //change another value proportionally if(isWidthChanged) diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp index 8af011c17a9a582f80d17ee6b16c2c6a49833d83..09996b0b92cd5271fd5d8a84fb29f63bc7899a0f 100644 --- a/indra/newview/llfloatertestinspectors.cpp +++ b/indra/newview/llfloatertestinspectors.cpp @@ -53,6 +53,9 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors() BOOL LLFloaterTestInspectors::postBuild() { + // Test the dummy widget construction code + getChild<LLUICtrl>("intentionally-not-found")->setEnabled(true); + // getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback( // boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this)); getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback( diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 3aef15a35c0848a0b87889147d2277aedef98be1..88a98c3350db24aebb1b39b1def46fe38c08c901 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -43,6 +43,7 @@ #include "llcheckboxctrl.h" #include "llcombobox.h" #include "lldraghandle.h" +#include "llerror.h" #include "llfloaterbuildoptions.h" #include "llfloatermediasettings.h" #include "llfloateropenobject.h" @@ -86,6 +87,7 @@ #include "llviewermenu.h" #include "llviewerparcelmgr.h" #include "llviewerwindow.h" +#include "llvovolume.h" #include "lluictrlfactory.h" // Globals @@ -421,10 +423,17 @@ void LLFloaterTools::refresh() LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount()); childSetTextArg("prim_count", "[COUNT]", prim_count_string); + // calculate selection rendering cost + std::string prim_cost_string; + LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); + childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string); + + // disable the object and prim counts if nothing selected bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty(); childSetEnabled("obj_count", have_selection); childSetEnabled("prim_count", have_selection); + childSetEnabled("RenderingCost", have_selection); // Refresh child tabs mPanelPermissions->refresh(); @@ -555,6 +564,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) mBtnEdit ->setToggleState( edit_visible ); mRadioGroupEdit->setVisible( edit_visible ); + childSetVisible("RenderingCost", edit_visible || focus_visible || move_visible); if (mCheckSelectIndividual) { @@ -963,6 +973,27 @@ void LLFloaterTools::onClickGridOptions() //floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE); } +S32 LLFloaterTools::calcRenderCost() +{ + S32 cost = 0; + for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin(); + selection_iter != LLSelectMgr::getInstance()->getSelection()->end(); + ++selection_iter) + { + LLSelectNode *select_node = *selection_iter; + if (select_node) + { + LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject(); + if (viewer_volume) + { + cost += viewer_volume->getRenderCost(); + } + } + } + + return cost; +} + // static void LLFloaterTools::setEditTool(void* tool_pointer) { @@ -1073,27 +1104,68 @@ void LLFloaterTools::getMediaState() childSetEnabled("edit_media", FALSE); childSetEnabled("media_info", FALSE); media_info->setEnabled(FALSE); - media_info->clear();*/ + media_info->clear();*/ + LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL; clearMediaSettings(); return; } bool editable = (first_object->permModify() || selectedMediaEditable()); - + + // Check modify permissions and whether any selected objects are in + // the process of being fetched. If they are, then we're not editable + if (editable) + { + LLObjectSelection::iterator iter = selected_objects->begin(); + LLObjectSelection::iterator end = selected_objects->end(); + for ( ; iter != end; ++iter) + { + LLSelectNode* node = *iter; + LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject()); + if (NULL != object) + { + if (!object->permModify()) + { + LL_INFOS("LLFloaterTools: media") + << "Selection not editable due to lack of modify permissions on object id " + << object->getID() << LL_ENDL; + + editable = false; + break; + } + // XXX DISABLE this for now, because when the fetch finally + // does come in, the state of this floater doesn't properly + // update. This needs more thought. +// if (object->isMediaDataBeingFetched()) +// { +// LL_INFOS("LLFloaterTools: media") +// << "Selection not editable due to media data being fetched for object id " +// << object->getID() << LL_ENDL; +// +// editable = false; +// break; +// } + } + } + } + // Media settings - U8 has_media = (U8)0; - struct media_functor : public LLSelectedTEGetFunctor<U8> + bool bool_has_media = false; + struct media_functor : public LLSelectedTEGetFunctor<bool> { - U8 get(LLViewerObject* object, S32 face) + bool get(LLViewerObject* object, S32 face) { - return (object->getTE(face)->getMediaTexGen()); + LLTextureEntry *te = object->getTE(face); + if (te) + { + return te->hasMedia(); + } + return false; } } func; // check if all faces have media(or, all dont have media) - LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, has_media ); - bool bool_has_media = (has_media & LLTextureEntry::MF_HAS_MEDIA); - + LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media ); const LLMediaEntry default_media_data; diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index a3e0cac034241218c323cf53aae0f2173594aafd..05a88a31d31b4ddffa7dea37ec6796227aaf1f3f 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -121,6 +121,7 @@ class LLFloaterTools static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response); static void setObjectType( LLPCode pcode ); void onClickGridOptions(); + S32 calcRenderCost(); public: LLButton *mBtnFocus; diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 663bd232f7466df2a50ed0d7841accb5fd205f11..a1c6704657d9f8cc813615475168fe5bc20f4fb2 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -431,9 +431,9 @@ BOOL LLFloaterUIPreview::postBuild() // get pointers to buttons and link to callbacks mLanguageSelection = main_panel_tmp->getChild<LLComboBox>("language_select_combo"); - mLanguageSelection->setSelectionCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection)); + mLanguageSelection->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection)); mLanguageSelection_2 = main_panel_tmp->getChild<LLComboBox>("language_select_combo_2"); - mLanguageSelection_2->setSelectionCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection)); + mLanguageSelection_2->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection)); LLPanel* editor_panel_tmp = main_panel_tmp->getChild<LLPanel>("editor_panel"); mDisplayFloaterBtn = main_panel_tmp->getChild<LLButton>("display_floater"); mDisplayFloaterBtn->setClickedCallback(boost::bind(&LLFloaterUIPreview::onClickDisplayFloater, this, PRIMARY_FLOATER)); @@ -849,6 +849,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) { LLUICtrlFactory::getInstance()->buildFloater(*floaterp, path, NULL); // just build it (*floaterp)->openFloater((*floaterp)->getKey()); + (*floaterp)->setCanResize((*floaterp)->isResizable()); } } diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 7d2eb98111f497a1cc87d1286a13f7b220c734be..85847e5fce87fce9a41892d9c700d92aef6d9615 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -51,6 +51,7 @@ #include "llfloaterreg.h" // getTypedInstance() #include "llfocusmgr.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "lllandmarklist.h" #include "lllineeditor.h" #include "llregionhandle.h" diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 7863c373c62348b9d203083c8f33772a4a3f6496..955bc64e05dfe91f96ad171a73232e819d1ecbb1 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -220,7 +220,7 @@ LLFolderView::LLFolderView(const Params& p) 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::prevalidatePrintableNotPipe); + params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe); params.commit_on_focus_lost(true); params.visible(false); mRenamer = LLUICtrlFactory::create<LLLineEditor> (params); @@ -909,11 +909,7 @@ void LLFolderView::finishRenamingItem( void ) mRenameItem->rename( mRenamer->getText() ); } - mRenamer->setCommitOnFocusLost( FALSE ); - mRenamer->setFocus( FALSE ); - mRenamer->setVisible( FALSE ); - mRenamer->setCommitOnFocusLost( TRUE ); - gFocusMgr.setTopCtrl( NULL ); + gFocusMgr.setTopCtrl( NULL ); if( mRenameItem ) { @@ -2174,7 +2170,7 @@ void LLFolderView::updateRenamerPosition() screenPointToLocal( x, y, &x, &y ); mRenamer->setOrigin( x, y ); - LLRect scroller_rect(0, 0, gViewerWindow->getWindowWidth(), 0); + LLRect scroller_rect(0, 0, gViewerWindow->getWindowWidthScaled(), 0); if (mScrollContainer) { scroller_rect = mScrollContainer->getContentWindowRect(); diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index 60ece75ceadd565485ab0f97dbe6263cadc336b6..473d0be912b1140164505d29bdb44e05eb230278 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -34,6 +34,8 @@ #include "lldarray.h" // JAMESDEBUG convert to std::vector #include "llfoldertype.h" #include "llfontgl.h" // just for StyleFlags enum +#include "llinventorytype.h" +#include "llpermissionsflags.h" #include "llpointer.h" diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 6fdaefd21ab9030eb3c1f3ec8463ec492de9c448..a1260d115691c3a1752296fccf48c02bd1d31504 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -38,7 +38,6 @@ #include "llfoldervieweventlistener.h" #include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator() #include "llinventoryfilter.h" -#include "llinventorymodel.h" // *TODO: make it take a pointer to an inventory-model interface #include "llviewercontrol.h" // gSavedSettings #include "llviewerwindow.h" // Argh, only for setCursor() @@ -134,8 +133,8 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p) mIconOpen(p.icon_open), mListener(p.listener), mArrowImage(p.folder_arrow_image), - mBoxImage(p.selection_image) -, mDontShowInHierarhy(false) + mBoxImage(p.selection_image), + mDontShowInHierarchy(false) { refresh(); } @@ -388,7 +387,9 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo // makes sure that this view and it's children are the right size. S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation) { - mIndentation = mParentFolder ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0; + mIndentation = getParentFolder() && getParentFolder()->getParentFolder() + ? mParentFolder->getIndentation() + LEFT_INDENTATION + : 0; if (mLabelWidthDirty) { mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel); @@ -410,7 +411,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation) S32 LLFolderViewItem::getItemHeight() { - if (mDontShowInHierarhy) return 0; + if (mDontShowInHierarchy) return 0; S32 icon_height = mIcon->getHeight(); S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight()); @@ -818,7 +819,7 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, void LLFolderViewItem::draw() { - if (mDontShowInHierarhy) return; + if (mDontShowInHierarchy) return; static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE); static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE); @@ -994,14 +995,14 @@ void LLFolderViewItem::draw() S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2; S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3); S32 top = getRect().getHeight(); - + LLRect box_rect(left, top, right, bottom); sBoxImage->draw(box_rect, sFilterBGColor); F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset); F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD; font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y, - sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - filter_string_length, S32_MAX, &right_x, FALSE ); + sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, + filter_string_length, S32_MAX, &right_x, FALSE ); } } } @@ -1252,6 +1253,10 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter) // filter self only on first pass through LLFolderViewItem::filter( filter ); } + if (mDontShowInHierarchy) + { + setOpen(); + } } if (getRoot()->getDebugFilters()) @@ -2165,6 +2170,7 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask ) { + /* Disable outfit double click to wear const LLUUID &cat_uuid = getListener()->getUUID(); const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid); if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) @@ -2172,6 +2178,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask ) getListener()->performAction(NULL, NULL,"replaceoutfit"); return TRUE; } + */ BOOL handled = FALSE; if( mIsOpen ) @@ -2491,11 +2498,13 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde { static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + static const LLUUID& landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID(); LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID(); - if (a_uuid == favorites_folder_id && b_uuid == favorites_folder_id) + if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id) || + (a_uuid == landmarks_folder_id && b_uuid == landmarks_folder_id)) { // *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem // or to LLInvFVBridge diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 62a4b9a18756e40aae08e8bf26333d548be6c2cd..30387812a6694cae2358066f79aa2fc56d554a23 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -110,7 +110,7 @@ class LLFolderViewItem : public LLView // layout constants static const S32 LEFT_PAD = 5; - static const S32 LEFT_INDENTATION = 13; + static const S32 LEFT_INDENTATION = 8; static const S32 ICON_PAD = 2; static const S32 ICON_WIDTH = 16; static const S32 TEXT_PAD = 1; @@ -158,7 +158,7 @@ class LLFolderViewItem : public LLView LLUIImagePtr mBoxImage; BOOL mIsLoading; LLTimer mTimeSinceRequestStart; - bool mDontShowInHierarhy; + bool mDontShowInHierarchy; // helper function to change the selection from the root. void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected); @@ -201,8 +201,8 @@ class LLFolderViewItem : public LLView // makes sure that this view and it's children are the right size. virtual S32 arrange( S32* width, S32* height, S32 filter_generation ); virtual S32 getItemHeight(); - void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarhy = dont_show; } - bool getDontShowInHierarchy() { return mDontShowInHierarhy; } + void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarchy = dont_show; } + bool getDontShowInHierarchy() { return mDontShowInHierarchy; } // applies filters to control visibility of inventory items virtual void filter( LLInventoryFilter& filter); @@ -343,7 +343,7 @@ typedef bool (*sort_order_f)(LLFolderViewItem* a, LLFolderViewItem* b); // // An instance of an LLFolderViewFolder represents a collection of // more folders and items. This is used to build the hierarchy of -// items found in the folder view. :) +// items found in the folder view. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLFolderViewFolder : public LLFolderViewItem diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index 1ff2566dca235c17fff0b3b7fb726ee0ab60dafd..ac060cef158b0733024a26a6cf0c05845503f882 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llinventory.h" +#include "llinventoryobserver.h" #include "lltrans.h" #include "llfriendcard.h" @@ -43,27 +44,24 @@ // Constants; -static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends"; -static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All"; +static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends"; +static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All"; // helper functions -/* -mantipov *NOTE: unable to use -LLTrans::getString("InvFolder Friends"); or -LLTrans::getString("InvFolder FriendsAll"); -in next two functions to set localized folders' names because of there is 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 -*/ -inline const std::string& get_friend_folder_name() +// 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 +inline const std::string get_friend_folder_name() { - return INVENTORY_STRING_FRIENDS_SUBFOLDER; + return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER); } -inline const std::string& get_friend_all_subfolder_name() +inline const std::string get_friend_all_subfolder_name() { - return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER; + return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER); } void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to) @@ -80,55 +78,55 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - gInventory.collectDescendentsIf(parentFolderUUID, cats, items, + gInventory.collectDescendentsIf(parentFolderUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, matchFunctor); - if (cats.count() == 1) + S32 cats_count = cats.count(); + + if (cats_count > 1) { - return cats.get(0)->getUUID(); + LL_WARNS("LLFriendCardsManager") + << "There is more than one Friend card folder." + << "The first folder will be used." + << LL_ENDL; } - return LLUUID::null; + return (cats_count >= 1) ? cats.get(0)->getUUID() : LLUUID::null; } - -// LLViewerInventoryCategory::fetchDescendents has it own period of fetching. -// for now it is FETCH_TIMER_EXPIRY = 10.0f; So made our period a bit more. -const F32 FETCH_FRIENDS_DESCENDENTS_PERIOD = 11.0f; - - /** - * Intended to call passed callback after the specified period of time. + * Class for fetching initial friend cards data * - * Implemented to fix an issue when Inventory folders are in incomplete state. See EXT-2061, EXT-1935, EXT-813. - * For now it uses to periodically sync Inventory Friends/All folder with a Agent's Friends List - * until it is complete. - */ -class FriendListUpdater : public LLEventTimer + * Implemented to fix an issue when Inventory folders are in incomplete state. + * See EXT-2320, EXT-2061, EXT-1935, EXT-813. + * Uses a callback to sync Inventory Friends/All folder with agent's Friends List. + */ +class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver { public: - typedef boost::function<bool()> callback_t; + typedef boost::function<void()> callback_t; - FriendListUpdater(callback_t cb, F32 period) - : LLEventTimer(period) - , mCallback(cb) - { - mEventTimer.start(); - } + LLInitialFriendCardsFetch(callback_t cb) + : mCheckFolderCallback(cb) {} - virtual BOOL tick() // from LLEventTimer - { - return mCallback(); - } + /* virtual */ void done(); private: - callback_t mCallback; + callback_t mCheckFolderCallback; }; +void LLInitialFriendCardsFetch::done() +{ + // This observer is no longer needed. + gInventory.removeObserver(this); + + mCheckFolderCallback(); + + delete this; +} // LLFriendCardsManager Constructor / Destructor LLFriendCardsManager::LLFriendCardsManager() -: mFriendsAllFolderCompleted(true) { LLAvatarTracker::instance().addObserver(this); } @@ -167,30 +165,6 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID) return rv; } -// be sure LLInventoryModel::buildParentChildMap() has been called before it. -// and this method must be called before any actions with friend list -void LLFriendCardsManager::ensureFriendFoldersExist() -{ - const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); - - LLUUID friendFolderUUID = findFriendFolderUUIDImpl(); - - if (friendFolderUUID.isNull()) - { - friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID, - LLFolderType::FT_CALLINGCARD, get_friend_folder_name()); - } - - LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl(); - - if (friendAllSubfolderUUID.isNull()) - { - friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID, - LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); - } -} - - bool LLFriendCardsManager::isItemInAnyFriendsList(const LLViewerInventoryItem* item) { if (item->getType() != LLAssetType::AT_CALLINGCARD) @@ -305,63 +279,12 @@ bool LLFriendCardsManager::isAnyFriendCategory(const LLUUID& catID) const return TRUE == gInventory.isObjectDescendentOf(catID, friendFolderID); } -bool LLFriendCardsManager::syncFriendsFolder() +void LLFriendCardsManager::syncFriendCardsFolders() { - //lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" if they are absent - LLFriendCardsManager::instance().ensureFriendFoldersExist(); - - LLAvatarTracker::buddy_map_t all_buddies; - LLAvatarTracker::instance().copyBuddyList(all_buddies); - - // 1. Remove Friend Cards for non-friends - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - - gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH); - - LLInventoryModel::item_array_t::const_iterator it; - for (it = items.begin(); it != items.end(); ++it) - { - lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl; - if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID())) - { - lldebugs << "NONEXISTS, so remove it" << llendl; - removeFriendCardFromInventory((*it)->getCreatorUUID()); - } - } - - // 2. Add missing Friend Cards for friends - LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); - llinfos << "try to build friends, count: " << all_buddies.size() << llendl; - mFriendsAllFolderCompleted = true; - for(; buddy_it != all_buddies.end(); ++buddy_it) - { - const LLUUID& buddy_id = (*buddy_it).first; - addFriendCardToInventory(buddy_id); - } - - if (!mFriendsAllFolderCompleted) - { - forceFriendListIsLoaded(findFriendAllSubfolderUUIDImpl()); - - static bool timer_started = false; - if (!timer_started) - { - lldebugs << "Create and start timer to sync Inventory Friends All folder with Friends list" << llendl; - - // do not worry about destruction of the FriendListUpdater. - // It will be deleted by LLEventTimer::updateClass when FriendListUpdater::tick() returns true. - new FriendListUpdater(boost::bind(&LLFriendCardsManager::syncFriendsFolder, this), - FETCH_FRIENDS_DESCENDENTS_PERIOD); - } - timer_started = true; - } - else - { - lldebugs << "Friends/All Inventory folder is synchronized with the Agent's Friends List" << llendl; - } + const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); - return mFriendsAllFolderCompleted; + fetchAndCheckFolderDescendents(callingCardsFolderID, + boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this)); } void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const @@ -427,13 +350,8 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName); } -const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const +const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const { - // mantipov *HACK: get localaized name in the same way like in the LLFolderViewItem::refreshFromListener() method. - // be sure these both methods are synchronized. - // see also get_friend_folder_name() and get_friend_all_subfolder_name() functions - std::string localizedName = LLTrans::getString("InvFolder " + folderLabel); - LLNameCategoryCollector matchFolderFunctor(localizedName); return get_folder_uuid(parentFolderUUID, matchFolderFunctor); @@ -482,6 +400,122 @@ 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()) + { + // everything is already here - call done. + fetch->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(fetch); + } +} + +// Make sure LLInventoryModel::buildParentChildMap() has been called before it. +// This method must be called before any actions with friends list. +void LLFriendCardsManager::ensureFriendsFolderExists() +{ + const LLUUID calling_cards_folder_ID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); + + // If "Friends" folder exists in "Calling Cards" we should check if "All" sub-folder + // exists in "Friends", otherwise we create it. + LLUUID friends_folder_ID = findFriendFolderUUIDImpl(); + if (friends_folder_ID.notNull()) + { + fetchAndCheckFolderDescendents(friends_folder_ID, + boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this)); + } + else + { + if (!gInventory.isCategoryComplete(calling_cards_folder_ID)) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(calling_cards_folder_ID); + std::string cat_name = cat ? cat->getName() : "unknown"; + llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl; + } + + friends_folder_ID = gInventory.createNewCategory(calling_cards_folder_ID, + LLFolderType::FT_CALLINGCARD, get_friend_folder_name()); + + gInventory.createNewCategory(friends_folder_ID, + LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); + + // Now when we have all needed folders we can sync their contents with buddies list. + syncFriendsFolder(); + } +} + +// Make sure LLFriendCardsManager::ensureFriendsFolderExists() has been called before it. +void LLFriendCardsManager::ensureFriendsAllFolderExists() +{ + LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl(); + if (friends_all_folder_ID.notNull()) + { + fetchAndCheckFolderDescendents(friends_all_folder_ID, + boost::bind(&LLFriendCardsManager::syncFriendsFolder, this)); + } + else + { + LLUUID friends_folder_ID = findFriendFolderUUIDImpl(); + + if (!gInventory.isCategoryComplete(friends_folder_ID)) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID); + std::string cat_name = cat ? cat->getName() : "unknown"; + llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl; + } + + friends_all_folder_ID = gInventory.createNewCategory(friends_folder_ID, + LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); + + // Now when we have all needed folders we can sync their contents with buddies list. + syncFriendsFolder(); + } +} + +void LLFriendCardsManager::syncFriendsFolder() +{ + LLAvatarTracker::buddy_map_t all_buddies; + LLAvatarTracker::instance().copyBuddyList(all_buddies); + + // 1. Remove Friend Cards for non-friends + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + + gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH); + + LLInventoryModel::item_array_t::const_iterator it; + for (it = items.begin(); it != items.end(); ++it) + { + lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl; + if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID())) + { + lldebugs << "NONEXISTS, so remove it" << llendl; + removeFriendCardFromInventory((*it)->getCreatorUUID()); + } + } + + // 2. Add missing Friend Cards for friends + LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); + llinfos << "try to build friends, count: " << all_buddies.size() << llendl; + for(; buddy_it != all_buddies.end(); ++buddy_it) + { + const LLUUID& buddy_id = (*buddy_it).first; + addFriendCardToInventory(buddy_id); + } +} + class CreateFriendCardCallback : public LLInventoryCallback { public: @@ -494,9 +528,8 @@ class CreateFriendCardCallback : public LLInventoryCallback } }; -bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) +void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) { - LLInventoryModel* invModel = &gInventory; bool shouldBeAdded = true; std::string name; @@ -518,13 +551,6 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) lldebugs << "is found in sentRequests: " << name << llendl; } - LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl(); - if (friendListFolderID.notNull() && shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID)) - { - mFriendsAllFolderCompleted = false; - shouldBeAdded = false; - lldebugs << "Friends/All category is not completed" << llendl; - } if (shouldBeAdded) { putAvatarData(avatarID); @@ -533,10 +559,8 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) // TODO: mantipov: Is CreateFriendCardCallback really needed? Probably not LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback(); - create_inventory_callingcard(avatarID, friendListFolderID, cb); + create_inventory_callingcard(avatarID, findFriendAllSubfolderUUIDImpl(), cb); } - - return shouldBeAdded; } void LLFriendCardsManager::removeFriendCardFromInventory(const LLUUID& avatarID) @@ -582,11 +606,4 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask) } } -void LLFriendCardsManager::forceFriendListIsLoaded(const LLUUID& folder_id) const -{ - bool fetching_inventory = gInventory.fetchDescendentsOf(folder_id); - lldebugs << "Trying to fetch descendants of Friends/All Inventory folder, fetched: " - << fetching_inventory << llendl; -} - // EOF diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index feea05bc1dcc8cc3df219590686a48c344d2aee4..b94d5ec2c0058c51c6e4de51798ae5d4e8e3c018 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -57,14 +57,6 @@ class LLFriendCardsManager onFriendListUpdate(mask); } - /** - * Ensures that all necessary folders are created in Inventory. - * - * For now it processes Calling Card, Calling Card/Friends & Calling Card/Friends/All folders - */ - void ensureFriendFoldersExist(); - - /** * Determines if specified Inventory Calling Card exists in any of lists * in the Calling Card/Friends/ folder (Default, or Custom) @@ -88,11 +80,10 @@ class LLFriendCardsManager bool isAnyFriendCategory(const LLUUID& catID) const; /** - * Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List - * - * @return true - if folder is already synchronized, false otherwise. + * Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category + * (creates them otherwise) and fetches their contents to synchronize with Agent's Friends List. */ - bool syncFriendsFolder(); + void syncFriendCardsFolders(); /*! * \brief @@ -108,6 +99,8 @@ class LLFriendCardsManager void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const; private: + typedef boost::function<void()> callback_t; + LLFriendCardsManager(); ~LLFriendCardsManager(); @@ -127,16 +120,35 @@ class LLFriendCardsManager return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID)); } - const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const; + const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const; const LLUUID& findFriendFolderUUIDImpl() const; const LLUUID& findFriendAllSubfolderUUIDImpl() const; const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID); void findMatchedFriendCards(const LLUUID& avatarID, LLInventoryModel::item_array_t& items) const; + void fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb); + + /** + * Checks whether "Calling Cards/Friends" folder exists. If not, creates it with "All" + * sub-folder and synchronizes its contents with buddies list. + */ + void ensureFriendsFolderExists(); + + /** + * Checks whether "Calling Cards/Friends/All" folder exists. If not, creates it and + * synchronizes its contents with buddies list. + */ + void ensureFriendsAllFolderExists(); + + /** + * Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List + */ + void syncFriendsFolder(); + /** * Adds avatar specified by its UUID into the Calling Card/Friends/All Global Inventory folder */ - bool addFriendCardToInventory(const LLUUID& avatarID); + void addFriendCardToInventory(const LLUUID& avatarID); /** * Removes an avatar specified by its UUID from the Calling Card/Friends/All Global Inventory folder @@ -146,20 +158,11 @@ class LLFriendCardsManager void onFriendListUpdate(U32 changed_mask); - /** - * Force fetching of the Inventory folder specified by passed folder's LLUUID. - * - * It only sends request to server, server reply should be processed in other place. - * Because request can be sent via UDP we need to periodically check if request was completed with success. - */ - void forceFriendListIsLoaded(const LLUUID& folder_id) const; - private: typedef std::set<LLUUID> avatar_uuid_set_t; avatar_uuid_set_t mBuddyIDSet; - bool mFriendsAllFolderCompleted; }; #endif // LL_LLFRIENDCARD_H diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 59274c8638cff9b395f1a8d1b0f2f981015f393a..d85ac477e19d1ef4014f7b8c85e992c663da484d 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -37,7 +37,6 @@ // system #include <functional> #include <algorithm> -#include <boost/tokenizer.hpp> // library #include "lldatapacker.h" @@ -61,6 +60,9 @@ // Longest time, in seconds, to wait for all animations to stop playing const F32 MAX_WAIT_ANIM_SECS = 30.f; +// If this gesture is a link, get the base gesture that this link points to, +// otherwise just return this id. +static const LLUUID& get_linked_uuid(const LLUUID& item_id); // Lightweight constructor. // init() does the heavy lifting. @@ -206,11 +208,16 @@ struct LLLoadInfo // If inform_server is true, will send a message upstream to update // the user_gesture_active table. +/** + * It will load a gesture from remote storage + */ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id, const LLUUID& asset_id, BOOL inform_server, BOOL deactivate_similar) { + const LLUUID& base_item_id = get_linked_uuid(item_id); + if( !gAssetStorage ) { llwarns << "LLGestureManager::activateGestureWithAsset without valid gAssetStorage" << llendl; @@ -231,13 +238,13 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id, // For now, put NULL into the item map. We'll build a gesture // class object when the asset data arrives. - mActive[item_id] = NULL; + mActive[base_item_id] = NULL; // Copy the UUID if (asset_id.notNull()) { LLLoadInfo* info = new LLLoadInfo; - info->mItemID = item_id; + info->mItemID = base_item_id; info->mInformServer = inform_server; info->mDeactivateSimilar = deactivate_similar; @@ -257,7 +264,8 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id, void LLGestureManager::deactivateGesture(const LLUUID& item_id) { - item_map_t::iterator it = mActive.find(item_id); + const LLUUID& base_item_id = get_linked_uuid(item_id); + item_map_t::iterator it = mActive.find(base_item_id); if (it == mActive.end()) { llwarns << "deactivateGesture for inactive gesture " << item_id << llendl; @@ -277,7 +285,7 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id) } mActive.erase(it); - gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + gInventory.addChangedMask(LLInventoryObserver::LABEL, base_item_id); // Inform the database of this change LLMessageSystem* msg = gMessageSystem; @@ -299,6 +307,7 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id) void LLGestureManager::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; // Deactivate all gestures that match @@ -310,7 +319,7 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI // Don't deactivate the gesture we are looking for duplicates of // (for replaceGesture) - if (!gest || item_id == in_item_id) + if (!gest || item_id == base_in_item_id) { // legal, can have null pointers in list ++it; @@ -385,14 +394,17 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI BOOL LLGestureManager::isGestureActive(const LLUUID& item_id) { - item_map_t::iterator it = mActive.find(item_id); + const LLUUID& base_item_id = get_linked_uuid(item_id); + item_map_t::iterator it = mActive.find(base_item_id); return (it != mActive.end()); } BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id) { - item_map_t::iterator it = mActive.find(item_id); + const LLUUID& base_item_id = get_linked_uuid(item_id); + + item_map_t::iterator it = mActive.find(base_item_id); if (it == mActive.end()) return FALSE; LLMultiGesture* gesture = (*it).second; @@ -403,19 +415,21 @@ BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id) void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id) { - item_map_t::iterator it = mActive.find(item_id); + const LLUUID& base_item_id = get_linked_uuid(item_id); + + item_map_t::iterator it = mActive.find(base_item_id); if (it == mActive.end()) { - llwarns << "replaceGesture for inactive gesture " << item_id << llendl; + llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl; return; } LLMultiGesture* old_gesture = (*it).second; stopGesture(old_gesture); - mActive.erase(item_id); + mActive.erase(base_item_id); - mActive[item_id] = new_gesture; + mActive[base_item_id] = new_gesture; delete old_gesture; old_gesture = NULL; @@ -426,7 +440,7 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new mDeactivateSimilarNames.clear(); LLLoadInfo* info = new LLLoadInfo; - info->mItemID = item_id; + info->mItemID = base_item_id; info->mInformServer = TRUE; info->mDeactivateSimilar = FALSE; @@ -443,16 +457,18 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new void LLGestureManager::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id) { - item_map_t::iterator it = LLGestureManager::instance().mActive.find(item_id); + const LLUUID& base_item_id = get_linked_uuid(item_id); + + item_map_t::iterator it = LLGestureManager::instance().mActive.find(base_item_id); if (it == mActive.end()) { - llwarns << "replaceGesture for inactive gesture " << item_id << llendl; + llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl; return; } // mActive owns this gesture pointer, so clean up memory. LLMultiGesture* gesture = (*it).second; - LLGestureManager::instance().replaceGesture(item_id, gesture, new_asset_id); + LLGestureManager::instance().replaceGesture(base_item_id, gesture, new_asset_id); } void LLGestureManager::playGesture(LLMultiGesture* gesture) @@ -476,7 +492,9 @@ void LLGestureManager::playGesture(LLMultiGesture* gesture) // Convenience function that looks up the item_id for you. void LLGestureManager::playGesture(const LLUUID& item_id) { - item_map_t::iterator it = mActive.find(item_id); + const LLUUID& base_item_id = get_linked_uuid(item_id); + + item_map_t::iterator it = mActive.find(base_item_id); if (it == mActive.end()) return; LLMultiGesture* gesture = (*it).second; @@ -921,8 +939,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs, delete info; info = NULL; - - LLGestureManager::instance().mLoadingCount--; + LLGestureManager& self = LLGestureManager::instance(); + self.mLoadingCount--; if (0 == status) { @@ -944,15 +962,15 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs, { if (deactivate_similar) { - LLGestureManager::instance().deactivateSimilarGestures(gesture, item_id); + self.deactivateSimilarGestures(gesture, item_id); // Display deactivation message if this was the last of the bunch. - if (LLGestureManager::instance().mLoadingCount == 0 - && LLGestureManager::instance().mDeactivateSimilarNames.length() > 0) + if (self.mLoadingCount == 0 + && self.mDeactivateSimilarNames.length() > 0) { // we're done with this set of deactivations LLSD args; - args["NAMES"] = LLGestureManager::instance().mDeactivateSimilarNames; + args["NAMES"] = self.mDeactivateSimilarNames; LLNotifications::instance().add("DeactivatedGesturesTrigger", args); } } @@ -965,9 +983,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs, else { // Watch this item and set gesture name when item exists in inventory - LLGestureManager::instance().watchItem(item_id); + self.watchItem(item_id); } - LLGestureManager::instance().mActive[item_id] = gesture; + self.mActive[item_id] = gesture; // Everything has been successful. Add to the active list. gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); @@ -989,14 +1007,21 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs, gAgent.sendReliableMessage(); } + callback_map_t::iterator i_cb = self.mCallbackMap.find(item_id); + + if(i_cb != self.mCallbackMap.end()) + { + i_cb->second(gesture); + self.mCallbackMap.erase(i_cb); + } - LLGestureManager::instance().notifyObservers(); + self.notifyObservers(); } else { llwarns << "Unable to load gesture" << llendl; - LLGestureManager::instance().mActive.erase(item_id); + self.mActive.erase(item_id); delete gesture; gesture = NULL; @@ -1065,7 +1090,9 @@ void LLGestureManager::stopGesture(LLMultiGesture* gesture) void LLGestureManager::stopGesture(const LLUUID& item_id) { - item_map_t::iterator it = mActive.find(item_id); + const LLUUID& base_item_id = get_linked_uuid(item_id); + + item_map_t::iterator it = mActive.find(base_item_id); if (it == mActive.end()) return; LLMultiGesture* gesture = (*it).second; @@ -1162,3 +1189,15 @@ void LLGestureManager::done() } notifyObservers(); } + +// static +const LLUUID& get_linked_uuid(const LLUUID &item_id) +{ + LLViewerInventoryItem* item = gInventory.getItem(item_id); + if (item && item->getIsLinkType()) + { + return item->getLinkedUUID(); + } + return item_id; +} + diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 947773d66dc18cf973af928df955ae05ba1a744b..094ca1379843e4a9f6e258c5e46860cb5dcd5f8e 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -38,7 +38,7 @@ #include <vector> #include "llassetstorage.h" // LLAssetType -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llsingleton.h" #include "llviewerinventory.h" @@ -57,6 +57,12 @@ class LLGestureManagerObserver class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver { public: + + typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t; + // Maps inventory item_id to gesture + typedef std::map<LLUUID, LLMultiGesture*> item_map_t; + typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t; + LLGestureManager(); ~LLGestureManager(); @@ -97,6 +103,7 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor BOOL isGesturePlaying(const LLUUID& item_id); + const item_map_t& getActiveGestures() const { return mActive; } // Force a gesture to be played, for example, if it is being // previewed. void playGesture(LLMultiGesture* gesture); @@ -106,7 +113,15 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor // Also remove from playing list void stopGesture(LLMultiGesture* gesture); void stopGesture(const LLUUID& item_id); - + /** + * Add cb into callbackMap. + * Note: + * Manager will call cb after gesture will be loaded and will remove cb automatically. + */ + void setGestureLoadedCallback(LLUUID inv_item_id, gesture_loaded_callback_t cb) + { + mCallbackMap[inv_item_id] = cb; + } // Trigger the first gesture that matches this key. // Returns TRUE if it finds a gesture bound to that key. BOOL triggerGesture(KEY key, MASK mask); @@ -144,13 +159,7 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status); -public: - BOOL mValid; - std::vector<LLMultiGesture*> mPlaying; - - // Maps inventory item_id to gesture - typedef std::map<LLUUID, LLMultiGesture*> item_map_t; - +private: // Active gestures. // NOTE: The gesture pointer CAN BE NULL. This means that // there is a gesture with that item_id, but the asset data @@ -159,8 +168,11 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor S32 mLoadingCount; std::string mDeactivateSimilarNames; - + std::vector<LLGestureManagerObserver*> mObservers; + callback_map_t mCallbackMap; + std::vector<LLMultiGesture*> mPlaying; + BOOL mValid; }; #endif diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 43fbe362d5954b65820865c063d690b71f6b7c2d..750a9d478fe5c1ee023716fc3885697bece3c345 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -67,7 +67,10 @@ #include "llresmgr.h" #include "pipeline.h" #include "llspatialpartition.h" - + +// 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()) diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index e60bde9fd8911afb72cccfee1393849f09733d6b..f4e1951c7b2f9869bd504234702a55f82db61165 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -272,7 +272,7 @@ void LLGroupActions::closeGroup(const LLUUID& group_id) // static -void LLGroupActions::startChat(const LLUUID& group_id) +void LLGroupActions::startIM(const LLUUID& group_id) { if (group_id.isNull()) return; @@ -298,6 +298,19 @@ void LLGroupActions::startChat(const LLUUID& group_id) } } +// static +void LLGroupActions::endIM(const LLUUID& group_id) +{ + if (group_id.isNull()) + return; + + LLUUID session_id = gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id); + if (session_id != LLUUID::null) + { + gIMMgr->leaveSession(session_id); + } +} + // static bool LLGroupActions::isInGroup(const LLUUID& group_id) { diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h index 74c84d1561749864997d59231dd9f6f3b581abf3..9750b3e3cb7af2a54c1ada7c479fd29eb8a037ea 100644 --- a/indra/newview/llgroupactions.h +++ b/indra/newview/llgroupactions.h @@ -88,7 +88,12 @@ class LLGroupActions /** * Start group instant messaging session. */ - static void startChat(const LLUUID& group_id); + static void startIM(const LLUUID& group_id); + + /** + * End group instant messaging session. + */ + static void endIM(const LLUUID& group_id); /// Returns if the current user is a member of the group static bool isInGroup(const LLUUID& group_id); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 010ed23918d1560c4df17e4cee36f346299bfbe3..cdb85f5b1c2db489752e44307504ae35bad4f219 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -181,13 +181,9 @@ void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LL // item->setContextMenu(mContextMenu); item->childSetVisible("info_btn", false); + item->childSetVisible("profile_btn", false); item->setGroupIconVisible(mShowIcons); - if (id.isNull()) - { - item->childSetVisible("profile_btn", false); - } - addItem(item, id, pos); // setCommentVisible(false); @@ -254,7 +250,10 @@ void LLGroupListItem::onMouseEnter(S32 x, S32 y, MASK mask) { childSetVisible("hovered_icon", true); if (mGroupID.notNull()) // don't show the info button for the "none" group + { mInfoBtn->setVisible(true); + childSetVisible("profile_btn", true); + } LLPanel::onMouseEnter(x, y, mask); } @@ -263,6 +262,7 @@ void LLGroupListItem::onMouseLeave(S32 x, S32 y, MASK mask) { childSetVisible("hovered_icon", false); mInfoBtn->setVisible(false); + childSetVisible("profile_btn", false); LLPanel::onMouseLeave(x, y, mask); } diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 0626a5c3d31c98cb6adc7ea0963c02bc73b20d4b..59537c1e6518d0f40582f52add6d5849b3b5a51c 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -52,6 +52,7 @@ #include "llviewerwindow.h" #include "llpanelgroup.h" #include "llgroupactions.h" +#include "llnotifications.h" #include "lluictrlfactory.h" #include <boost/regex.hpp> diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp index eda1d3fc55b8ce6a5bd44169cfb1cf57cf5a017f..040027c70d6e509d59b3b9ebcf20f48a5d773a18 100644 --- a/indra/newview/llhudicon.cpp +++ b/indra/newview/llhudicon.cpp @@ -145,8 +145,8 @@ void LLHUDIcon::renderIcon(BOOL for_select) } F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight() ; - LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec; - LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec; + LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec; + LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec; LLVector3 lower_left = icon_position - (x_scale * 0.5f); LLVector3 lower_right = icon_position + (x_scale * 0.5f); @@ -261,8 +261,8 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en } F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight() ; - LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec; - LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec; + LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec; + LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec; LLVector3 lower_left = icon_position - (x_scale * 0.5f); LLVector3 lower_right = icon_position + (x_scale * 0.5f); diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index 886fe3da0750594c58c79c876c783b505feeffce..ab0be90defa82611b96f3ad214b782b8049da093 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -77,8 +77,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->getWorldViewWidth(), 0.f); - up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeight()); + right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidthRaw(), 0.f); + up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightRaw()); } else { @@ -106,7 +106,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, //get the render_pos in screen space F64 winX, winY, winZ; - LLRect world_view_rect = gViewerWindow->getWorldViewRect(); + LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw(); S32 viewport[4]; viewport[0] = world_view_rect.mLeft; viewport[1] = world_view_rect.mBottom; diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 55019f91f89d2f1458512c2697646359d4c2c12c..0b5da40be4d5fb74594b2b58457613ccf49a8b54 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -156,8 +156,8 @@ BOOL LLHUDText::lineSegmentIntersect(const LLVector3& start, const LLVector3& en if (mOnHUDAttachment) { - x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidth(); - y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeight(); + x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidthScaled(); + y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeightScaled(); } else { @@ -316,8 +316,8 @@ void LLHUDText::renderText(BOOL for_select) if (mOnHUDAttachment) { - x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidth(); - y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeight(); + x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidthRaw(); + y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeightRaw(); } else { @@ -351,8 +351,8 @@ void LLHUDText::renderText(BOOL for_select) //if (mOnHUD) //{ - // render_position.mV[VY] -= fmodf(render_position.mV[VY], 1.f / (F32)gViewerWindow->getWindowWidth()); - // render_position.mV[VZ] -= fmodf(render_position.mV[VZ], 1.f / (F32)gViewerWindow->getWindowHeight()); + // render_position.mV[VY] -= fmodf(render_position.mV[VY], 1.f / (F32)gViewerWindow->getWindowWidthScaled()); + // render_position.mV[VZ] -= fmodf(render_position.mV[VZ], 1.f / (F32)gViewerWindow->getWindowHeightScaled()); //} //else //{ @@ -800,7 +800,7 @@ LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset) screen_pos_vec.setVec((F32)screen_pos.mX, (F32)screen_pos.mY); - LLRect world_rect = gViewerWindow->getVirtualWorldViewRect(); + LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); S32 bottom = world_rect.mBottom + STATUS_BAR_HEIGHT; LLVector2 screen_center; @@ -897,7 +897,7 @@ void LLHUDText::updateAll() std::sort(sVisibleHUDTextObjects.begin(), sVisibleHUDTextObjects.end(), lltextobject_further_away()); // iterate from front to back, and set LOD based on current screen coverage - F32 screen_area = (F32)(gViewerWindow->getWindowWidth() * gViewerWindow->getWindowHeight()); + F32 screen_area = (F32)(gViewerWindow->getWindowWidthScaled() * gViewerWindow->getWindowHeightScaled()); F32 current_screen_area = 0.f; std::vector<LLPointer<LLHUDText> >::reverse_iterator r_it; for (r_it = sVisibleTextObjects.rbegin(); r_it != sVisibleTextObjects.rend(); ++r_it) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index a634a1b0fd05d17878e07f13d99f33e9db866c97..ee93a9349ae5a147c956644d714f25f9114696f5 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -53,6 +53,10 @@ #include "lltransientfloatermgr.h" #include "llinventorymodel.h" +#ifdef USE_IM_CONTAINER + #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container +#endif + LLIMFloater::LLIMFloater(const LLUUID& session_id) @@ -106,10 +110,10 @@ void LLIMFloater::onFocusReceived() // virtual void LLIMFloater::onClose(bool app_quitting) { - if (!gIMMgr->hasSession(mSessionID)) return; - setTyping(false); - gIMMgr->leaveSession(mSessionID); + // SJB: We want the close button to hide the session window, not end it + // *NOTE: Yhis is functional, but not ideal - it's still closing the floater; we really want to change the behavior of the X button instead. + //gIMMgr->leaveSession(mSessionID); } /* static */ @@ -120,11 +124,7 @@ void LLIMFloater::newIMCallback(const LLSD& data){ LLUUID session_id = data["session_id"].asUUID(); LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); - if (floater == NULL) - { - llwarns << "new_im_callback for non-existent session_id " << session_id << llendl; - return; - } + if (floater == NULL) return; // update if visible, otherwise will be updated when opened if (floater->getVisible()) @@ -211,6 +211,7 @@ BOOL LLIMFloater::postBuild() } mControlPanel->setSessionId(mSessionID); + mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel")); LLButton* slide_left = getChild<LLButton>("slide_left_btn"); slide_left->setVisible(mControlPanel->getVisible()); @@ -260,7 +261,11 @@ BOOL LLIMFloater::postBuild() //*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla" //see LLFloaterIMPanel for how it is done (IB) +#ifdef USE_IM_CONTAINER + return LLFloater::postBuild(); +#else return LLDockableFloater::postBuild(); +#endif } // virtual @@ -321,6 +326,11 @@ void LLIMFloater::onSlide() //static LLIMFloater* LLIMFloater::show(const LLUUID& session_id) { +#ifdef USE_IM_CONTAINER + LLIMFloater* target_floater = findInstance(session_id); + bool not_existed = NULL == target_floater; + +#else //hide all LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel"); for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); @@ -332,12 +342,25 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id) floater->setVisible(false); } } +#endif LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id); floater->updateMessages(); floater->mInputEditor->setFocus(TRUE); +#ifdef USE_IM_CONTAINER + // do not add existed floaters to avoid adding torn off instances + if (not_existed) + { + // LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END; + // TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists + LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END; + + LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container"); + floater_container->addFloater(floater, TRUE, i_pt); + } +#else if (floater->getDockControl() == NULL) { LLChiclet* chiclet = @@ -355,15 +378,14 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id) floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1))); } - - floater->childSetVisible("panel_im_control_panel", gSavedSettings.getBOOL("IMShowControlPanel")); +#endif return floater; } void LLIMFloater::getAllowedRect(LLRect& rect) { - rect = gViewerWindow->getWorldViewRect(); + rect = gViewerWindow->getWorldViewRectRaw(); } void LLIMFloater::setDocked(bool docked, bool pop_on_undock) @@ -372,10 +394,10 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock) LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*> (LLNotificationsUI::LLChannelManager::getInstance()-> findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); - - setCanResize(!docked); +#ifndef USE_IM_CONTAINER LLTransientDockableFloater::setDocked(docked, pop_on_undock); +#endif // update notification channel state if(channel) @@ -401,6 +423,7 @@ void LLIMFloater::setVisible(BOOL visible) //static bool LLIMFloater::toggle(const LLUUID& session_id) { +#ifndef USE_IM_CONTAINER LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); if (floater && floater->getVisible() && floater->isDocked()) { @@ -416,6 +439,7 @@ bool LLIMFloater::toggle(const LLUUID& session_id) return true; } else +#endif { // ensure the list of messages is updated when floater is made visible show(session_id); @@ -458,12 +482,14 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id) void LLIMFloater::updateMessages() { + bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory"); + std::list<LLSD> messages; LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1); if (messages.size()) { - LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor"); +// LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor"); std::ostringstream message; std::list<LLSD>::const_reverse_iterator iter = messages.rbegin(); @@ -476,15 +502,14 @@ void LLIMFloater::updateMessages() LLUUID from_id = msg["from_id"].asUUID(); std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You"); std::string message = msg["message"].asString(); - LLStyle::Params style_params; - style_params.color(chat_color); - LLChat chat(message); + LLChat chat; chat.mFromID = from_id; chat.mFromName = from; - - mChatHistory->appendWidgetMessage(chat, style_params); - + chat.mText = message; + chat.mTimeStr = time; + + mChatHistory->appendMessage(chat, use_plain_text_chat_history); mLastMessageIndex = msg["index"].asInteger(); } } @@ -499,7 +524,7 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void* LLIMModel::LLIMSession* im_session = LLIMModel::instance().findIMSession(self->mSessionID); //TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK) - if( im_session && im_session->mTextIMPossible && !self->mInputEditor->getEnabled()) + if( im_session && im_session->mTextIMPossible && self->mInputEditor->getEnabled()) { //in disconnected state IM input editor should be disabled self->mInputEditor->setEnabled(!gDisconnected); @@ -615,6 +640,28 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body) } } +void LLIMFloater::updateChatHistoryStyle() +{ + mChatHistory->clear(); + mLastMessageIndex = -1; + updateMessages(); +} + +void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue) +{ + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel"); + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); + iter != inst_list.end(); ++iter) + { + LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter); + if (floater) + { + floater->updateChatHistoryStyle(); + } + } + +} + void LLIMFloater::processSessionUpdate(const LLSD& session_update) { // *TODO : verify following code when moderated mode will be implemented diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index 065441b18895a1a5018b6b8f0952ca90340de0ee..9e1330ff497ea4112b9cc0b72b18c697e9858862 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -33,6 +33,11 @@ #ifndef LL_IMFLOATER_H #define LL_IMFLOATER_H +// This variable is used to show floaters related to chiclets in a Multi Floater Container +// So, this functionality does not require to have IM Floaters as Dockable & Transient +// See EXT-2640. +#define USE_IM_CONTAINER + #include "lltransientdockablefloater.h" #include "lllogchat.h" #include "lltooldraganddrop.h" @@ -63,7 +68,6 @@ class LLIMFloater : public LLTransientDockableFloater // LLFloater overrides /*virtual*/ void onClose(bool app_quitting); /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); - // override LLFloater's minimization according to EXT-1216 // Make IM conversion visible and update the message history static LLIMFloater* show(const LLUUID& session_id); @@ -93,6 +97,9 @@ class LLIMFloater : public LLTransientDockableFloater void processAgentListUpdates(const LLSD& body); void processSessionUpdate(const LLSD& session_update); + void updateChatHistoryStyle(); + static void processChatHistoryStyleUpdate(const LLSD& newvalue); + BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6e4b3ae2140b4595f1d42ba6c1b81a2d97872190 --- /dev/null +++ b/indra/newview/llimfloatercontainer.cpp @@ -0,0 +1,96 @@ +/** + * @file llimfloatercontainer.cpp + * @brief Multifloater containing active IM sessions in separate tab container tabs + * + * $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 "llviewerprecompiledheaders.h" + +#include "llimfloatercontainer.h" + +// +// LLIMFloaterContainer +// +LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed) +: LLMultiFloater(seed), + mActiveVoiceFloater(NULL) +{ + mAutoResize = FALSE; +} + +LLIMFloaterContainer::~LLIMFloaterContainer() +{ +} + +BOOL LLIMFloaterContainer::postBuild() +{ + // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button + // mTabContainer will be initialized in LLMultiFloater::addChild() + return TRUE; +} + +void LLIMFloaterContainer::onOpen(const LLSD& key) +{ + LLMultiFloater::onOpen(key); +/* + if (key.isDefined()) + { + LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID()); + if (im_floater) + { + im_floater->openFloater(); + } + } +*/ +} + +void LLIMFloaterContainer::addFloater(LLFloater* floaterp, + BOOL select_added_floater, + LLTabContainer::eInsertionPoint insertion_point) +{ + if(!floaterp) return; + + // already here + if (floaterp->getHost() == this) + { + openFloater(floaterp->getKey()); + return; + } + + LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); + + // make sure active voice icon shows up for new tab + if (floaterp == mActiveVoiceFloater) + { + mTabContainer->setTabImage(floaterp, "active_voice_tab.tga"); + } +} + +// EOF diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h new file mode 100644 index 0000000000000000000000000000000000000000..10cde56c6eeaae34b8759001df31e14ccb3b8f6e --- /dev/null +++ b/indra/newview/llimfloatercontainer.h @@ -0,0 +1,61 @@ +/** + * @file llimfloatercontainer.h + * @brief Multifloater containing active IM sessions in separate tab container tabs + * + * $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_LLIMFLOATERCONTAINER_H +#define LL_LLIMFLOATERCONTAINER_H + +#include "llfloater.h" +#include "llmultifloater.h" + +class LLTabContainer; + +class LLIMFloaterContainer : public LLMultiFloater +{ +public: + LLIMFloaterContainer(const LLSD& seed); + virtual ~LLIMFloaterContainer(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + /*virtual*/ void addFloater(LLFloater* floaterp, + BOOL select_added_floater, + LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); + + static LLFloater* getCurrentVoiceFloater(); + +protected: + + LLFloater* mActiveVoiceFloater; +}; + +#endif // LL_LLIMFLOATERCONTAINER_H diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp index 74971f3fd85d101a345575f2563776e2be1fb654..c081af587938c392a3c556ffe932919c972a3bf7 100644 --- a/indra/newview/llimhandler.cpp +++ b/indra/newview/llimhandler.cpp @@ -58,7 +58,7 @@ LLIMHandler::~LLIMHandler() //-------------------------------------------------------------------------- void LLIMHandler::initChannel() { - S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); mChannel->init(channel_right_bound - channel_width, channel_right_bound); } diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 0b8b5935f874000a0a7f1b3afc31979c830fa917..e6ded5f371b9b9e05b8fc28d42d9e328b43c18d0 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -216,7 +216,7 @@ LLFloaterIMPanel::~LLFloaterIMPanel() BOOL LLFloaterIMPanel::postBuild() { - mVisibleSignal.connect(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2)); + setVisibleCallback(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2)); mInputEditor = getChild<LLLineEditor>("chat_editor"); mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) ); @@ -848,8 +848,11 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update) } - //update the speakers dropdown too - mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated); + //update the speakers dropdown too, if it's available + if (mSpeakerPanel) + { + mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated); + } } } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 8fb7027e82c90ea5d160c52bb64c078223f31f3e..ffa943092f41c6f5f49ddcff5be4ef72175f4b70 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -46,8 +46,10 @@ #include "llagent.h" #include "llavatariconctrl.h" +#include "llbottomtray.h" #include "llcallingcard.h" #include "llchat.h" +#include "llchiclet.h" #include "llresmgr.h" #include "llfloaterchat.h" #include "llfloaterchatterbox.h" @@ -69,10 +71,12 @@ #include "llviewermessage.h" #include "llviewerwindow.h" #include "llnotify.h" +#include "llnearbychat.h" #include "llviewerregion.h" #include "llvoicechannel.h" #include "lltrans.h" #include "llrecentpeople.h" +#include "llsyswellwindow.h" #include "llfirstuse.h" #include "llagentui.h" @@ -392,21 +396,15 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) { - S32 im_log_option = gSavedPerAccountSettings.getS32("IMLogOptions"); - if (im_log_option != LOG_CHAT) + if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) { - if(im_log_option == LOG_BOTH_TOGETHER) - { - LLLogChat::saveHistory(std::string("chat"), from, from_id, utf8_text); - return true; - } - else - { - LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text); - return true; - } + LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text); + return true; + } + else + { + return false; } - return false; } bool LLIMModel::proccessOnlineOfflineNotification( @@ -439,8 +437,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co addToHistory(session_id, from, from_id, utf8_text); if (log2file) logToFile(session_id, from, from_id, utf8_text); - //we do not count system messages - if (from_id.notNull()) session->mNumUnread++; + session->mNumUnread++; // notify listeners LLSD arg; @@ -651,22 +648,10 @@ void LLIMModel::sendMessage(const std::string& utf8_text, //local echo for the legacy communicate panel std::string history_echo; - std::string utf8_copy = utf8_text; LLAgentUI::buildFullname(history_echo); - // Look for IRC-style emotes here. + history_echo += ": " + utf8_text; - std::string prefix = utf8_copy.substr(0, 4); - if (prefix == "/me " || prefix == "/me'") - { - utf8_copy.replace(0,3,""); - } - else - { - history_echo += ": "; - } - history_echo += utf8_copy; - LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id); if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID()); @@ -862,7 +847,17 @@ bool LLIMModel::sendStartSession( return false; } - +// static +void LLIMModel::sendSessionInitialized(const LLUUID &session_id) +{ + LLIMSession* session = getInstance()->findIMSession(session_id); + if (session) + { + LLSD arg; + arg["session_id"] = session_id; + getInstance()->mSessionInitializedSignal(arg); + } +} // // Helper Functions @@ -1089,17 +1084,92 @@ LLIMMgr::onConfirmForceCloseError( } +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLOutgoingCallDialog +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) : + LLDockableFloater(NULL, false, payload), + mPayload(payload) +{ +} + +void LLOutgoingCallDialog::getAllowedRect(LLRect& rect) +{ + rect = gViewerWindow->getWorldViewRectScaled(); +} + +void LLOutgoingCallDialog::onOpen(const LLSD& key) +{ + // tell the user which voice channel they are leaving + if (!mPayload["old_channel_name"].asString().empty()) + { + childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString()); + } + else + { + childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat")); + } + + std::string callee_name = mPayload["session_name"].asString(); + if (callee_name == "anonymous") + { + callee_name = getString("anonymous"); + } + + setTitle(callee_name); + + LLSD callee_id = mPayload["other_user_id"]; + childSetTextArg("calling", "[CALLEE_NAME]", callee_name); + childSetTextArg("connecting", "[CALLEE_NAME]", callee_name); + LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); + icon->setValue(callee_id); +} + + +//static +void LLOutgoingCallDialog::onCancel(void* user_data) +{ + LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data; + + if (!gIMMgr) + return; + + LLUUID session_id = self->mPayload["session_id"].asUUID(); + gIMMgr->endCall(session_id); + + self->closeFloater(); +} + + +BOOL LLOutgoingCallDialog::postBuild() +{ + BOOL success = LLDockableFloater::postBuild(); + + childSetAction("Cancel", onCancel, this); + + // dock the dialog to the sys well, where other sys messages appear + setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), + this, getDockTongue(), LLDockControl::TOP, + boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1))); + + return success; +} + + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLIncomingCallDialog //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) : - LLModalDialog(payload), + LLDockableFloater(NULL, false, payload), mPayload(payload) { } BOOL LLIncomingCallDialog::postBuild() { + LLDockableFloater::postBuild(); + LLSD caller_id = mPayload["caller_id"]; EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger(); @@ -1118,6 +1188,11 @@ BOOL LLIncomingCallDialog::postBuild() call_type = getString("VoiceInviteAdHoc"); } + // check to see if this is an Avaline call + LLUUID session_id = mPayload["session_id"].asUUID(); + bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id); + childSetVisible("Start IM", is_avatar); // no IM for avaline + LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name"); caller_name_widget->setValue(caller_name + " " + call_type); LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); @@ -1131,6 +1206,30 @@ BOOL LLIncomingCallDialog::postBuild() return TRUE; } +void LLIncomingCallDialog::getAllowedRect(LLRect& rect) +{ + rect = gViewerWindow->getWorldViewRectScaled(); +} + +void LLIncomingCallDialog::onOpen(const LLSD& key) +{ + // 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()); + } + else + { + childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat")); + } + + // dock the dialog to the sys well, where other sys messages appear + setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), + this, getDockTongue(), LLDockControl::TOP, + boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1))); +} + //static void LLIncomingCallDialog::onAccept(void* user_data) { @@ -1157,6 +1256,9 @@ void LLIncomingCallDialog::onStartIM(void* user_data) void LLIncomingCallDialog::processCallResponse(S32 response) { + if (!gIMMgr) + return; + LLUUID session_id = mPayload["session_id"].asUUID(); EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger(); LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger(); @@ -1254,6 +1356,9 @@ void LLIncomingCallDialog::processCallResponse(S32 response) bool inviteUserResponse(const LLSD& notification, const LLSD& response) { + if (!gIMMgr) + return false; + const LLSD& payload = notification["payload"]; LLUUID session_id = payload["session_id"].asUUID(); EInstantMessage type = (EInstantMessage)payload["type"].asInteger(); @@ -1507,6 +1612,12 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess LLChat chat(message); chat.mSourceType = CHAT_SOURCE_SYSTEM; LLFloaterChat::addChatHistory(chat); + + LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); + if(nearby_chat) + { + nearby_chat->addMessage(chat); + } } else // going to IM session { @@ -2331,15 +2442,6 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode BOOL is_linden = LLMuteList::getInstance()->isLinden(name); std::string separator_string(": "); - int message_offset=0; - - //Handle IRC styled /me messages. - std::string prefix = message.substr(0, 4); - if (prefix == "/me " || prefix == "/me'") - { - separator_string = ""; - message_offset = 3; - } chat.mMuted = is_muted && !is_linden; chat.mFromID = from_id; @@ -2356,7 +2458,7 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode { saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); } - std::string buffer = saved + message.substr(message_offset); + std::string buffer = saved + message; BOOL is_this_agent = FALSE; if(from_id == gAgentID) @@ -2375,7 +2477,7 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode ll_vector3_from_sd(message_params["position"]), true); - chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); + chat.mText = std::string("IM: ") + name + separator_string + saved + message; LLFloaterChat::addChat(chat, TRUE, is_this_agent); //K now we want to accept the invitation diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index bd55bd2c30632ae9f5edb44f280698eaef7068e8..62a54bc0815fe2ea3aca2852e8584dd3f617052b 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -34,9 +34,11 @@ #define LL_LLIMVIEW_H #include "lldarray.h" +#include "lldockablefloater.h" #include "llspeakers.h" //for LLIMSpeakerMgr #include "llimpanel.h" //for voice channels #include "llmodaldialog.h" +#include "lldockablefloater.h" #include "llinstantmessage.h" #include "lluuid.h" #include "llmultifloater.h" @@ -102,6 +104,7 @@ class LLIMModel : public LLSingleton<LLIMModel> typedef boost::function<void(const LLSD&)> session_callback_t; session_signal_t mNewMsgSignal; session_signal_t mNoUnreadMsgsSignal; + session_signal_t mSessionInitializedSignal; /** * Find an IM Session corresponding to session_id @@ -116,6 +119,7 @@ class LLIMModel : public LLSingleton<LLIMModel> boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); } boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); } + boost::signals2::connection addSessionInitializedCallback(session_callback_t cb ) { return mSessionInitializedSignal.connect(cb); } /** * Create new session object in a model @@ -189,6 +193,7 @@ class LLIMModel : public LLSingleton<LLIMModel> static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, EInstantMessage dialog); static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing); + static void sendSessionInitialized(const LLUUID &session_id); static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, const LLUUID& other_participant_id, EInstantMessage dialog); @@ -398,12 +403,13 @@ class LLIMMgr : public LLSingleton<LLIMMgr> LLSD mPendingAgentListUpdates; }; -class LLIncomingCallDialog : public LLModalDialog +class LLIncomingCallDialog : public LLDockableFloater { public: LLIncomingCallDialog(const LLSD& payload); /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); static void onAccept(void* user_data); static void onReject(void* user_data); @@ -411,6 +417,23 @@ class LLIncomingCallDialog : public LLModalDialog private: void processCallResponse(S32 response); + void getAllowedRect(LLRect& rect); + + LLSD mPayload; +}; + +class LLOutgoingCallDialog : public LLDockableFloater +{ +public: + LLOutgoingCallDialog(const LLSD& payload); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + static void onCancel(void* user_data); + +private: + void getAllowedRect(LLRect& rect); LLSD mPayload; }; diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 8dc7833f6aceb4db012aacec8e4aa91bc4e96781..866669f326ec8f4b40842865a3c281f979a7ca43 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -39,6 +39,7 @@ #include "llavataractions.h" #include "llavatarpropertiesprocessor.h" #include "llcallingcard.h" +#include "lldateutil.h" #include "llfloaterreporter.h" #include "llfloaterworldmap.h" #include "llinspect.h" @@ -117,6 +118,9 @@ class LLInspectAvatar : public LLInspect bool onVisibleZoomIn(); void onClickMuteVolume(); void onVolumeChange(const LLSD& data); + + // Is used to determine if "Add friend" option should be enabled in gear menu + bool isNotFriend(); // Callback for gCacheName to look up avatar name void nameUpdatedCallback( @@ -208,6 +212,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this)); mVisibleCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", boost::bind(&LLInspectAvatar::onVisibleZoomIn, this)); + mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this)); // can't make the properties request until the widgets are constructed // as it might return immediately, so do it in postBuild. @@ -347,7 +352,7 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data) { LLStringUtil::format_map_t args; args["[BORN_ON]"] = data->born_on; - args["[AGE]"] = data->born_on; + args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now()); args["[SL_PROFILE]"] = data->about_text; args["[RW_PROFILE"] = data->fl_about_text; args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data); @@ -473,6 +478,11 @@ void LLInspectAvatar::onClickViewProfile() closeFloater(); } +bool LLInspectAvatar::isNotFriend() +{ + return !LLAvatarActions::isFriend(mAvatarID); +} + bool LLInspectAvatar::onVisibleFindOnMap() { return gAgent.isGodlike() || is_agent_mappable(mAvatarID); diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp index c78bcd6afe0b1886a30b08ebfe58f5fef97df99f..7fd7b69021c3b66db3e4e2844ee8fba9b27a6d92 100644 --- a/indra/newview/llinspectgroup.cpp +++ b/indra/newview/llinspectgroup.cpp @@ -216,7 +216,8 @@ void LLInspectGroup::requestUpdate() getChild<LLUICtrl>("group_details")->setValue(""); getChild<LLUICtrl>("group_cost")->setValue(""); // Must have a visible button so the inspector can take focus - getChild<LLUICtrl>("leave_btn")->setVisible(true); + getChild<LLUICtrl>("view_profile_btn")->setVisible(true); + getChild<LLUICtrl>("leave_btn")->setVisible(false); getChild<LLUICtrl>("join_btn")->setVisible(false); // Make a new request for properties diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e4d2eec242bf8bd846498aee5379b449b66a7335 --- /dev/null +++ b/indra/newview/llinspectremoteobject.cpp @@ -0,0 +1,200 @@ +/** + * @file llinspectremoteobject.cpp + * + * $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 "llviewerprecompiledheaders.h" + +#include "llinspectremoteobject.h" +#include "llinspect.h" +#include "llslurl.h" +#include "llmutelist.h" +#include "llurlaction.h" +#include "llpanelblockedlist.h" +#include "llfloaterreg.h" +#include "llui.h" +#include "lluictrl.h" + +class LLViewerObject; + +////////////////////////////////////////////////////////////////////////////// +// LLInspectRemoteObject +////////////////////////////////////////////////////////////////////////////// + +// Remote Object Inspector, a small information window used to +// display information about potentially-remote objects. Used +// to display details about objects sending messages to the user. +class LLInspectRemoteObject : public LLInspect +{ + friend class LLFloaterReg; + +public: + LLInspectRemoteObject(const LLSD& object_id); + virtual ~LLInspectRemoteObject() {}; + + /*virtual*/ BOOL postBuild(void); + /*virtual*/ void onOpen(const LLSD& avatar_id); + + void onClickMap(); + void onClickBlock(); + void onClickClose(); + +private: + void update(); + static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data); + +private: + LLUUID mObjectID; + LLUUID mOwnerID; + std::string mOwner; + std::string mSLurl; + std::string mName; + bool mGroupOwned; +}; + +LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) : + LLInspect(LLSD()), + mObjectID(NULL), + mOwnerID(NULL), + mOwner(""), + mSLurl(""), + mName(""), + mGroupOwned(false) +{ +} + +/*virtual*/ +BOOL LLInspectRemoteObject::postBuild(void) +{ + // hook up the inspector's buttons + getChild<LLUICtrl>("map_btn")->setCommitCallback( + boost::bind(&LLInspectRemoteObject::onClickMap, this)); + getChild<LLUICtrl>("block_btn")->setCommitCallback( + boost::bind(&LLInspectRemoteObject::onClickBlock, this)); + getChild<LLUICtrl>("close_btn")->setCommitCallback( + boost::bind(&LLInspectRemoteObject::onClickClose, this)); + + return TRUE; +} + +/*virtual*/ +void LLInspectRemoteObject::onOpen(const LLSD& data) +{ + // Start animation + LLInspect::onOpen(data); + + // Extract appropriate object information from input LLSD + // (Eventually, it might be nice to query server for details + // rather than require caller to pass in the information.) + mObjectID = data["object_id"].asUUID(); + mName = data["name"].asString(); + mOwnerID = data["owner_id"].asUUID(); + mGroupOwned = data["group_owned"].asBoolean(); + mSLurl = data["slurl"].asString(); + + // work out the owner's name + mOwner = ""; + if (gCacheName) + { + gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this); + } + + // update the inspector with the current object state + update(); + + // Position the inspector relative to the mouse cursor + LLUI::positionViewNearMouse(this); +} + +void LLInspectRemoteObject::onClickMap() +{ + std::string url = "secondlife://" + mSLurl; + LLUrlAction::showLocationOnMap(url); + closeFloater(); +} + +void LLInspectRemoteObject::onClickBlock() +{ + LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT; + LLMute mute(mOwnerID, mOwner, mute_type); + LLMuteList::getInstance()->add(mute); + LLPanelBlockedList::showPanelAndSelect(mute.mID); + closeFloater(); +} + +void LLInspectRemoteObject::onClickClose() +{ + closeFloater(); +} + +//static +void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data) +{ + LLInspectRemoteObject *self = (LLInspectRemoteObject*)data; + self->mOwner = first; + if (!last.empty()) + { + self->mOwner += " " + last; + } + self->update(); +} + +void LLInspectRemoteObject::update() +{ + // show the object name as the inspector's title + getChild<LLUICtrl>("object_name")->setValue(mName); + + // show the object's owner - click it to show profile + std::string owner = mOwner; + if (! mOwnerID.isNull()) + { + if (mGroupOwned) + { + owner = LLSLURL::buildCommand("group", mOwnerID, "about"); + } + else + { + owner = LLSLURL::buildCommand("agent", mOwnerID, "about"); + } + } + getChild<LLUICtrl>("object_owner")->setValue(owner); + + // display the object's SLurl - click it to teleport + std::string url = "secondlife:///app/teleport/" + mSLurl; + getChild<LLUICtrl>("object_slurl")->setValue(url); +} + +////////////////////////////////////////////////////////////////////////////// +// LLInspectRemoteObjectUtil +////////////////////////////////////////////////////////////////////////////// +void LLInspectRemoteObjectUtil::registerFloater() +{ + LLFloaterReg::add("inspect_remote_object", "inspect_remote_object.xml", + &LLFloaterReg::build<LLInspectRemoteObject>); +} diff --git a/indra/newview/llinspectremoteobject.h b/indra/newview/llinspectremoteobject.h new file mode 100644 index 0000000000000000000000000000000000000000..e756f1caf4effb63b725c186417ad22e074345fe --- /dev/null +++ b/indra/newview/llinspectremoteobject.h @@ -0,0 +1,40 @@ +/** + * @file llinspectremoteobject.h + * + * $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 LLINSPECTREMOTEOBJECT_H +#define LLINSPECTREMOTEOBJECT_H + +namespace LLInspectRemoteObjectUtil +{ + void registerFloater(); +} + +#endif diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 1bc9297bba3a2e935614ad04a32df9785311d781..a6a5ecb8e7661719093065a2c060cfc87e2921a1 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1,5209 +1,5146 @@ -/** - * @file llinventorybridge.cpp - * @brief Implementation of the Inventory-Folder-View-Bridge classes. - * - * $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 <utility> // for std::pair<> - -#include "llfloaterinventory.h" -#include "llinventorybridge.h" - -#include "message.h" - -#include "llagent.h" -#include "llagentwearables.h" -#include "llcallingcard.h" -#include "llcheckboxctrl.h" // for radio buttons -#include "llfloaterreg.h" -#include "llradiogroup.h" -#include "llspinctrl.h" -#include "lltextbox.h" -#include "llui.h" - -#include "llviewercontrol.h" -#include "llfirstuse.h" -#include "llfoldertype.h" -#include "llfloaterchat.h" -#include "llfloatercustomize.h" -#include "llfloaterproperties.h" -#include "llfloaterworldmap.h" -#include "llfocusmgr.h" -#include "llfolderview.h" -#include "llfriendcard.h" -#include "llavataractions.h" -#include "llgesturemgr.h" -#include "lliconctrl.h" -#include "llinventoryfunctions.h" -#include "llinventorymodel.h" -#include "llinventorypanel.h" -#include "llinventoryclipboard.h" -#include "lllineeditor.h" -#include "llmenugl.h" -#include "llpreviewanim.h" -#include "llpreviewgesture.h" -#include "llpreviewnotecard.h" -#include "llpreviewscript.h" -#include "llpreviewsound.h" -#include "llpreviewtexture.h" -#include "llresmgr.h" -#include "llscrollcontainer.h" -#include "llimview.h" -#include "lltooldraganddrop.h" -#include "llviewerfoldertype.h" -#include "llviewertexturelist.h" -#include "llviewerinventory.h" -#include "llviewerobjectlist.h" -#include "llviewerwindow.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "llwearablelist.h" -#include "llviewerassettype.h" -#include "llviewermessage.h" -#include "llviewerregion.h" -#include "llvoavatarself.h" -#include "lltabcontainer.h" -#include "lluictrlfactory.h" -#include "llselectmgr.h" -#include "llsidetray.h" -#include "llfloateropenobject.h" -#include "lltrans.h" -#include "llappearancemgr.h" -#include "llimfloater.h" - -using namespace LLOldEvents; - -// Helpers -// bug in busy count inc/dec right now, logic is complex... do we really need it? -void inc_busy_count() -{ -// gViewerWindow->getWindow()->incBusyCount(); -// check balance of these calls if this code is changed to ever actually -// *do* something! -} -void dec_busy_count() -{ -// gViewerWindow->getWindow()->decBusyCount(); -// check balance of these calls if this code is changed to ever actually -// *do* something! -} - -// 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_item_linkitem.tga", - "inv_item_linkfolder.tga" -}; - - -// +=================================================+ -// | LLInventoryPanelObserver | -// +=================================================+ -void LLInventoryPanelObserver::changed(U32 mask) -{ - mIP->modelChanged(mask); -} - - -// +=================================================+ -// | LLInvFVBridge | -// +=================================================+ - -LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : -mUUID(uuid), mInvType(LLInventoryType::IT_NONE) -{ - mInventoryPanel = inventory->getHandle(); -} - -const std::string& LLInvFVBridge::getName() const -{ - LLInventoryObject* obj = getInventoryObject(); - if(obj) - { - return obj->getName(); - } - return LLStringUtil::null; -} - -const std::string& LLInvFVBridge::getDisplayName() const -{ - return getName(); -} - -// Folders have full perms -PermissionMask LLInvFVBridge::getPermissionMask() const -{ - - return PERM_ALL; -} - -// virtual -LLFolderType::EType LLInvFVBridge::getPreferredType() const -{ - return LLFolderType::FT_NONE; -} - - -// Folders don't have creation dates. -time_t LLInvFVBridge::getCreationDate() const -{ - return 0; -} - -// Can be destoryed (or moved to trash) -BOOL LLInvFVBridge::isItemRemovable() -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) - { - return TRUE; - } - return FALSE; -} - -// Sends an update to all link items that point to the base item. -void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string& new_name) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - if (itemp->getIsLinkType()) - { - return; - } - - LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id); - for (LLInventoryModel::item_array_t::iterator iter = item_array.begin(); - iter != item_array.end(); - iter++) - { - LLViewerInventoryItem *linked_item = (*iter); - if (linked_item->getUUID() == item_id) continue; - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(linked_item); - new_item->rename(new_name); - new_item->updateServer(FALSE); - model->updateItem(new_item); - // model->addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); - } - model->notifyObservers(); -} - -// Can be moved to another folder -BOOL LLInvFVBridge::isItemMovable() const -{ - return TRUE; -} - -/*virtual*/ -/** - * @brief Adds this item into clipboard storage - */ -void LLInvFVBridge::cutToClipboard() -{ - if(isItemMovable()) - { - LLInventoryClipboard::instance().cut(mUUID); - } -} -// *TODO: make sure this does the right thing -void LLInvFVBridge::showProperties() -{ - 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); - */ -} - -void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) -{ - // Deactivate gestures when moving them into Trash - LLInvFVBridge* bridge; - LLInventoryModel* model = getInventoryModel(); - LLViewerInventoryItem* item = NULL; - LLViewerInventoryCategory* cat = NULL; - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - S32 count = batch.count(); - S32 i,j; - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); - if (item) - { - if(LLAssetType::AT_GESTURE == item->getType()) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - } - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); - if (cat) - { - gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE ); - for (j=0; j<descendent_items.count(); j++) - { - if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) - { - LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); - } - } - } - } - removeBatchNoCheck(batch); -} - -void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch) -{ - // this method moves a bunch of items and folders to the trash. As - // per design guidelines for the inventory model, the message is - // built and the accounting is performed first. After all of that, - // we call LLInventoryModel::moveObject() to move everything - // around. - LLInvFVBridge* bridge; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLMessageSystem* msg = gMessageSystem; - const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); - LLViewerInventoryItem* item = NULL; - LLViewerInventoryCategory* cat = NULL; - std::vector<LLUUID> move_ids; - LLInventoryModel::update_map_t update; - bool start_new_message = true; - S32 count = batch.count(); - S32 i; - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); - if(item) - { - 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) - { - start_new_message = false; - msg->newMessageFast(_PREHASH_MoveInventoryItem); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addBOOLFast(_PREHASH_Stamp, TRUE); - } - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addUUIDFast(_PREHASH_ItemID, item->getUUID()); - msg->addUUIDFast(_PREHASH_FolderID, trash_id); - msg->addString("NewName", NULL); - if(msg->isSendFullFast(_PREHASH_InventoryData)) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - } - } - if(!start_new_message) - { - start_new_message = true; - gAgent.sendReliableMessage(); - 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()); - if(cat) - { - if(cat->getParentUUID() == trash_id) continue; - move_ids.push_back(cat->getUUID()); - --update[cat->getParentUUID()]; - ++update[trash_id]; - if(start_new_message) - { - start_new_message = false; - msg->newMessageFast(_PREHASH_MoveInventoryFolder); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addBOOL("Stamp", TRUE); - } - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID()); - msg->addUUIDFast(_PREHASH_ParentID, trash_id); - if(msg->isSendFullFast(_PREHASH_InventoryData)) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - } - } - if(!start_new_message) - { - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - } - - // move everything. - std::vector<LLUUID>::iterator it = move_ids.begin(); - std::vector<LLUUID>::iterator end = move_ids.end(); - for(; it != end; ++it) - { - gInventory.moveObject((*it), trash_id); - } - - // notify inventory observers. - model->notifyObservers(); -} - -BOOL LLInvFVBridge::isClipboardPasteable() const -{ - if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) - { - return FALSE; - } - LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - const LLUUID &agent_id = gAgent.getID(); - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLUUID &item_id = objects.get(i); - - // Can't paste folders - const LLInventoryCategory *cat = model->getCategory(item_id); - if (cat) - { - return FALSE; - } - - const LLInventoryItem *item = model->getItem(item_id); - if (item) - { - if (!item->getPermissions().allowCopyBy(agent_id)) - { - return FALSE; - } - } - } - return TRUE; -} - -BOOL LLInvFVBridge::isClipboardPasteableAsLink() const -{ - if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) - { - return FALSE; - } - const LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLInventoryItem *item = model->getItem(objects.get(i)); - if (item) - { - if (!LLAssetType::lookupCanLink(item->getActualType())) - { - return FALSE; - } - } - const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); - if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())) - { - return FALSE; - } - } - return TRUE; -} - -void hide_context_entries(LLMenuGL& menu, - const std::vector<std::string> &entries_to_show, - const std::vector<std::string> &disabled_entries) -{ - const LLView::child_list_t *list = menu.getChildList(); - - LLView::child_list_t::const_iterator itor; - for (itor = list->begin(); itor != list->end(); ++itor) - { - std::string name = (*itor)->getName(); - - // descend into split menus: - LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor); - if ((name == "More") && branchp) - { - hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries); - } - - - bool found = false; - std::vector<std::string>::const_iterator itor2; - for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) - { - if (*itor2 == name) - { - found = true; - } - } - if (!found) - { - (*itor)->setVisible(FALSE); - } - else - { - for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2) - { - if (*itor2 == name) - { - (*itor)->setEnabled(FALSE); - } - } - } - } -} - -// Helper for commonly-used entries -void LLInvFVBridge::getClipboardEntries(bool show_asset_id, - std::vector<std::string> &items, - std::vector<std::string> &disabled_items, U32 flags) -{ - items.push_back(std::string("Rename")); - if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Rename")); - } - - if (show_asset_id) - { - items.push_back(std::string("Copy Asset UUID")); - if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) - || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Copy Asset UUID")); - } - } - - items.push_back(std::string("Copy Separator")); - - items.push_back(std::string("Copy")); - if (!isItemCopyable()) - { - disabled_items.push_back(std::string("Copy")); - } - - items.push_back(std::string("Paste")); - if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Paste")); - } - - items.push_back(std::string("Paste As Link")); - if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Paste As Link")); - } - items.push_back(std::string("Paste Separator")); - - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - - // If multiple items are selected, disable properties (if it exists). - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Properties")); - } -} - -void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("PurgeItem")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("PurgeItem")); - } - items.push_back(std::string("RestoreItem")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - hide_context_entries(menu, items, disabled_items); -} - -// *TODO: remove this -BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const -{ - BOOL rv = FALSE; - - const LLInventoryObject* obj = getInventoryObject(); - - if(obj) - { - *type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType()); - if(*type == DAD_NONE) - { - return FALSE; - } - - *id = obj->getUUID(); - //object_ids.put(obj->getUUID()); - - if (*type == DAD_CATEGORY) - { - gInventory.startBackgroundFetch(obj->getUUID()); - } - - rv = TRUE; - } - - return rv; -} - -LLInventoryObject* LLInvFVBridge::getInventoryObject() const -{ - LLInventoryObject* obj = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - obj = (LLInventoryObject*)model->getObject(mUUID); - } - return obj; -} - -LLInventoryModel* LLInvFVBridge::getInventoryModel() const -{ - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - return panel ? panel->getModel() : NULL; -} - -BOOL LLInvFVBridge::isInTrash() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); - return model->isObjectDescendentOf(mUUID, trash_id); -} - -BOOL LLInvFVBridge::isLinkedObjectInTrash() const -{ - if (isInTrash()) return TRUE; - - const LLInventoryObject *obj = getInventoryObject(); - if (obj && obj->getIsLinkType()) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); - return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); - } - return FALSE; -} - -BOOL LLInvFVBridge::isAgentInventory() const -{ - const LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - if(gInventory.getRootFolderID() == mUUID) return TRUE; - return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); -} - -BOOL LLInvFVBridge::isCOFFolder() const -{ - const LLInventoryModel* model = getInventoryModel(); - if(!model) return TRUE; - const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); - if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) - { - return TRUE; - } - return FALSE; -} - -BOOL LLInvFVBridge::isItemPermissive() const -{ - return FALSE; -} - -// static -void LLInvFVBridge::changeItemParent(LLInventoryModel* model, - LLViewerInventoryItem* item, - const LLUUID& new_parent, - BOOL restamp) -{ - if(item->getParentUUID() != new_parent) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setParent(new_parent); - new_item->updateParentOnServer(restamp); - model->updateItem(new_item); - model->notifyObservers(); - } -} - -// static -void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, - LLViewerInventoryCategory* cat, - const LLUUID& new_parent, - BOOL restamp) -{ - if(cat->getParentUUID() != new_parent) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->setParent(new_parent); - 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; -} - -LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, - LLAssetType::EType actual_asset_type, - LLInventoryType::EType inv_type, - LLInventoryPanel* inventory, - const LLUUID& uuid, - U32 flags) -{ - LLInvFVBridge* new_listener = NULL; - switch(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; - } - new_listener = new LLTextureBridge(inventory, 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; - } - new_listener = new LLSoundBridge(inventory, 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; - } - new_listener = new LLLandmarkBridge(inventory, 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; - } - new_listener = new LLCallingCardBridge(inventory, 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; - } - new_listener = new LLScriptBridge(inventory, 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; - } - new_listener = new LLObjectBridge(inventory, 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; - } - new_listener = new LLNotecardBridge(inventory, 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; - } - new_listener = new LLAnimationBridge(inventory, 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; - } - new_listener = new LLGestureBridge(inventory, 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; - } - new_listener = new LLLSLTextBridge(inventory, 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; - } - new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags); - break; - case LLAssetType::AT_CATEGORY: - case LLAssetType::AT_ROOT_CATEGORY: - if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) - { - // Create a link folder handler instead. - new_listener = new LLLinkFolderBridge(inventory, uuid); - break; - } - new_listener = new LLFolderBridge(inventory, uuid); - break; - case LLAssetType::AT_LINK: - // Only should happen for broken links. - new_listener = new LLLinkItemBridge(inventory, uuid); - break; - case LLAssetType::AT_LINK_FOLDER: - // Only should happen for broken links. - new_listener = new LLLinkItemBridge(inventory, uuid); - break; - default: - llinfos << "Unhandled asset type (llassetstorage.h): " - << (S32)asset_type << llendl; - break; - } - - if (new_listener) - { - new_listener->mInvType = inv_type; - } - - return new_listener; -} - -void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) -{ - LLInventoryCategory* cat = model->getCategory(uuid); - if (cat) - { - model->purgeDescendentsOf(uuid); - model->notifyObservers(); - } - LLInventoryObject* obj = model->getObject(uuid); - if (obj) - { - model->purgeObject(uuid); - model->notifyObservers(); - } -} - -// +=================================================+ -// | InventoryFVBridgeBuilder | -// +=================================================+ -LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, - LLAssetType::EType actual_asset_type, - LLInventoryType::EType inv_type, - LLInventoryPanel* inventory, - const LLUUID& uuid, - U32 flags /* = 0x00 */) const -{ - return LLInvFVBridge::createBridge(asset_type, - actual_asset_type, - inv_type, - inventory, - uuid, - flags); -} - -// +=================================================+ -// | LLItemBridge | -// +=================================================+ - -void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("goto" == action) - { - gotoItem(folder); - } - if ("open" == action) - { - openItem(); - return; - } - else if ("properties" == action) - { - showProperties(); - return; - } - else if ("purge" == action) - { - purgeItem(model, mUUID); - return; - } - else if ("restoreToWorld" == action) - { - restoreToWorld(); - return; - } - else if ("restore" == action) - { - restoreItem(); - return; - } - else if ("copy_uuid" == action) - { - // Single item only - LLInventoryItem* item = model->getItem(mUUID); - if(!item) return; - LLUUID asset_id = item->getAssetUUID(); - std::string buffer; - asset_id.toString(buffer); - - gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); - return; - } - else if ("copy" == action) - { - copyToClipboard(); - return; - } - else if ("paste" == action) - { - // Single item only - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); - if (!folder_view_itemp) return; - - folder_view_itemp->getListener()->pasteFromClipboard(); - return; - } - else if ("paste_link" == action) - { - // Single item only - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); - if (!folder_view_itemp) return; - - folder_view_itemp->getListener()->pasteLinkFromClipboard(); - return; - } -} - -void LLItemBridge::selectItem() -{ - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - if(item && !item->isComplete()) - { - item->fetchFromServer(); - } -} - -void LLItemBridge::restoreItem() -{ - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - if(item) - { - LLInventoryModel* model = getInventoryModel(); - const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType())); - // do not restamp on restore. - LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); - } -} - -void LLItemBridge::restoreToWorld() -{ - LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); - if (itemp) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("RezRestoreToWorld"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - - 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; - } - - if(remove_from_inventory) - { - gInventory.deleteObject(itemp->getUUID()); - gInventory.notifyObservers(); - } -} - -void LLItemBridge::gotoItem(LLFolderView *folder) -{ - LLInventoryObject *obj = getInventoryObject(); - if (obj && obj->getIsLinkType()) - { - LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); - if (active_panel) - { - active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); - } - } -} - -LLUIImagePtr LLItemBridge::getIcon() const -{ - return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); -} - -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; - - } - return perm_mask; -} - -const std::string& LLItemBridge::getDisplayName() const -{ - if(mDisplayName.empty()) - { - buildDisplayName(getItem(), mDisplayName); - } - return mDisplayName; -} - -void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) -{ - if(item) - { - name.assign(item->getName()); - } - else - { - name.assign(LLStringUtil::null); - } -} - -LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const -{ - U8 font = LLFontGL::NORMAL; - - if( gAgentWearables.isWearingItem( mUUID ) ) - { - // llinfos << "BOLD" << llendl; - font |= LLFontGL::BOLD; - } - - const LLViewerInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - font |= LLFontGL::ITALIC; - } - return (LLFontGL::StyleFlags)font; -} - -std::string LLItemBridge::getLabelSuffix() const -{ - // String table is loaded before login screen and inventory items are - // loaded after login, so LLTrans should be ready. - static std::string NO_COPY =LLTrans::getString("no_copy"); - static std::string NO_MOD = LLTrans::getString("no_modify"); - static std::string NO_XFER = LLTrans::getString("no_transfer"); - static std::string LINK = LLTrans::getString("link"); - static std::string BROKEN_LINK = LLTrans::getString("broken_link"); - std::string suffix; - LLInventoryItem* item = getItem(); - if(item) - { - // it's a bit confusing to put nocopy/nomod/etc on calling cards. - if(LLAssetType::AT_CALLINGCARD != item->getType() - && item->getPermissions().getOwner() == gAgent.getID()) - { - BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); - if (broken_link) return BROKEN_LINK; - - BOOL link = item->getIsLinkType(); - if (link) return LINK; - - BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); - if (!copy) - { - suffix += NO_COPY; - } - BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); - if (!mod) - { - suffix += NO_MOD; - } - BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID()); - if (!xfer) - { - suffix += NO_XFER; - } - } - } - return suffix; -} - -time_t LLItemBridge::getCreationDate() const -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - return item->getCreationDate(); - } - return 0; -} - - -BOOL LLItemBridge::isItemRenameable() const -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - // (For now) Don't allow calling card rename since that may confuse users as to - // what the calling card points to. - if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD) - { - return FALSE; - } - return (item->getPermissions().allowModifyBy(gAgent.getID())); - } - return FALSE; -} - -BOOL LLItemBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLPreview::dirty(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryItem* item = getItem(); - if(item && (item->getName() != new_name)) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(new_name); - buildDisplayName(new_item, mDisplayName); - new_item->updateServer(FALSE); - model->updateItem(new_item); - - model->notifyObservers(); - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - - -BOOL LLItemBridge::removeItem() -{ - if(!isItemRemovable()) - { - 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); - LLViewerInventoryItem* item = getItem(); - - // if item is not already in trash - if(item && !model->isObjectDescendentOf(mUUID, trash_id)) - { - // move to trash, and restamp - LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); - // delete was successful - return TRUE; - } - else - { - // tried to delete already item in trash (should purge?) - return FALSE; - } -} - -BOOL LLItemBridge::isItemCopyable() const -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - // can't copy worn objects. DEV-15183 - LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); - if( !avatarp ) - { - return FALSE; - } - - if(avatarp->isWearingAttachment(mUUID)) - { - return FALSE; - } - - // All items can be copied, not all can be pasted. - // The only time an item can't be copied is if it's a link - // return (item->getPermissions().allowCopyBy(gAgent.getID())); - if (item->getIsLinkType()) - { - return FALSE; - } - return TRUE; - } - return FALSE; -} -BOOL LLItemBridge::copyToClipboard() const -{ - if(isItemCopyable()) - { - LLInventoryClipboard::instance().add(mUUID); - return TRUE; - } - return FALSE; -} - -LLViewerInventoryItem* LLItemBridge::getItem() const -{ - LLViewerInventoryItem* item = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - item = (LLViewerInventoryItem*)model->getItem(mUUID); - } - return item; -} - -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 FALSE; -} - -// +=================================================+ -// | LLFolderBridge | -// +=================================================+ - -LLFolderBridge* LLFolderBridge::sSelf=NULL; - -// Can be moved to another folder -BOOL LLFolderBridge::isItemMovable() const -{ - LLInventoryObject* obj = getInventoryObject(); - if(obj) - { - return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType())); - } - return FALSE; -} - -void LLFolderBridge::selectItem() -{ -} - - -// Can be destroyed (or moved to trash) -BOOL LLFolderBridge::isItemRemovable() -{ - 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())) - { - return FALSE; - } - - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); - - S32 i; - for( i = 0; i < descendent_categories.count(); i++ ) - { - LLInventoryCategory* category = descendent_categories[i]; - if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) - { - return FALSE; - } - } - - for( i = 0; i < descendent_items.count(); i++ ) - { - LLInventoryItem* item = descendent_items[i]; - if( (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART) ) - { - if(gAgentWearables.isWearingItem(item->getUUID())) - { - return FALSE; - } - } - else - if( item->getType() == LLAssetType::AT_OBJECT ) - { - if(avatar->isWearingAttachment(item->getUUID())) - { - return FALSE; - } - } - } - - return TRUE; -} - -BOOL LLFolderBridge::isUpToDate() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); - if( !category ) - { - return FALSE; - } - - return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN; -} - -BOOL LLFolderBridge::isItemCopyable() const -{ - return TRUE; -} - -BOOL LLFolderBridge::copyToClipboard() const -{ - if(isItemCopyable()) - { - LLInventoryClipboard::instance().add(mUUID); - return TRUE; - } - return FALSE; -} - -BOOL LLFolderBridge::isClipboardPasteable() const -{ - if ( ! LLInvFVBridge::isClipboardPasteable() ) - return FALSE; - - // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 - if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) ) - { - LLInventoryModel* model = getInventoryModel(); - if ( !model ) - { - return FALSE; - } - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - const LLViewerInventoryCategory *current_cat = getCategory(); - - // Search for the direct descendent of current Friends subfolder among all pasted items, - // and return false if is found. - for(S32 i = objects.count() - 1; i >= 0; --i) - { - const LLUUID &obj_id = objects.get(i); - if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) - { - return FALSE; - } - } - - } - return TRUE; -} - -BOOL LLFolderBridge::isClipboardPasteableAsLink() const -{ - // Check normal paste-as-link permissions - if (!LLInvFVBridge::isClipboardPasteableAsLink()) - { - return FALSE; - } - - const LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - const LLViewerInventoryCategory *current_cat = getCategory(); - if (current_cat) - { - const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat ); - const LLUUID ¤t_cat_id = current_cat->getUUID(); - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLUUID &obj_id = objects.get(i); - const LLInventoryCategory *cat = model->getCategory(obj_id); - if (cat) - { - const LLUUID &cat_id = cat->getUUID(); - // Don't allow recursive pasting - if ((cat_id == current_cat_id) || - model->isObjectDescendentOf(current_cat_id, cat_id)) - { - return FALSE; - } - } - // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 - if ( is_in_friend_folder ) - { - // If object is direct descendent of current Friends subfolder than return false. - // Note: We can't use 'const LLInventoryCategory *cat', because it may be null - // in case type of obj_id is LLInventoryItem. - if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) - { - return FALSE; - } - } - } - } - return TRUE; - -} - -BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, - BOOL drop) -{ - // This should never happen, but if an inventory item is incorrectly parented, - // the UI will get confused and pass in a NULL. - if(!inv_cat) return FALSE; - - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - - // cannot drag categories into library - if(!isAgentInventory()) - { - return FALSE; - } - - // check to make sure source is agent inventory, and is represented there. - LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); - BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) - && (LLToolDragAndDrop::SOURCE_AGENT == source); - - BOOL accept = FALSE; - S32 i; - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - if(is_agent_inventory) - { - const LLUUID& cat_id = inv_cat->getUUID(); - - // 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); - 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); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); - if (move_is_into_current_outfit || move_is_into_outfit) - { - // BAP - restrictions? - is_movable = true; - } - - if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)) - { - is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 - } - - if( is_movable ) - { - gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); - - for( i = 0; i < descendent_categories.count(); i++ ) - { - LLInventoryCategory* category = descendent_categories[i]; - if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) - { - // ...can't move "special folders" like Textures - is_movable = FALSE; - break; - } - } - - if( is_movable ) - { - if( move_is_into_trash ) - { - for( i = 0; i < descendent_items.count(); i++ ) - { - LLInventoryItem* item = descendent_items[i]; - if( (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART) ) - { - if( gAgentWearables.isWearingItem( item->getUUID() ) ) - { - is_movable = FALSE; // It's generally movable, but not into the trash! - break; - } - } - else - if( item->getType() == LLAssetType::AT_OBJECT ) - { - if( avatar->isWearingAttachment( item->getUUID() ) ) - { - is_movable = FALSE; // It's generally movable, but not into the trash! - break; - } - } - } - } - } - } - - - 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) - { - for (i = 0; i < descendent_items.count(); i++) - { - LLInventoryItem* item = descendent_items[i]; - if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - } - // if target is an outfit or current outfit folder we use link - if (move_is_into_current_outfit || move_is_into_outfit) - { -#if SUPPORT_ENSEMBLES - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceManager::wearEnsemble(inv_cat); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_cat->getUUID(), - mUUID, - inv_cat->getName(), - LLAssetType::AT_LINK_FOLDER, - cb); - } -#endif - } - else - { - - // Reparent the folder and restamp children if it's moving - // into trash. - LLInvFVBridge::changeCategoryParent( - model, - (LLViewerInventoryCategory*)inv_cat, - mUUID, - move_is_into_trash); - } - } - } - else if(LLToolDragAndDrop::SOURCE_WORLD == source) - { - // content category has same ID as object itself - LLUUID object_id = inv_cat->getUUID(); - LLUUID category_id = mUUID; - accept = move_inv_category_world_to_agent(object_id, category_id, drop); - } - return accept; -} - -void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) -{ - const char* dialog = NULL; - if (object->flagScripted()) - { - dialog = "MoveInventoryFromScriptedObject"; - } - else - { - dialog = "MoveInventoryFromObject"; - } - LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); -} - -// Move/copy all inventory items from the Contents folder of an in-world -// object to the agent's inventory, inside a given category. -BOOL move_inv_category_world_to_agent(const LLUUID& object_id, - const LLUUID& category_id, - BOOL drop, - void (*callback)(S32, void*), - void* user_data) -{ - // Make sure the object exists. If we allowed dragging from - // anonymous objects, it would be possible to bypass - // permissions. - // content category has same ID as object itself - LLViewerObject* object = gObjectList.findObject(object_id); - if(!object) - { - llinfos << "Object not found for drop." << llendl; - return FALSE; - } - - // 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; - object->getInventoryContents(inventory_objects); - - if (inventory_objects.empty()) - { - llinfos << "Object contents not found for drop." << llendl; - return FALSE; - } - - BOOL accept = TRUE; - BOOL is_move = FALSE; - - // 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(); - for ( ; it != end; ++it) - { - // coming from a task. Need to figure out if the person can - // move/copy this item. - LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); - if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) - && perm.allowTransferTo(gAgent.getID()))) -// || gAgent.isGodlike()) - { - accept = TRUE; - } - else if(object->permYouOwner()) - { - // If the object cannot be copied, but the object the - // inventory is owned by the agent, then the item can be - // moved from the task to agent inventory. - is_move = TRUE; - accept = TRUE; - } - else - { - accept = FALSE; - break; - } - } - - if(drop && accept) - { - it = inventory_objects.begin(); - InventoryObjectList::iterator first_it = inventory_objects.begin(); - LLMoveInv* move_inv = new LLMoveInv; - move_inv->mObjectID = object_id; - move_inv->mCategoryID = category_id; - move_inv->mCallback = callback; - move_inv->mUserData = user_data; - - for ( ; it != end; ++it) - { - two_uuids_t two(category_id, (*it)->getUUID()); - move_inv->mMoveList.push_back(two); - } - - if(is_move) - { - // Callback called from within here. - warn_move_inventory(object, move_inv); - } - else - { - LLNotification::Params params("MoveInventoryFromObject"); - params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); - LLNotifications::instance().forceResponse(params, 0); - } - } - 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 -{ -public: - LLRightClickInventoryFetchObserver() : - mCopyItems(false) - { }; - LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : - mCatID(cat_id), - mCopyItems(copy_items) - { }; - virtual void done() - { - // we've downloaded all the items, so repaint the dialog - LLFolderBridge::staticFolderOptionsMenu(); - - gInventory.removeObserver(this); - delete this; - } - - -protected: - LLUUID mCatID; - bool mCopyItems; - -}; - -//Used by LLFolderBridge as callback for directory recursion. -class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver -{ -public: - LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} - ~LLRightClickInventoryFetchDescendentsObserver() {} - virtual void done(); -protected: - bool mCopyItems; -}; - -void LLRightClickInventoryFetchDescendentsObserver::done() -{ - // Avoid passing a NULL-ref as mCompleteFolders.front() down to - // gInventory.collectDescendents() - if( mCompleteFolders.empty() ) - { - llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - return; - } - - // 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 0 // HACK/TODO: Why? - // This early causes a giant menu to get produced, and doesn't seem to be needed. - if(!count) - { - llwarns << "Nothing fetched in category " << mCompleteFolders.front() - << llendl; - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - return; - } -#endif - - LLRightClickInventoryFetchObserver* outfit; - outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); - 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); - delete 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->fetchItems(ids); - 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()) - { - // 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); - }*/ -} - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryWearObserver -// -// Observer for "copy and wear" operation to support knowing -// when the all of the contents have been added to inventory. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryCopyAndWearObserver : public LLInventoryObserver -{ -public: - LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} - virtual ~LLInventoryCopyAndWearObserver() {} - virtual void changed(U32 mask); - -protected: - LLUUID mCatID; - int mContentsCount; - BOOL mFolderAdded; -}; - - - -void LLInventoryCopyAndWearObserver::changed(U32 mask) -{ - if((mask & (LLInventoryObserver::ADD)) != 0) - { - if (!mFolderAdded) - { - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - for (;id_it != id_end; ++id_it) - { - if ((*id_it) == mCatID) - { - mFolderAdded = TRUE; - break; - } - } - } - - if (mFolderAdded) - { - LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); - - if (NULL == category) - { - llwarns << "gInventory.getCategory(" << mCatID - << ") was NULL" << llendl; - } - else - { - if (category->getDescendentCount() == - mContentsCount) - { - gInventory.removeObserver(this); - LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE); - delete this; - } - } - } - - } -} - - - -void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("open" == action) - { - openItem(); - return; - } - else if ("paste" == action) - { - pasteFromClipboard(); - return; - } - else if ("paste_link" == action) - { - pasteLinkFromClipboard(); - return; - } - else if ("properties" == action) - { - showProperties(); - return; - } - else if ("replaceoutfit" == action) - { - modifyOutfit(FALSE); - return; - } -#if SUPPORT_ENSEMBLES - else if ("wearasensemble" == action) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - LLAppearanceManager::wearEnsemble(cat,true); - return; - } -#endif - else if ("addtooutfit" == action) - { - modifyOutfit(TRUE); - return; - } - else if ("copy" == action) - { - copyToClipboard(); - return; - } - else if ("removefromoutfit" == action) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - - remove_inventory_category_from_avatar ( cat ); - return; - } - else if ("purge" == action) - { - purgeItem(model, mUUID); - return; - } - else if ("restore" == action) - { - restoreItem(); - return; - } -} - -void LLFolderBridge::openItem() -{ - lldebugs << "LLFolderBridge::openItem()" << llendl; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - if(mUUID.isNull()) return; - bool fetching_inventory = model->fetchDescendentsOf(mUUID); - // Only change folder type if we have the folder contents. - if (!fetching_inventory) - { - // Disabling this for now, it's causing crash when new items are added to folders - // since folder type may change before new item item has finished processing. - // determineFolderType(); - } -} - -void LLFolderBridge::closeItem() -{ - determineFolderType(); -} - -void LLFolderBridge::determineFolderType() -{ - if (isUpToDate()) - { - LLInventoryModel* model = getInventoryModel(); - LLViewerInventoryCategory* category = model->getCategory(mUUID); - category->determineFolderType(); - } -} - -BOOL LLFolderBridge::isItemRenameable() const -{ - LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); - if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) - && (cat->getOwnerID() == gAgent.getID())) - { - return TRUE; - } - return FALSE; -} - -void LLFolderBridge::restoreItem() -{ - LLViewerInventoryCategory* cat; - cat = (LLViewerInventoryCategory*)getCategory(); - if(cat) - { - LLInventoryModel* model = getInventoryModel(); - const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType())); - // do not restamp children on restore - LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); - } -} - -LLFolderType::EType LLFolderBridge::getPreferredType() const -{ - LLFolderType::EType preferred_type = LLFolderType::FT_NONE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - preferred_type = cat->getPreferredType(); - } - - return preferred_type; -} - -// Icons for folders are based on the preferred type -LLUIImagePtr LLFolderBridge::getIcon() const -{ - LLFolderType::EType preferred_type = LLFolderType::FT_NONE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - preferred_type = cat->getPreferredType(); - } - return getIcon(preferred_type); -} - -LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type) -{ - // we only have one folder image now - return LLUI::getUIImage("Inv_FolderClosed"); -} - -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); - - model->notifyObservers(); - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - -BOOL LLFolderBridge::removeItem() -{ - if(!isItemRemovable()) - { - return FALSE; - } - // 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 ); - - S32 i; - for (i = 0; i < descendent_items.count(); i++) - { - LLInventoryItem* item = descendent_items[i]; - if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - - // 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); - } - - return TRUE; -} - -void LLFolderBridge::pasteFromClipboard() -{ - LLInventoryModel* model = getInventoryModel(); - if(model && isClipboardPasteable()) - { - LLInventoryItem* item = NULL; - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - const LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) - { - item = model->getItem(objects.get(i)); - if (item) - { - if(LLInventoryClipboard::instance().isCutMode()) - { - // move_inventory_item() is not enough, - //we have to update inventory locally too - changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); - } - else - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - parent_id, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - } - } - } -} - -void LLFolderBridge::pasteLinkFromClipboard() -{ - const LLInventoryModel* model = getInventoryModel(); - if(model) - { - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) - { - const LLUUID &object_id = objects.get(i); -#if SUPPORT_ENSEMBLES - if (LLInventoryCategory *cat = model->getCategory(object_id)) - { - link_inventory_item( - gAgent.getID(), - cat->getUUID(), - parent_id, - cat->getName(), - LLAssetType::AT_LINK_FOLDER, - LLPointer<LLInventoryCallback>(NULL)); - } - else -#endif - if (LLInventoryItem *item = model->getItem(object_id)) - { - link_inventory_item( - gAgent.getID(), - item->getUUID(), - parent_id, - item->getName(), - LLAssetType::AT_LINK, - LLPointer<LLInventoryCallback>(NULL)); - } - } - } -} - -void LLFolderBridge::staticFolderOptionsMenu() -{ - if (!sSelf) return; - sSelf->folderOptionsMenu(); -} - -void LLFolderBridge::folderOptionsMenu() -{ - std::vector<std::string> disabled_items; - - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - - const LLInventoryCategory* category = model->getCategory(mUUID); - LLFolderType::EType type = category->getPreferredType(); - const bool is_default_folder = category && 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)); - - // calling card related functionality for folders. - - // Only enable calling-card related options for non-default folders. - if (!is_default_folder) - { - LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); - if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) - { - mItems.push_back(std::string("Calling Card Separator")); - mItems.push_back(std::string("Conference Chat Folder")); - mItems.push_back(std::string("IM All Contacts In Folder")); - } - } - - // wearables related functionality for folders. - //is_wearable - LLFindWearables is_wearable; - LLIsType is_object( LLAssetType::AT_OBJECT ); - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - - if (mWearables || - checkFolderForContentsOfType(model, is_wearable) || - checkFolderForContentsOfType(model, is_object) || - checkFolderForContentsOfType(model, is_gesture) ) - { - mItems.push_back(std::string("Folder Wearables Separator")); - - // Only enable add/replace outfit for non-default folders. - if (!is_default_folder) - { - mItems.push_back(std::string("Add To Outfit")); - mItems.push_back(std::string("Replace Outfit")); - } - if (is_ensemble) - { - mItems.push_back(std::string("Wear As Ensemble")); - } - mItems.push_back(std::string("Take Off Items")); - } - hide_context_entries(*mMenu, mItems, disabled_items); -} - -BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type) -{ - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - model->collectDescendentsIf(mUUID, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_type); - return ((item_array.count() > 0) ? TRUE : FALSE ); -} - -// Flags unused -void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - mItems.clear(); - mDisabledItems.clear(); - - lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; -// std::vector<std::string> disabled_items; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); - const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); - - mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) - mDisabledItems.clear(); //adding code to clear out disabled members from previous - if (lost_and_found_id == mUUID) - { - // This is the lost+found folder. - mItems.push_back(std::string("Empty Lost And Found")); - } - - if(trash_id == mUUID) - { - // This is the trash. - mItems.push_back(std::string("Empty Trash")); - } - else if(model->isObjectDescendentOf(mUUID, trash_id)) - { - // This is a folder in the trash. - mItems.clear(); // clear any items that used to exist - mItems.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - mDisabledItems.push_back(std::string("Purge Item")); - } - - mItems.push_back(std::string("Restore Item")); - } - else if(isAgentInventory()) // do not allow creating in library - { - 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 /*&& - LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) - { - // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. - if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) - mItems.push_back(std::string("New Folder")); - mItems.push_back(std::string("New Script")); - mItems.push_back(std::string("New Note")); - mItems.push_back(std::string("New Gesture")); - mItems.push_back(std::string("New Clothes")); - mItems.push_back(std::string("New Body Parts")); - mItems.push_back(std::string("Change Type")); - - LLViewerInventoryCategory *cat = getCategory(); - if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) - { - mDisabledItems.push_back(std::string("Change Type")); - } - - getClipboardEntries(false, mItems, mDisabledItems, flags); - } - else - { - // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT) - { - mItems.push_back(std::string("Rename")); - mItems.push_back(std::string("Delete")); - } - } - - //Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 - mCallingCards = mWearables = FALSE; - - LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); - if (checkFolderForContentsOfType(model, is_callingcard)) - { - mCallingCards=TRUE; - } - - LLFindWearables is_wearable; - LLIsType is_object( LLAssetType::AT_OBJECT ); - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - - if (checkFolderForContentsOfType(model, is_wearable) || - checkFolderForContentsOfType(model, is_object) || - checkFolderForContentsOfType(model, is_gesture) ) - { - mWearables=TRUE; - } - - mMenu = &menu; - sSelf = this; - LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); - - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); - if (category) - { - folders.push_back(category->getUUID()); - } - fetch->fetchDescendents(folders); - inc_busy_count(); - if(fetch->isEverythingComplete()) - { - // everything is already here - call done. - fetch->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(fetch); - } - } - else - { - mItems.push_back(std::string("--no options--")); - mDisabledItems.push_back(std::string("--no options--")); - } - hide_context_entries(menu, mItems, mDisabledItems); -} - -BOOL LLFolderBridge::hasChildren() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLInventoryModel::EHasChildren has_children; - has_children = gInventory.categoryHasChildren(mUUID); - return has_children != LLInventoryModel::CHILDREN_NO; -} - -BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - //llinfos << "LLFolderBridge::dragOrDrop()" << llendl; - BOOL accept = FALSE; - switch(cargo_type) - { - case DAD_TEXTURE: - case DAD_SOUND: - case DAD_CALLINGCARD: - case DAD_LANDMARK: - case DAD_SCRIPT: - case DAD_OBJECT: - case DAD_NOTECARD: - case DAD_CLOTHING: - case DAD_BODYPART: - case DAD_ANIMATION: - case DAD_GESTURE: - case DAD_LINK: - accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, - drop); - break; - case DAD_CATEGORY: - if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) - { - accept = FALSE; - } - else - { - accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); - } - break; - default: - break; - } - return accept; -} - -LLViewerInventoryCategory* LLFolderBridge::getCategory() const -{ - LLViewerInventoryCategory* cat = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - cat = (LLViewerInventoryCategory*)model->getCategory(mUUID); - } - return cat; -} - - -// static -void LLFolderBridge::pasteClipboard(void* user_data) -{ - LLFolderBridge* self = (LLFolderBridge*)user_data; - if(self) self->pasteFromClipboard(); -} - -void LLFolderBridge::createNewCategory(void* user_data) -{ - LLFolderBridge* bridge = (LLFolderBridge*)user_data; - if(!bridge) return; - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); - if (!panel) return; - LLInventoryModel* model = panel->getModel(); - if(!model) return; - LLUUID id; - id = model->createNewCategory(bridge->getUUID(), - LLFolderType::FT_NONE, - LLStringUtil::null); - model->notifyObservers(); - - // At this point, the bridge has probably been deleted, but the - // view is still there. - panel->setSelection(id, TAKE_FOCUS_YES); -} - -void LLFolderBridge::createNewShirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); -} - -void LLFolderBridge::createNewPants(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); -} - -void LLFolderBridge::createNewShoes(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); -} - -void LLFolderBridge::createNewSocks(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); -} - -void LLFolderBridge::createNewJacket(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); -} - -void LLFolderBridge::createNewSkirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); -} - -void LLFolderBridge::createNewGloves(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); -} - -void LLFolderBridge::createNewUndershirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); -} - -void LLFolderBridge::createNewUnderpants(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); -} - -void LLFolderBridge::createNewShape(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); -} - -void LLFolderBridge::createNewSkin(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); -} - -void LLFolderBridge::createNewHair(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); -} - -void LLFolderBridge::createNewEyes(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); -} - -// static -void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType 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)); -} - -void LLFolderBridge::modifyOutfit(BOOL append) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - - // BAP - was: - // wear_inventory_category_on_avatar( cat, append ); - LLAppearanceManager::wearInventoryCategory( cat, FALSE, append ); -} - -// helper stuff -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) -{ - LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; - LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); - S32 option = LLNotification::getSelectedOption(notification, response); - - if(option == 0 && object) - { - if (cat_and_wear && cat_and_wear->mWear) - { - InventoryObjectList inventory_objects; - object->getInventoryContents(inventory_objects); - int contents_count = inventory_objects.size()-1; //subtract one for containing folder - - LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); - gInventory.addObserver(inventoryObserver); - } - - two_uuids_list_t::iterator move_it; - for (move_it = move_inv->mMoveList.begin(); - move_it != move_inv->mMoveList.end(); - ++move_it) - { - object->moveInventory(move_it->first, move_it->second); - } - - // update the UI. - dialog_refresh_all(); - } - - if (move_inv->mCallback) - { - move_inv->mCallback(option, move_inv->mUserData); - } - - delete move_inv; - return false; -} - -/* -Next functions intended to reorder items in the inventory folder and save order on server -Is now used for Favorites folder. - -*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel -*/ -void saveItemsOrder(LLInventoryModel::item_array_t& items) -{ - int sortField = 0; - - // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - LLViewerInventoryItem* item = *i; - - item->setSortField(++sortField); - item->setComplete(TRUE); - item->updateServer(FALSE); - - gInventory.updateItem(item); - } - - gInventory.notifyObservers(); -} - -LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) -{ - LLInventoryModel::item_array_t::iterator result = items.end(); - - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - if ((*i)->getUUID() == id) - { - result = i; - break; - } - } - - return result; -} - -void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) -{ - LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); - LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); - - items.erase(findItemByUUID(items, srcItem->getUUID())); - items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); -} - -BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, - BOOL drop) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - // cannot drag into library - if(!isAgentInventory()) - { - return FALSE; - } - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) 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_ROOT_CATEGORY: - is_movable = FALSE; - 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 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); - - if(is_movable && move_is_into_trash) - { - switch(inv_item->getType()) - { - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); - break; - - case LLAssetType::AT_OBJECT: - is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); - break; - default: - break; - } - } - - if ( is_movable ) - { - // Don't allow creating duplicates in the Calling Card/Friends - // subfolders, see bug EXT-1599. Check is item direct descendent - // of target folder and forbid item's movement if it so. - // Note: isItemDirectDescendentOfCategory checks if - // passed category is in the Calling Card/Friends folder - is_movable = ! LLFriendCardsManager::instance() - .isObjDirectDescendentOfCategory (inv_item, getCategory()); - } - - const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - - // we can move item inside a folder only if this folder is Favorites. See EXT-719 - accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); - if(accept && drop) - { - if (inv_item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) - { - LLGestureManager::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 - // the selection to its new location (which is very - // annoying). - if (LLFloaterInventory::getActiveInventory()) - { - LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - if (active_panel && (panel != active_panel)) - { - active_panel->unSelectAll(); - } - } - - // if dragging from/into favorites folder only reorder items - if ((mUUID == inv_item->getParentUUID()) && (favorites_id == mUUID)) - { - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - LLIsType is_type(LLAssetType::AT_LANDMARK); - model->collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; - if (itemp) - { - LLUUID srcItemId = inv_item->getUUID(); - LLUUID destItemId = itemp->getListener()->getUUID(); - - // update order - updateItemsOrder(items, srcItemId, destItemId); - - saveItemsOrder(items); - } - } - else if (favorites_id == mUUID) // if target is the favorites folder we use copy - { - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - else if (move_is_into_current_outfit || move_is_into_outfit) - { - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceManager::wearItem(inv_item); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_item->getUUID(), - mUUID, - std::string(), - LLAssetType::AT_LINK, - cb); - } - } - else - { - // restamp if the move is into the trash. - LLInvFVBridge::changeItemParent( - model, - (LLViewerInventoryItem*)inv_item, - mUUID, - move_is_into_trash); - } - } - } - else if(LLToolDragAndDrop::SOURCE_WORLD == source) - { - // Make sure the object exists. If we allowed dragging from - // anonymous objects, it would be possible to bypass - // permissions. - object = gObjectList.findObject(inv_item->getParentUUID()); - if(!object) - { - llinfos << "Object not found for drop." << llendl; - return FALSE; - } - - // coming from a task. Need to figure out if the person can - // move/copy this item. - LLPermissions perm(inv_item->getPermissions()); - BOOL is_move = FALSE; - if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) - && perm.allowTransferTo(gAgent.getID()))) -// || gAgent.isGodlike()) - - { - accept = TRUE; - } - else if(object->permYouOwner()) - { - // If the object cannot be copied, but the object the - // inventory is owned by the agent, then the item can be - // moved from the task to agent inventory. - is_move = TRUE; - accept = TRUE; - } - if(drop && accept) - { - LLMoveInv* move_inv = new LLMoveInv; - move_inv->mObjectID = inv_item->getParentUUID(); - two_uuids_t item_pair(mUUID, inv_item->getUUID()); - move_inv->mMoveList.push_back(item_pair); - move_inv->mCallback = NULL; - move_inv->mUserData = NULL; - if(is_move) - { - warn_move_inventory(object, move_inv); - } - else - { - LLNotification::Params params("MoveInventoryFromObject"); - params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); - LLNotifications::instance().forceResponse(params, 0); - } - } - - } - else if(LLToolDragAndDrop::SOURCE_NOTECARD == source) - { - accept = TRUE; - if(drop) - { - copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), - LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); - } - } - else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; - if(item && item->isComplete()) - { - accept = TRUE; - if(drop) - { - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - } - } - else - { - llwarns << "unhandled drag source" << llendl; - } - return accept; -} - -// +=================================================+ -// | 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); -} - -void LLTextureBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -} - -void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - items.push_back(std::string("Texture Separator")); - items.push_back(std::string("Save As")); - } - hide_context_entries(menu, items, disabled_items); -} - -// virtual -void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("save_as" == action) - { - LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); - LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID); - if (preview_texture) - { - preview_texture->openToSave(); - } - } - else LLItemBridge::performAction(folder, 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(); - - 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() -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - send_sound_trigger(item->getAssetUUID(), 1.0); - } -} - -void LLSoundBridge::openSoundPreview(void* which) -{ - LLSoundBridge *me = (LLSoundBridge *)which; - LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES); -} - -void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLSoundBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Sound Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Sound Separator")); - items.push_back(std::string("Sound Play")); - - hide_context_entries(menu, items, disabled_items); -} - -// +=================================================+ -// | LLLandmarkBridge | -// +=================================================+ - -LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : -LLItemBridge(inventory, uuid) -{ - mVisited = FALSE; - if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) - { - mVisited = TRUE; - } -} - -LLUIImagePtr LLLandmarkBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); -} - -void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Landmark Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Landmark Separator")); - items.push_back(std::string("About Landmark")); - - // Disable "About Landmark" menu item for - // multiple landmarks selected. Only one landmark - // info panel can be shown at a time. - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("About Landmark")); - } - - hide_context_entries(menu, items, disabled_items); -} - -// Convenience function for the two functions below. -void teleport_via_landmark(const LLUUID& asset_id) -{ - gAgent.teleportViaLandmark( asset_id ); - - // we now automatically track the landmark you're teleporting to - // because you'll probably arrive at a telehub instead - LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); - if( floater_world_map ) - { - floater_world_map->trackLandmark( asset_id ); - } -} - -// virtual -void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("teleport" == action) - { - LLViewerInventoryItem* item = getItem(); - if(item) - { - teleport_via_landmark(item->getAssetUUID()); - } - } - else if ("about" == action) - { - LLViewerInventoryItem* item = getItem(); - if(item) - { - LLSD key; - key["type"] = "landmark"; - key["id"] = item->getUUID(); - - LLSideTray::getInstance()->showPanel("panel_places", key); - } - } - else - { - LLItemBridge::performAction(folder, model, action); - } -} - -static bool open_landmark_callback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - - LLUUID asset_id = notification["payload"]["asset_id"].asUUID(); - if (option == 0) - { - teleport_via_landmark(asset_id); - } - - return false; -} -static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback); - - -void LLLandmarkBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - 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(); - LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); - } -*/ -} - - -// +=================================================+ -// | LLCallingCardObserver | -// +=================================================+ -void LLCallingCardObserver::changed(U32 mask) -{ - mBridgep->refreshFolderViewItem(); -} - -// +=================================================+ -// | LLCallingCardBridge | -// +=================================================+ - -LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : - LLItemBridge(inventory, uuid) -{ - mObserver = new LLCallingCardObserver(this); - LLAvatarTracker::instance().addObserver(mObserver); -} - -LLCallingCardBridge::~LLCallingCardBridge() -{ - LLAvatarTracker::instance().removeObserver(mObserver); - delete mObserver; -} - -void LLCallingCardBridge::refreshFolderViewItem() -{ - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL; - if (itemp) - { - itemp->refresh(); - } -} - -// virtual -void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("begin_im" == action) - { - LLViewerInventoryItem *item = getItem(); - if (item && (item->getCreatorUUID() != gAgent.getID()) && - (!item->getCreatorUUID().isNull())) - { - std::string callingcard_name; - gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); - LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); - if (session_id != LLUUID::null) - { - LLIMFloater::show(session_id); - } - } - } - else if ("lure" == action) - { - LLViewerInventoryItem *item = getItem(); - if (item && (item->getCreatorUUID() != gAgent.getID()) && - (!item->getCreatorUUID().isNull())) - { - LLAvatarActions::offerTeleport(item->getCreatorUUID()); - } - } - else LLItemBridge::performAction(folder, model, action); -} - -LLUIImagePtr LLCallingCardBridge::getIcon() const -{ - BOOL online = FALSE; - LLViewerInventoryItem* item = getItem(); - if(item) - { - online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); - } - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); -} - -std::string LLCallingCardBridge::getLabelSuffix() const -{ - LLViewerInventoryItem* item = getItem(); - if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) ) - { - return LLItemBridge::getLabelSuffix() + " (online)"; - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -void LLCallingCardBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if(item && !item->getCreatorUUID().isNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } -*/ -} - -void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - LLInventoryItem* item = getItem(); - BOOL good_card = (item - && (LLUUID::null != item->getCreatorUUID()) - && (item->getCreatorUUID() != gAgent.getID())); - BOOL 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...")); - items.push_back(std::string("Conference Chat")); - - if (!good_card) - { - disabled_items.push_back(std::string("Send Instant Message")); - } - if (!good_card || !user_online) - { - disabled_items.push_back(std::string("Offer Teleport...")); - disabled_items.push_back(std::string("Conference Chat")); - } - } - hide_context_entries(menu, items, disabled_items); -} - -BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - LLViewerInventoryItem* item = getItem(); - BOOL rv = FALSE; - if(item) - { - // 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: - { - LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; - const LLPermissions& perm = inv_item->getPermissions(); - if(gInventory.getItem(inv_item->getUUID()) - && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) - { - rv = TRUE; - if(drop) - { - LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), - (LLInventoryItem*)cargo_data); - } - } - else - { - // It's not in the user's inventory (it's probably in - // an object's contents), so disallow dragging it here. - // You can't give something you don't yet have. - rv = FALSE; - } - break; - } - case DAD_CATEGORY: - { - LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; - if( gInventory.getCategory( inv_cat->getUUID() ) ) - { - rv = TRUE; - if(drop) - { - LLToolDragAndDrop::giveInventoryCategory( - item->getCreatorUUID(), - inv_cat); - } - } - else - { - // It's not in the user's inventory (it's probably in - // an object's contents), so disallow dragging it here. - // You can't give something you don't yet have. - rv = FALSE; - } - break; - } - default: - break; - } - } - return rv; -} - -BOOL LLCallingCardBridge::removeItem() -{ - if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem())) - { - LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID()); - return FALSE; - } - else - { - return LLItemBridge::removeItem(); - } -} -// +=================================================+ -// | 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) ) - { - return LLFontGL::BOLD; - } - else - { - return LLFontGL::NORMAL; - } -} - -std::string LLGestureBridge::getLabelSuffix() const -{ - if( LLGestureManager::instance().isGestureActive(mUUID) ) - { - return LLItemBridge::getLabelSuffix() + " (active)"; - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -// virtual -void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("activate" == action) - { - LLGestureManager::instance().activateGesture(mUUID); - - LLViewerInventoryItem* item = gInventory.getItem(mUUID); - if (!item) return; - - // Since we just changed the suffix to indicate (active) - // the server doesn't need to know, just the viewer. - gInventory.updateItem(item); - gInventory.notifyObservers(); - } - else if ("deactivate" == action) - { - LLGestureManager::instance().deactivateGesture(mUUID); - - LLViewerInventoryItem* item = gInventory.getItem(mUUID); - if (!item) return; - - // Since we just changed the suffix to indicate (active) - // the server doesn't need to know, just the viewer. - gInventory.updateItem(item); - gInventory.notifyObservers(); - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLGestureBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); - } -*/ -} - -BOOL LLGestureBridge::removeItem() -{ - // Force close the preview window, if it exists - LLGestureManager::instance().deactivateGesture(mUUID); - return LLItemBridge::removeItem(); -} - -void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - items.push_back(std::string("Gesture Separator")); - items.push_back(std::string("Activate")); - items.push_back(std::string("Deactivate")); - } - hide_context_entries(menu, items, disabled_items); -} - -// +=================================================+ -// | LLAnimationBridge | -// +=================================================+ - -LLUIImagePtr LLAnimationBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); -} - -void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Animation Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Animation Separator")); - items.push_back(std::string("Animation Play")); - items.push_back(std::string("Animation Audition")); - - hide_context_entries(menu, items, disabled_items); - -} - -// virtual -void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ((action == "playworld") || (action == "playlocal")) - { - if (getItem()) - { - LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE; - if ("playworld" == action) activate = LLPreviewAnim::PLAY; - if ("playlocal" == action) activate = LLPreviewAnim::AUDITION; - - LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID)); - if (preview) - { - preview->activate(activate); - } - } - } - else - { - LLItemBridge::performAction(folder, model, action); - } -} - -void LLAnimationBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - } -*/ -} - -// +=================================================+ -// | LLObjectBridge | -// +=================================================+ - -// static -LLUUID LLObjectBridge::sContextMenuItemID; - -LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : -LLItemBridge(inventory, uuid), mInvType(type) -{ - mAttachPt = (flags & 0xff); // low bye of inventory flags - - mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; -} - -BOOL LLObjectBridge::isItemRemovable() -{ - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - if(avatar->isWearingAttachment(mUUID)) return FALSE; - return LLInvFVBridge::isItemRemovable(); -} - -LLUIImagePtr LLObjectBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); -} - -LLInventoryObject* LLObjectBridge::getObject() const -{ - LLInventoryObject* object = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - object = (LLInventoryObject*)model->getObject(mUUID); - } - return object; -} - -// virtual -void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("attach" == action) - { - LLUUID object_id = mUUID; - LLViewerInventoryItem* item; - item = (LLViewerInventoryItem*)gInventory.getItem(object_id); - if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) - { - rez_attachment(item, NULL); - } - else if(item && item->isComplete()) - { - // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - gFocusMgr.setKeyboardFocus(NULL); - } - else if ("detach" == action) - { - LLInventoryItem* item = gInventory.getItem(mUUID); - if(item) - { - gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - 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->getUUID()); - if (found_obj) - { - LLSelectMgr::getInstance()->remove(found_obj); - } - else - { - llwarns << "object not found - ignoring" << llendl; - } - } - else LLItemBridge::performAction(folder, 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; - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar && avatar->isWearingAttachment( mUUID ) ) - { - font |= LLFontGL::BOLD; - } - - LLInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - font |= LLFontGL::ITALIC; - } - - return (LLFontGL::StyleFlags)font; -} - -std::string LLObjectBridge::getLabelSuffix() const -{ - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar && avatar->isWearingAttachment( mUUID ) ) - { - std::string attachment_point_name = avatar->getAttachedPointName(mUUID); - LLStringUtil::toLower(attachment_point_name); - - LLStringUtil::format_map_t args; - args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str(); - return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) -{ - LLSD payload; - payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. - - S32 attach_pt = 0; - if (gAgent.getAvatarObject() && attachment) - { - for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); - iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) - { - if (iter->second == attachment) - { - attach_pt = iter->first; - break; - } - } - } - - payload["attachment_point"] = attach_pt; - -#if !ENABLE_MULTIATTACHMENTS - if (attachment && attachment->getNumObjects() > 0) - { - LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); - } - else -#endif - { - LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/); - } -} - -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) -{ - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - - if (!avatarp->canAttachMoreObjects()) - { - LLSD args; - args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); - LLNotifications::instance().add("MaxAttachmentsOnOutfit", args); - return false; - } - - S32 option = LLNotification::getSelectedOption(notification, response); - if (option == 0/*YES*/) - { - LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); - - if (itemp) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); - msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); - U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); -#if ENABLE_MULTIATTACHMENTS - attachment_pt |= ATTACHMENT_ADD; -#endif - msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); - pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); - msg->addStringFast(_PREHASH_Name, itemp->getName()); - msg->addStringFast(_PREHASH_Description, itemp->getDescription()); - msg->sendReliable(gAgent.getRegion()->getHost()); - } - } - return false; -} -static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); - -void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - LLInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - items.push_back(std::string("Goto Link")); - } - - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - LLObjectBridge::sContextMenuItemID = mUUID; - - if(item) - { - LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - if( !avatarp ) - { - return; - } - - if( avatarp->isWearingAttachment( mUUID ) ) - { - items.push_back(std::string("Detach From Yourself")); - } - else - if( !isInTrash() && !isLinkedObjectInTrash() ) - { - items.push_back(std::string("Attach Separator")); - items.push_back(std::string("Object Wear")); - items.push_back(std::string("Attach To")); - items.push_back(std::string("Attach To HUD")); - // commented out for DEV-32347 - //items.push_back(std::string("Restore to Last Position")); - - if (!avatarp->canAttachMoreObjects()) - { - disabled_items.push_back(std::string("Object Wear")); - disabled_items.push_back(std::string("Attach To")); - disabled_items.push_back(std::string("Attach To HUD")); - } - 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) - { - 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; - LLMenuItemCallGL::Params p; - std::string submenu_name = attachment->getName(); - if (LLTrans::getString(submenu_name) != "") - { - p.name = (" ")+LLTrans::getString(submenu_name)+" "; - } - else - { - p.name = submenu_name; - } - LLSD cbparams; - cbparams["index"] = curiter->first; - cbparams["label"] = attachment->getName(); - p.on_click.function_name = "Inventory.AttachObject"; - p.on_click.parameter = LLSD(attachment->getName()); - p.on_enable.function_name = "Attachment.Label"; - p.on_enable.parameter = cbparams; - LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; - LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); - } - } - } - } - } - hide_context_entries(menu, items, disabled_items); -} - -BOOL LLObjectBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLPreview::dirty(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryItem* item = getItem(); - if(item && (item->getName() != new_name)) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(new_name); - buildDisplayName(new_item, mDisplayName); - new_item->updateServer(FALSE); - model->updateItem(new_item); - - model->notifyObservers(); - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar ) - { - LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); - if( obj ) - { - LLSelectMgr::getInstance()->deselectAll(); - LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); - LLSelectMgr::getInstance()->selectionSetObjectName( new_name ); - LLSelectMgr::getInstance()->deselectAll(); - } - } - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - -// +=================================================+ -// | LLLSLTextBridge | -// +=================================================+ - -LLUIImagePtr LLLSLTextBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - -void LLLSLTextBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - 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 ) -{ - if(item) - { - lldebugs << "wear_inventory_item_on_avatar( " << item->getName() - << " )" << llendl; - - LLAppearanceManager::wearItem(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())); - } -} - -void remove_inventory_category_from_avatar( LLInventoryCategory* category ) -{ - if(!category) return; - lldebugs << "remove_inventory_category_from_avatar( " << category->getName() - << " )" << llendl; - - - if( gFloaterCustomize ) - { - gFloaterCustomize->askToSaveIfDirty( - boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); - } - else - { - remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); - } -} - -struct OnRemoveStruct -{ - LLUUID mUUID; - OnRemoveStruct(const LLUUID& uuid): - mUUID(uuid) - { - } -}; - -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) -{ - - // Find all the wearables that are in the category's subtree. - lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; - if(proceed) - { - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - LLFindWearables is_wearable; - gInventory.collectDescendentsIf(category_id, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_wearable); - S32 i; - S32 wearable_count = item_array.count(); - - LLInventoryModel::cat_array_t obj_cat_array; - LLInventoryModel::item_array_t obj_item_array; - LLIsType is_object( LLAssetType::AT_OBJECT ); - gInventory.collectDescendentsIf(category_id, - obj_cat_array, - obj_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_object); - S32 obj_count = obj_item_array.count(); - - // Find all gestures in this folder - LLInventoryModel::cat_array_t gest_cat_array; - LLInventoryModel::item_array_t gest_item_array; - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - gInventory.collectDescendentsIf(category_id, - gest_cat_array, - gest_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_gesture); - S32 gest_count = gest_item_array.count(); - - if (wearable_count > 0) //Loop through wearables. If worn, remove. - { - for(i = 0; i < wearable_count; ++i) - { - if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) ) - { - LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(), - item_array.get(i)->getName(), - item_array.get(i)->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(item_array.get(i)->getUUID())); - - } - } - } - - - if (obj_count > 0) - { - for(i = 0; i < obj_count; ++i) - { - gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() ); - - 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( obj_item_array.get(i)->getUUID()); - if (found_obj) - { - LLSelectMgr::getInstance()->remove(found_obj); - } - else - { - llwarns << "object not found, ignoring" << llendl; - } - } - } - - if (gest_count > 0) - { - for(i = 0; i < gest_count; ++i) - { - if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) ) - { - LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() ); - gInventory.updateItem( gest_item_array.get(i) ); - gInventory.notifyObservers(); - } - - } - } - } -} - -BOOL LLWearableBridge::renameItem(const std::string& new_name) -{ - if( gAgentWearables.isWearingItem( mUUID ) ) - { - gAgentWearables.setWearableName( mUUID, new_name ); - } - return LLItemBridge::renameItem(new_name); -} - -BOOL LLWearableBridge::isItemRemovable() -{ - if (gAgentWearables.isWearingItem(mUUID)) return FALSE; - return LLInvFVBridge::isItemRemovable(); -} - -std::string LLWearableBridge::getLabelSuffix() const -{ - if( gAgentWearables.isWearingItem( mUUID ) ) - { - return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -LLUIImagePtr LLWearableBridge::getIcon() const -{ - return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); -} - -// virtual -void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("wear" == action) - { - wearOnAvatar(); - } - else if ("wear_add" == action) - { - wearAddOnAvatar(); - } - else if ("edit" == action) - { - editOnAvatar(); - return; - } - else if ("take_off" == action) - { - if(gAgentWearables.isWearingItem(mUUID)) - { - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(mUUID)); - } - } - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLWearableBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - /* - if( isInTrash() ) - { - LLNotifications::instance().add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if( !gAgentWearables.isWearingItem( 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. - LLNotifications::instance().add("CannotWearInfoNotComplete"); - } - } - */ -} - -void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere - BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM); - - // If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976 - LLViewerInventoryItem* item = getItem(); - if( !no_open && item ) - { - no_open = (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART); - } - if (!no_open) - { - items.push_back(std::string("Open")); - } - - if (item && item->getIsLinkType()) - { - items.push_back(std::string("Goto Link")); - } - - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - items.push_back(std::string("Wearable Separator")); - - items.push_back(std::string("Wearable Wear")); - items.push_back(std::string("Wearable Add")); - items.push_back(std::string("Wearable Edit")); - - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Wearable Edit")); - } - // Don't allow items to be worn if their baseobj is in the trash. - if (isLinkedObjectInTrash()) - { - disabled_items.push_back(std::string("Wearable Wear")); - disabled_items.push_back(std::string("Wearable Add")); - disabled_items.push_back(std::string("Wearable Edit")); - } - - // Disable wear and take off based on whether the item is worn. - if(item) - { - switch (item->getType()) - { - case LLAssetType::AT_CLOTHING: - items.push_back(std::string("Take Off")); - case LLAssetType::AT_BODYPART: - if (gAgentWearables.isWearingItem(item->getUUID())) - { - disabled_items.push_back(std::string("Wearable Wear")); - disabled_items.push_back(std::string("Wearable Add")); - } - else - { - disabled_items.push_back(std::string("Take Off")); - } - break; - default: - break; - } - } - } - hide_context_entries(menu, items, disabled_items); -} - -// Called from menus -// static -BOOL LLWearableBridge::canWearOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return FALSE; - if(!self->isAgentInventory()) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); - if(!item || !item->isComplete()) return FALSE; - } - return (!gAgentWearables.isWearingItem(self->mUUID)); -} - -// Called from menus -// static -void LLWearableBridge::onWearOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return; - self->wearOnAvatar(); -} - -void LLWearableBridge::wearOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - 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); - } - } -} - -void LLWearableBridge::wearAddOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - 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); - } - } -} - -// static -void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) -{ - LLUUID* item_id = (LLUUID*) userdata; - if(wearable) - { - LLViewerInventoryItem* item = NULL; - item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); - if(item) - { - if(item->getAssetUUID() == wearable->getAssetID()) - { - gAgentWearables.setWearableItem(item, wearable); - gInventory.notifyObservers(); - //self->getFolderItem()->refreshFromRoot(); - } - else - { - llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; - } - } - } - delete item_id; -} - -// static -// BAP remove the "add" code path once everything is fully COF-ified. -void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) -{ - LLUUID* item_id = (LLUUID*) userdata; - if(wearable) - { - LLViewerInventoryItem* item = NULL; - item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); - if(item) - { - if(item->getAssetUUID() == wearable->getAssetID()) - { - bool do_append = true; - gAgentWearables.setWearableItem(item, wearable, do_append); - gInventory.notifyObservers(); - //self->getFolderItem()->refreshFromRoot(); - } - else - { - llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; - } - } - } - delete item_id; -} - -// static -BOOL LLWearableBridge::canEditOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return FALSE; - - return (gAgentWearables.isWearingItem(self->mUUID)); -} - -// static -void LLWearableBridge::onEditOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(self) - { - self->editOnAvatar(); - } -} - -void LLWearableBridge::editOnAvatar() -{ - const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); - 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(); - } - } -} - -// static -BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) - { - return gAgentWearables.isWearingItem( self->mUUID ); - } - return FALSE; -} - -// static -void LLWearableBridge::onRemoveFromAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return; - if(gAgentWearables.isWearingItem(self->mUUID)) - { - LLViewerInventoryItem* item = self->getItem(); - if (item) - { - LLUUID parent_id = item->getParentUUID(); - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - onRemoveFromAvatarArrived, - new OnRemoveStruct(LLUUID(self->mUUID))); - } - } -} - -// static -void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, - void* userdata) -{ - OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; - const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); - if(wearable) - { - if( gAgentWearables.isWearingItem( item_id ) ) - { - EWearableType type = wearable->getType(); - - if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& - //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) - { - // MULTI_WEARABLE: FIXME HACK - always remove all - bool do_remove_all = false; - gAgentWearables.removeWearable( type, do_remove_all, 0 ); - } - } - } - - // Find and remove this item from the COF. - LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF()); - llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. - 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); - } - gInventory.notifyObservers(); - - delete on_remove_struct; -} - -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; - - 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; - } - return action; -} - -//static -void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model) -{ - LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); - if(action) - { - action->doIt(); - delete action; - } -} - -//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) - { - action->doIt(); - delete action; - } -} - -LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const -{ - if(mModel) - return (LLViewerInventoryItem*)mModel->getItem(mUUID); - return NULL; -} - -//virtual -void LLTextureBridgeAction::doIt() -{ - if (getItem()) - { - LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLSoundBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLLandmarkBridgeAction::doIt() -{ - 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(); - LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLCallingCardBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if(item && item->getCreatorUUID().notNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void -LLNotecardBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLGestureBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLAnimationBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLObjectBridgeAction::doIt() -{ - LLFloaterReg::showInstance("properties", mUUID); - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLLSLTextBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -BOOL LLWearableBridgeAction::isInTrash() const -{ - if(!mModel) return FALSE; - const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); - return mModel->isObjectDescendentOf(mUUID, trash_id); -} - -BOOL LLWearableBridgeAction::isAgentInventory() const -{ - if(!mModel) return FALSE; - if(gInventory.getRootFolderID() == mUUID) return TRUE; - return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); -} - -void LLWearableBridgeAction::wearOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - 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); - } - } -} - -//virtual -void LLWearableBridgeAction::doIt() -{ - if(isInTrash()) - { - LLNotifications::instance().add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if(!gAgentWearables.isWearingItem(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. - LLNotifications::instance().add("CannotWearInfoNotComplete"); - } - } - - LLInvFVBridgeAction::doIt(); -} - -// +=================================================+ -// | LLLinkItemBridge | -// +=================================================+ -// For broken links - -std::string LLLinkItemBridge::sPrefix("Link: "); - - -LLUIImagePtr LLLinkItemBridge::getIcon() const -{ - if (LLViewerInventoryItem *item = getItem()) - { - return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE); - } - return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); -} - -void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - } - hide_context_entries(menu, items, disabled_items); -} - - -// +=================================================+ -// | LLLinkBridge | -// +=================================================+ -// For broken links. - -std::string LLLinkFolderBridge::sPrefix("Link: "); - - -LLUIImagePtr LLLinkFolderBridge::getIcon() const -{ - LLFolderType::EType preferred_type = LLFolderType::FT_NONE; - if (LLViewerInventoryItem *item = getItem()) - { - if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) - { - preferred_type = cat->getPreferredType(); - } - } - return LLFolderBridge::getIcon(preferred_type); -} - -void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Goto Link")); - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - } - hide_context_entries(menu, items, disabled_items); -} - -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; -} +/** + * @file llinventorybridge.cpp + * @brief Implementation of the Inventory-Folder-View-Bridge classes. + * + * $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 "llinventorybridge.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llavataractions.h" +#include "llfloatercustomize.h" +#include "llfloaterinventory.h" +#include "llfloateropenobject.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "llfriendcard.h" +#include "llgesturemgr.h" +#include "llimfloater.h" +#include "llimview.h" +#include "llinventoryclipboard.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llinventorypanel.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewtexture.h" +#include "llselectmgr.h" +#include "llsidetray.h" +#include "lltrans.h" +#include "llviewerassettype.h" +#include "llviewermessage.h" +#include "llviewerobjectlist.h" +#include "llviewerwindow.h" +#include "llvoavatarself.h" +#include "llwearablelist.h" + +using namespace LLOldEvents; + +// Helpers +// bug in busy count inc/dec right now, logic is complex... do we really need it? +void inc_busy_count() +{ +// gViewerWindow->getWindow()->incBusyCount(); +// check balance of these calls if this code is changed to ever actually +// *do* something! +} +void dec_busy_count() +{ +// gViewerWindow->getWindow()->decBusyCount(); +// check balance of these calls if this code is changed to ever actually +// *do* something! +} + +// 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_item_linkitem.tga", + "inv_item_linkfolder.tga" +}; + +// +=================================================+ +// | LLInvFVBridge | +// +=================================================+ + +LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : +mUUID(uuid), mInvType(LLInventoryType::IT_NONE) +{ + mInventoryPanel = inventory->getHandle(); +} + +const std::string& LLInvFVBridge::getName() const +{ + LLInventoryObject* obj = getInventoryObject(); + if(obj) + { + return obj->getName(); + } + return LLStringUtil::null; +} + +const std::string& LLInvFVBridge::getDisplayName() const +{ + return getName(); +} + +// Folders have full perms +PermissionMask LLInvFVBridge::getPermissionMask() const +{ + + return PERM_ALL; +} + +// virtual +LLFolderType::EType LLInvFVBridge::getPreferredType() const +{ + return LLFolderType::FT_NONE; +} + + +// Folders don't have creation dates. +time_t LLInvFVBridge::getCreationDate() const +{ + return 0; +} + +// Can be destoryed (or moved to trash) +BOOL LLInvFVBridge::isItemRemovable() +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) + { + return TRUE; + } + return FALSE; +} + +// Can be moved to another folder +BOOL LLInvFVBridge::isItemMovable() const +{ + return TRUE; +} + +/*virtual*/ +/** + * @brief Adds this item into clipboard storage + */ +void LLInvFVBridge::cutToClipboard() +{ + if(isItemMovable()) + { + LLInventoryClipboard::instance().cut(mUUID); + } +} +// *TODO: make sure this does the right thing +void LLInvFVBridge::showProperties() +{ + 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); + */ +} + +void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + // Deactivate gestures when moving them into Trash + LLInvFVBridge* bridge; + LLInventoryModel* model = getInventoryModel(); + LLViewerInventoryItem* item = NULL; + LLViewerInventoryCategory* cat = NULL; + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + S32 count = batch.count(); + S32 i,j; + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); + if (item) + { + if(LLAssetType::AT_GESTURE == item->getType()) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + } + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); + if (cat) + { + gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE ); + for (j=0; j<descendent_items.count(); j++) + { + if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) + { + LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); + } + } + } + } + removeBatchNoCheck(batch); +} + +void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + // this method moves a bunch of items and folders to the trash. As + // per design guidelines for the inventory model, the message is + // built and the accounting is performed first. After all of that, + // we call LLInventoryModel::moveObject() to move everything + // around. + LLInvFVBridge* bridge; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLMessageSystem* msg = gMessageSystem; + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + LLViewerInventoryItem* item = NULL; + LLViewerInventoryCategory* cat = NULL; + std::vector<LLUUID> move_ids; + LLInventoryModel::update_map_t update; + bool start_new_message = true; + S32 count = batch.count(); + S32 i; + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); + if(item) + { + 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) + { + start_new_message = false; + msg->newMessageFast(_PREHASH_MoveInventoryItem); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addBOOLFast(_PREHASH_Stamp, TRUE); + } + msg->nextBlockFast(_PREHASH_InventoryData); + msg->addUUIDFast(_PREHASH_ItemID, item->getUUID()); + msg->addUUIDFast(_PREHASH_FolderID, trash_id); + msg->addString("NewName", NULL); + if(msg->isSendFullFast(_PREHASH_InventoryData)) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + } + } + if(!start_new_message) + { + start_new_message = true; + gAgent.sendReliableMessage(); + 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()); + if(cat) + { + if(cat->getParentUUID() == trash_id) continue; + move_ids.push_back(cat->getUUID()); + --update[cat->getParentUUID()]; + ++update[trash_id]; + if(start_new_message) + { + start_new_message = false; + msg->newMessageFast(_PREHASH_MoveInventoryFolder); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addBOOL("Stamp", TRUE); + } + msg->nextBlockFast(_PREHASH_InventoryData); + msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID()); + msg->addUUIDFast(_PREHASH_ParentID, trash_id); + if(msg->isSendFullFast(_PREHASH_InventoryData)) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + } + } + if(!start_new_message) + { + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + } + + // move everything. + std::vector<LLUUID>::iterator it = move_ids.begin(); + std::vector<LLUUID>::iterator end = move_ids.end(); + for(; it != end; ++it) + { + gInventory.moveObject((*it), trash_id); + } + + // notify inventory observers. + model->notifyObservers(); +} + +BOOL LLInvFVBridge::isClipboardPasteable() const +{ + if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) + { + return FALSE; + } + LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + const LLUUID &agent_id = gAgent.getID(); + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLUUID &item_id = objects.get(i); + + // Can't paste folders + const LLInventoryCategory *cat = model->getCategory(item_id); + if (cat) + { + return FALSE; + } + + const LLInventoryItem *item = model->getItem(item_id); + if (item) + { + if (!item->getPermissions().allowCopyBy(agent_id)) + { + return FALSE; + } + } + } + return TRUE; +} + +BOOL LLInvFVBridge::isClipboardPasteableAsLink() const +{ + if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) + { + return FALSE; + } + const LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLInventoryItem *item = model->getItem(objects.get(i)); + if (item) + { + if (!LLAssetType::lookupCanLink(item->getActualType())) + { + return FALSE; + } + } + const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); + if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())) + { + return FALSE; + } + } + return TRUE; +} + +void hide_context_entries(LLMenuGL& menu, + const std::vector<std::string> &entries_to_show, + const std::vector<std::string> &disabled_entries) +{ + const LLView::child_list_t *list = menu.getChildList(); + + LLView::child_list_t::const_iterator itor; + for (itor = list->begin(); itor != list->end(); ++itor) + { + std::string name = (*itor)->getName(); + + // descend into split menus: + LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor); + if ((name == "More") && branchp) + { + hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries); + } + + + bool found = false; + std::vector<std::string>::const_iterator itor2; + for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) + { + if (*itor2 == name) + { + found = true; + } + } + if (!found) + { + (*itor)->setVisible(FALSE); + } + else + { + for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2) + { + if (*itor2 == name) + { + (*itor)->setEnabled(FALSE); + } + } + } + } +} + +// Helper for commonly-used entries +void LLInvFVBridge::getClipboardEntries(bool show_asset_id, + std::vector<std::string> &items, + std::vector<std::string> &disabled_items, U32 flags) +{ + items.push_back(std::string("Rename")); + if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Rename")); + } + + if (show_asset_id) + { + items.push_back(std::string("Copy Asset UUID")); + if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) + || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Copy Asset UUID")); + } + } + + items.push_back(std::string("Copy Separator")); + + items.push_back(std::string("Copy")); + if (!isItemCopyable()) + { + disabled_items.push_back(std::string("Copy")); + } + + items.push_back(std::string("Paste")); + if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Paste")); + } + + items.push_back(std::string("Paste As Link")); + if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Paste As Link")); + } + items.push_back(std::string("Paste Separator")); + + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + + // If multiple items are selected, disable properties (if it exists). + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Properties")); + } +} + +void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("PurgeItem")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("PurgeItem")); + } + items.push_back(std::string("RestoreItem")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + hide_context_entries(menu, items, disabled_items); +} + +// *TODO: remove this +BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ + BOOL rv = FALSE; + + const LLInventoryObject* obj = getInventoryObject(); + + if(obj) + { + *type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType()); + if(*type == DAD_NONE) + { + return FALSE; + } + + *id = obj->getUUID(); + //object_ids.put(obj->getUUID()); + + if (*type == DAD_CATEGORY) + { + gInventory.startBackgroundFetch(obj->getUUID()); + } + + rv = TRUE; + } + + return rv; +} + +LLInventoryObject* LLInvFVBridge::getInventoryObject() const +{ + LLInventoryObject* obj = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + obj = (LLInventoryObject*)model->getObject(mUUID); + } + return obj; +} + +LLInventoryModel* LLInvFVBridge::getInventoryModel() const +{ + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + return panel ? panel->getModel() : NULL; +} + +BOOL LLInvFVBridge::isInTrash() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + return model->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLInvFVBridge::isLinkedObjectInTrash() const +{ + if (isInTrash()) return TRUE; + + const LLInventoryObject *obj = getInventoryObject(); + if (obj && obj->getIsLinkType()) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); + } + return FALSE; +} + +BOOL LLInvFVBridge::isAgentInventory() const +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + if(gInventory.getRootFolderID() == mUUID) return TRUE; + return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +BOOL LLInvFVBridge::isCOFFolder() const +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) return TRUE; + const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) + { + return TRUE; + } + return FALSE; +} + +BOOL LLInvFVBridge::isItemPermissive() const +{ + return FALSE; +} + +// static +void LLInvFVBridge::changeItemParent(LLInventoryModel* model, + LLViewerInventoryItem* item, + const LLUUID& new_parent, + BOOL restamp) +{ + if(item->getParentUUID() != new_parent) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->setParent(new_parent); + new_item->updateParentOnServer(restamp); + model->updateItem(new_item); + model->notifyObservers(); + } +} + +// static +void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, + LLViewerInventoryCategory* cat, + const LLUUID& new_parent, + BOOL restamp) +{ + if(cat->getParentUUID() != new_parent) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->setParent(new_parent); + 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; +} + +LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + const LLUUID& uuid, + U32 flags) +{ + LLInvFVBridge* new_listener = NULL; + switch(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; + } + new_listener = new LLTextureBridge(inventory, 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; + } + new_listener = new LLSoundBridge(inventory, 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; + } + new_listener = new LLLandmarkBridge(inventory, 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; + } + new_listener = new LLCallingCardBridge(inventory, 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; + } + new_listener = new LLScriptBridge(inventory, 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; + } + new_listener = new LLObjectBridge(inventory, 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; + } + new_listener = new LLNotecardBridge(inventory, 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; + } + new_listener = new LLAnimationBridge(inventory, 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; + } + new_listener = new LLGestureBridge(inventory, 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; + } + new_listener = new LLLSLTextBridge(inventory, 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; + } + new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)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); + break; + } + new_listener = new LLFolderBridge(inventory, uuid); + break; + case LLAssetType::AT_LINK: + // Only should happen for broken links. + new_listener = new LLLinkItemBridge(inventory, uuid); + break; + case LLAssetType::AT_LINK_FOLDER: + // Only should happen for broken links. + new_listener = new LLLinkItemBridge(inventory, uuid); + break; + default: + llinfos << "Unhandled asset type (llassetstorage.h): " + << (S32)asset_type << llendl; + break; + } + + if (new_listener) + { + new_listener->mInvType = inv_type; + } + + return new_listener; +} + +void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) +{ + LLInventoryCategory* cat = model->getCategory(uuid); + if (cat) + { + model->purgeDescendentsOf(uuid); + model->notifyObservers(); + } + LLInventoryObject* obj = model->getObject(uuid); + if (obj) + { + model->purgeObject(uuid); + model->notifyObservers(); + } +} + +// +=================================================+ +// | InventoryFVBridgeBuilder | +// +=================================================+ +LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + const LLUUID& uuid, + U32 flags /* = 0x00 */) const +{ + return LLInvFVBridge::createBridge(asset_type, + actual_asset_type, + inv_type, + inventory, + uuid, + flags); +} + +// +=================================================+ +// | LLItemBridge | +// +=================================================+ + +void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("goto" == action) + { + gotoItem(folder); + } + if ("open" == action) + { + openItem(); + return; + } + else if ("properties" == action) + { + showProperties(); + return; + } + else if ("purge" == action) + { + purgeItem(model, mUUID); + return; + } + else if ("restoreToWorld" == action) + { + restoreToWorld(); + return; + } + else if ("restore" == action) + { + restoreItem(); + return; + } + else if ("copy_uuid" == action) + { + // Single item only + LLInventoryItem* item = model->getItem(mUUID); + if(!item) return; + LLUUID asset_id = item->getAssetUUID(); + std::string buffer; + asset_id.toString(buffer); + + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); + return; + } + else if ("copy" == action) + { + copyToClipboard(); + return; + } + else if ("paste" == action) + { + // Single item only + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + if (!folder_view_itemp) return; + + folder_view_itemp->getListener()->pasteFromClipboard(); + return; + } + else if ("paste_link" == action) + { + // Single item only + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + if (!folder_view_itemp) return; + + folder_view_itemp->getListener()->pasteLinkFromClipboard(); + return; + } +} + +void LLItemBridge::selectItem() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); + if(item && !item->isComplete()) + { + item->fetchFromServer(); + } +} + +void LLItemBridge::restoreItem() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); + if(item) + { + LLInventoryModel* model = getInventoryModel(); + const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType())); + // do not restamp on restore. + LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); + } +} + +void LLItemBridge::restoreToWorld() +{ + LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); + if (itemp) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("RezRestoreToWorld"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + 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; + } + + if(remove_from_inventory) + { + gInventory.deleteObject(itemp->getUUID()); + gInventory.notifyObservers(); + } +} + +void LLItemBridge::gotoItem(LLFolderView *folder) +{ + LLInventoryObject *obj = getInventoryObject(); + if (obj && obj->getIsLinkType()) + { + LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); + if (active_panel) + { + active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); + } + } +} + +LLUIImagePtr LLItemBridge::getIcon() const +{ + return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); +} + +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; + + } + return perm_mask; +} + +const std::string& LLItemBridge::getDisplayName() const +{ + if(mDisplayName.empty()) + { + buildDisplayName(getItem(), mDisplayName); + } + return mDisplayName; +} + +void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) +{ + if(item) + { + name.assign(item->getName()); + } + else + { + name.assign(LLStringUtil::null); + } +} + +LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const +{ + U8 font = LLFontGL::NORMAL; + + if( gAgentWearables.isWearingItem( mUUID ) ) + { + // llinfos << "BOLD" << llendl; + font |= LLFontGL::BOLD; + } + + const LLViewerInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + font |= LLFontGL::ITALIC; + } + return (LLFontGL::StyleFlags)font; +} + +std::string LLItemBridge::getLabelSuffix() const +{ + // String table is loaded before login screen and inventory items are + // loaded after login, so LLTrans should be ready. + static std::string NO_COPY =LLTrans::getString("no_copy"); + static std::string NO_MOD = LLTrans::getString("no_modify"); + static std::string NO_XFER = LLTrans::getString("no_transfer"); + static std::string LINK = LLTrans::getString("link"); + static std::string BROKEN_LINK = LLTrans::getString("broken_link"); + std::string suffix; + LLInventoryItem* item = getItem(); + if(item) + { + // it's a bit confusing to put nocopy/nomod/etc on calling cards. + if(LLAssetType::AT_CALLINGCARD != item->getType() + && item->getPermissions().getOwner() == gAgent.getID()) + { + BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); + if (broken_link) return BROKEN_LINK; + + BOOL link = item->getIsLinkType(); + if (link) return LINK; + + BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); + if (!copy) + { + suffix += NO_COPY; + } + BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); + if (!mod) + { + suffix += NO_MOD; + } + BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, + gAgent.getID()); + if (!xfer) + { + suffix += NO_XFER; + } + } + } + return suffix; +} + +time_t LLItemBridge::getCreationDate() const +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + return item->getCreationDate(); + } + return 0; +} + + +BOOL LLItemBridge::isItemRenameable() const +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + // (For now) Don't allow calling card rename since that may confuse users as to + // what the calling card points to. + if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD) + { + return FALSE; + } + return (item->getPermissions().allowModifyBy(gAgent.getID())); + } + return FALSE; +} + +BOOL LLItemBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLPreview::dirty(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryItem* item = getItem(); + if(item && (item->getName() != new_name)) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + buildDisplayName(new_item, mDisplayName); + new_item->updateServer(FALSE); + model->updateItem(new_item); + + model->notifyObservers(); + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + + +BOOL LLItemBridge::removeItem() +{ + if(!isItemRemovable()) + { + 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); + LLViewerInventoryItem* item = getItem(); + + // if item is not already in trash + if(item && !model->isObjectDescendentOf(mUUID, trash_id)) + { + // move to trash, and restamp + LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); + // delete was successful + return TRUE; + } + else + { + // tried to delete already item in trash (should purge?) + return FALSE; + } +} + +BOOL LLItemBridge::isItemCopyable() const +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + // can't copy worn objects. DEV-15183 + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if( !avatarp ) + { + return FALSE; + } + + if(avatarp->isWearingAttachment(mUUID)) + { + return FALSE; + } + + // All items can be copied, not all can be pasted. + // The only time an item can't be copied is if it's a link + // return (item->getPermissions().allowCopyBy(gAgent.getID())); + if (item->getIsLinkType()) + { + return FALSE; + } + return TRUE; + } + return FALSE; +} +BOOL LLItemBridge::copyToClipboard() const +{ + if(isItemCopyable()) + { + LLInventoryClipboard::instance().add(mUUID); + return TRUE; + } + return FALSE; +} + +LLViewerInventoryItem* LLItemBridge::getItem() const +{ + LLViewerInventoryItem* item = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + item = (LLViewerInventoryItem*)model->getItem(mUUID); + } + return item; +} + +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 FALSE; +} + +// +=================================================+ +// | LLFolderBridge | +// +=================================================+ + +LLFolderBridge* LLFolderBridge::sSelf=NULL; + +// Can be moved to another folder +BOOL LLFolderBridge::isItemMovable() const +{ + LLInventoryObject* obj = getInventoryObject(); + if(obj) + { + return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType())); + } + return FALSE; +} + +void LLFolderBridge::selectItem() +{ +} + + +// Can be destroyed (or moved to trash) +BOOL LLFolderBridge::isItemRemovable() +{ + 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())) + { + return FALSE; + } + + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); + + S32 i; + for( i = 0; i < descendent_categories.count(); i++ ) + { + LLInventoryCategory* category = descendent_categories[i]; + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) + { + return FALSE; + } + } + + for( i = 0; i < descendent_items.count(); i++ ) + { + LLInventoryItem* item = descendent_items[i]; + if( (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART) ) + { + if(gAgentWearables.isWearingItem(item->getUUID())) + { + return FALSE; + } + } + else + if( item->getType() == LLAssetType::AT_OBJECT ) + { + if(avatar->isWearingAttachment(item->getUUID())) + { + return FALSE; + } + } + } + + return TRUE; +} + +BOOL LLFolderBridge::isUpToDate() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); + if( !category ) + { + return FALSE; + } + + return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN; +} + +BOOL LLFolderBridge::isItemCopyable() const +{ + return TRUE; +} + +BOOL LLFolderBridge::copyToClipboard() const +{ + if(isItemCopyable()) + { + LLInventoryClipboard::instance().add(mUUID); + return TRUE; + } + return FALSE; +} + +BOOL LLFolderBridge::isClipboardPasteable() const +{ + if ( ! LLInvFVBridge::isClipboardPasteable() ) + return FALSE; + + // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 + if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) ) + { + LLInventoryModel* model = getInventoryModel(); + if ( !model ) + { + return FALSE; + } + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + const LLViewerInventoryCategory *current_cat = getCategory(); + + // Search for the direct descendent of current Friends subfolder among all pasted items, + // and return false if is found. + for(S32 i = objects.count() - 1; i >= 0; --i) + { + const LLUUID &obj_id = objects.get(i); + if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) + { + return FALSE; + } + } + + } + return TRUE; +} + +BOOL LLFolderBridge::isClipboardPasteableAsLink() const +{ + // Check normal paste-as-link permissions + if (!LLInvFVBridge::isClipboardPasteableAsLink()) + { + return FALSE; + } + + const LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + const LLViewerInventoryCategory *current_cat = getCategory(); + if (current_cat) + { + const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat ); + const LLUUID ¤t_cat_id = current_cat->getUUID(); + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLUUID &obj_id = objects.get(i); + const LLInventoryCategory *cat = model->getCategory(obj_id); + if (cat) + { + const LLUUID &cat_id = cat->getUUID(); + // Don't allow recursive pasting + if ((cat_id == current_cat_id) || + model->isObjectDescendentOf(current_cat_id, cat_id)) + { + return FALSE; + } + } + // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 + if ( is_in_friend_folder ) + { + // If object is direct descendent of current Friends subfolder than return false. + // Note: We can't use 'const LLInventoryCategory *cat', because it may be null + // in case type of obj_id is LLInventoryItem. + if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) + { + return FALSE; + } + } + } + } + return TRUE; + +} + +BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, + BOOL drop) +{ + // This should never happen, but if an inventory item is incorrectly parented, + // the UI will get confused and pass in a NULL. + if(!inv_cat) return FALSE; + + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + + // cannot drag categories into library + if(!isAgentInventory()) + { + return FALSE; + } + + // check to make sure source is agent inventory, and is represented there. + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) + && (LLToolDragAndDrop::SOURCE_AGENT == source); + + BOOL accept = FALSE; + S32 i; + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + if(is_agent_inventory) + { + const LLUUID& cat_id = inv_cat->getUUID(); + + // 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); + 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); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + if (move_is_into_current_outfit || move_is_into_outfit) + { + // BAP - restrictions? + is_movable = true; + } + + if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)) + { + is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 + } + + if( is_movable ) + { + gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); + + for( i = 0; i < descendent_categories.count(); i++ ) + { + LLInventoryCategory* category = descendent_categories[i]; + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) + { + // ...can't move "special folders" like Textures + is_movable = FALSE; + break; + } + } + + if( is_movable ) + { + if( move_is_into_trash ) + { + for( i = 0; i < descendent_items.count(); i++ ) + { + LLInventoryItem* item = descendent_items[i]; + if( (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART) ) + { + if( gAgentWearables.isWearingItem( item->getUUID() ) ) + { + is_movable = FALSE; // It's generally movable, but not into the trash! + break; + } + } + else + if( item->getType() == LLAssetType::AT_OBJECT ) + { + if( avatar->isWearingAttachment( item->getUUID() ) ) + { + is_movable = FALSE; // It's generally movable, but not into the trash! + break; + } + } + } + } + } + } + + + 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) + { + for (i = 0; i < descendent_items.count(); i++) + { + LLInventoryItem* item = descendent_items[i]; + if (item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(item->getUUID())) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + } + // if target is an outfit or current outfit folder we use link + if (move_is_into_current_outfit || move_is_into_outfit) + { + if (inv_cat->getPreferredType() == LLFolderType::FT_NONE) + { + if (move_is_into_current_outfit) + { + // traverse category and add all contents to currently worn. + BOOL append = true; + LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append); + } + else + { + // Recursively create links in target outfit. + 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); + } + } + 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); + } +#endif + } + } + else + { + + // Reparent the folder and restamp children if it's moving + // into trash. + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + move_is_into_trash); + } + } + } + else if(LLToolDragAndDrop::SOURCE_WORLD == source) + { + // content category has same ID as object itself + LLUUID object_id = inv_cat->getUUID(); + LLUUID category_id = mUUID; + accept = move_inv_category_world_to_agent(object_id, category_id, drop); + } + return accept; +} + +void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) +{ + const char* dialog = NULL; + if (object->flagScripted()) + { + dialog = "MoveInventoryFromScriptedObject"; + } + else + { + dialog = "MoveInventoryFromObject"; + } + LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); +} + +// Move/copy all inventory items from the Contents folder of an in-world +// object to the agent's inventory, inside a given category. +BOOL move_inv_category_world_to_agent(const LLUUID& object_id, + const LLUUID& category_id, + BOOL drop, + void (*callback)(S32, void*), + void* user_data) +{ + // Make sure the object exists. If we allowed dragging from + // anonymous objects, it would be possible to bypass + // permissions. + // content category has same ID as object itself + LLViewerObject* object = gObjectList.findObject(object_id); + if(!object) + { + llinfos << "Object not found for drop." << llendl; + return FALSE; + } + + // 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; + object->getInventoryContents(inventory_objects); + + if (inventory_objects.empty()) + { + llinfos << "Object contents not found for drop." << llendl; + return FALSE; + } + + BOOL accept = TRUE; + BOOL is_move = FALSE; + + // 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(); + for ( ; it != end; ++it) + { + // coming from a task. Need to figure out if the person can + // move/copy this item. + LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); + if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) + && perm.allowTransferTo(gAgent.getID()))) +// || gAgent.isGodlike()) + { + accept = TRUE; + } + else if(object->permYouOwner()) + { + // If the object cannot be copied, but the object the + // inventory is owned by the agent, then the item can be + // moved from the task to agent inventory. + is_move = TRUE; + accept = TRUE; + } + else + { + accept = FALSE; + break; + } + } + + if(drop && accept) + { + it = inventory_objects.begin(); + InventoryObjectList::iterator first_it = inventory_objects.begin(); + LLMoveInv* move_inv = new LLMoveInv; + move_inv->mObjectID = object_id; + move_inv->mCategoryID = category_id; + move_inv->mCallback = callback; + move_inv->mUserData = user_data; + + for ( ; it != end; ++it) + { + two_uuids_t two(category_id, (*it)->getUUID()); + move_inv->mMoveList.push_back(two); + } + + if(is_move) + { + // Callback called from within here. + warn_move_inventory(object, move_inv); + } + else + { + LLNotification::Params params("MoveInventoryFromObject"); + params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + LLNotifications::instance().forceResponse(params, 0); + } + } + 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 +{ +public: + LLRightClickInventoryFetchObserver() : + mCopyItems(false) + { }; + LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : + mCatID(cat_id), + mCopyItems(copy_items) + { }; + virtual void done() + { + // we've downloaded all the items, so repaint the dialog + LLFolderBridge::staticFolderOptionsMenu(); + + gInventory.removeObserver(this); + delete this; + } + + +protected: + LLUUID mCatID; + bool mCopyItems; + +}; + +//Used by LLFolderBridge as callback for directory recursion. +class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver +{ +public: + LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} + ~LLRightClickInventoryFetchDescendentsObserver() {} + virtual void done(); +protected: + bool mCopyItems; +}; + +void LLRightClickInventoryFetchDescendentsObserver::done() +{ + // Avoid passing a NULL-ref as mCompleteFolders.front() down to + // gInventory.collectDescendents() + if( mCompleteFolders.empty() ) + { + llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + return; + } + + // 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 0 // HACK/TODO: Why? + // This early causes a giant menu to get produced, and doesn't seem to be needed. + if(!count) + { + llwarns << "Nothing fetched in category " << mCompleteFolders.front() + << llendl; + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + return; + } +#endif + + LLRightClickInventoryFetchObserver* outfit; + outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); + 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); + delete 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->fetchItems(ids); + 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()) + { + // 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); + }*/ +} + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryWearObserver +// +// Observer for "copy and wear" operation to support knowing +// when the all of the contents have been added to inventory. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCopyAndWearObserver : public LLInventoryObserver +{ +public: + LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} + virtual ~LLInventoryCopyAndWearObserver() {} + virtual void changed(U32 mask); + +protected: + LLUUID mCatID; + int mContentsCount; + BOOL mFolderAdded; +}; + + + +void LLInventoryCopyAndWearObserver::changed(U32 mask) +{ + if((mask & (LLInventoryObserver::ADD)) != 0) + { + if (!mFolderAdded) + { + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + for (;id_it != id_end; ++id_it) + { + if ((*id_it) == mCatID) + { + mFolderAdded = TRUE; + break; + } + } + } + + if (mFolderAdded) + { + LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); + + if (NULL == category) + { + llwarns << "gInventory.getCategory(" << mCatID + << ") was NULL" << llendl; + } + else + { + if (category->getDescendentCount() == + mContentsCount) + { + gInventory.removeObserver(this); + LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE); + delete this; + } + } + } + + } +} + + + +void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("open" == action) + { + openItem(); + return; + } + else if ("paste" == action) + { + pasteFromClipboard(); + return; + } + else if ("paste_link" == action) + { + pasteLinkFromClipboard(); + return; + } + else if ("properties" == action) + { + showProperties(); + return; + } + else if ("replaceoutfit" == action) + { + modifyOutfit(FALSE); + return; + } +#if SUPPORT_ENSEMBLES + else if ("wearasensemble" == action) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + LLAppearanceManager::instance().addEnsembleLink(cat,true); + return; + } +#endif + else if ("addtooutfit" == action) + { + modifyOutfit(TRUE); + return; + } + else if ("copy" == action) + { + copyToClipboard(); + return; + } + else if ("removefromoutfit" == action) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + + remove_inventory_category_from_avatar ( cat ); + return; + } + else if ("purge" == action) + { + purgeItem(model, mUUID); + return; + } + else if ("restore" == action) + { + restoreItem(); + return; + } +} + +void LLFolderBridge::openItem() +{ + lldebugs << "LLFolderBridge::openItem()" << llendl; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + if(mUUID.isNull()) return; + bool fetching_inventory = model->fetchDescendentsOf(mUUID); + // Only change folder type if we have the folder contents. + if (!fetching_inventory) + { + // Disabling this for now, it's causing crash when new items are added to folders + // since folder type may change before new item item has finished processing. + // determineFolderType(); + } +} + +void LLFolderBridge::closeItem() +{ + determineFolderType(); +} + +void LLFolderBridge::determineFolderType() +{ + if (isUpToDate()) + { + LLInventoryModel* model = getInventoryModel(); + LLViewerInventoryCategory* category = model->getCategory(mUUID); + category->determineFolderType(); + } +} + +BOOL LLFolderBridge::isItemRenameable() const +{ + LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); + if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) + && (cat->getOwnerID() == gAgent.getID())) + { + return TRUE; + } + return FALSE; +} + +void LLFolderBridge::restoreItem() +{ + LLViewerInventoryCategory* cat; + cat = (LLViewerInventoryCategory*)getCategory(); + if(cat) + { + LLInventoryModel* model = getInventoryModel(); + const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType())); + // do not restamp children on restore + LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); + } +} + +LLFolderType::EType LLFolderBridge::getPreferredType() const +{ + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + preferred_type = cat->getPreferredType(); + } + + return preferred_type; +} + +// Icons for folders are based on the preferred type +LLUIImagePtr LLFolderBridge::getIcon() const +{ + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + preferred_type = cat->getPreferredType(); + } + return getIcon(preferred_type); +} + +LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type) +{ + // we only have one folder image now + return LLUI::getUIImage("Inv_FolderClosed"); +} + +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); + + model->notifyObservers(); + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + +BOOL LLFolderBridge::removeItem() +{ + if(!isItemRemovable()) + { + return FALSE; + } + // 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 ); + + S32 i; + for (i = 0; i < descendent_items.count(); i++) + { + LLInventoryItem* item = descendent_items[i]; + if (item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(item->getUUID())) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + + // 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); + } + + return TRUE; +} + +void LLFolderBridge::pasteFromClipboard() +{ + LLInventoryModel* model = getInventoryModel(); + if(model && isClipboardPasteable()) + { + LLInventoryItem* item = NULL; + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + const LLUUID parent_id(mUUID); + for(S32 i = 0; i < count; i++) + { + item = model->getItem(objects.get(i)); + if (item) + { + if(LLInventoryClipboard::instance().isCutMode()) + { + // move_inventory_item() is not enough, + //we have to update inventory locally too + changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); + } + else + { + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + parent_id, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + } + } + } +} + +void LLFolderBridge::pasteLinkFromClipboard() +{ + const LLInventoryModel* model = getInventoryModel(); + if(model) + { + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + LLUUID parent_id(mUUID); + for(S32 i = 0; i < count; i++) + { + const LLUUID &object_id = objects.get(i); +#if SUPPORT_ENSEMBLES + if (LLInventoryCategory *cat = model->getCategory(object_id)) + { + link_inventory_item( + gAgent.getID(), + cat->getUUID(), + parent_id, + cat->getName(), + LLAssetType::AT_LINK_FOLDER, + LLPointer<LLInventoryCallback>(NULL)); + } + else +#endif + if (LLInventoryItem *item = model->getItem(object_id)) + { + link_inventory_item( + gAgent.getID(), + item->getLinkedUUID(), + parent_id, + item->getName(), + LLAssetType::AT_LINK, + LLPointer<LLInventoryCallback>(NULL)); + } + } + } +} + +void LLFolderBridge::staticFolderOptionsMenu() +{ + if (!sSelf) return; + sSelf->folderOptionsMenu(); +} + +void LLFolderBridge::folderOptionsMenu() +{ + std::vector<std::string> disabled_items; + + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + + const LLInventoryCategory* category = model->getCategory(mUUID); + LLFolderType::EType type = category->getPreferredType(); + const bool is_default_folder = category && 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)); + + // calling card related functionality for folders. + + // Only enable calling-card related options for non-default folders. + if (!is_default_folder) + { + LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); + if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) + { + mItems.push_back(std::string("Calling Card Separator")); + mItems.push_back(std::string("Conference Chat Folder")); + mItems.push_back(std::string("IM All Contacts In Folder")); + } + } + + // wearables related functionality for folders. + //is_wearable + LLFindWearables is_wearable; + LLIsType is_object( LLAssetType::AT_OBJECT ); + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + + if (mWearables || + checkFolderForContentsOfType(model, is_wearable) || + checkFolderForContentsOfType(model, is_object) || + checkFolderForContentsOfType(model, is_gesture) ) + { + mItems.push_back(std::string("Folder Wearables Separator")); + + // Only enable add/replace outfit for non-default folders. + if (!is_default_folder) + { + mItems.push_back(std::string("Add To Outfit")); + mItems.push_back(std::string("Replace Outfit")); + } + if (is_ensemble) + { + mItems.push_back(std::string("Wear As Ensemble")); + } + mItems.push_back(std::string("Remove From Outfit")); + } + hide_context_entries(*mMenu, mItems, disabled_items); +} + +BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + model->collectDescendentsIf(mUUID, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_type); + return ((item_array.count() > 0) ? TRUE : FALSE ); +} + +// Flags unused +void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + mItems.clear(); + mDisabledItems.clear(); + + lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; +// std::vector<std::string> disabled_items; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); + + mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) + mDisabledItems.clear(); //adding code to clear out disabled members from previous + if (lost_and_found_id == mUUID) + { + // This is the lost+found folder. + mItems.push_back(std::string("Empty Lost And Found")); + } + + if(trash_id == mUUID) + { + // This is the trash. + mItems.push_back(std::string("Empty Trash")); + } + else if(model->isObjectDescendentOf(mUUID, trash_id)) + { + // This is a folder in the trash. + mItems.clear(); // clear any items that used to exist + mItems.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + mDisabledItems.push_back(std::string("Purge Item")); + } + + mItems.push_back(std::string("Restore Item")); + } + else if(isAgentInventory()) // do not allow creating in library + { + 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 /*&& + LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) + { + // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. + if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) + mItems.push_back(std::string("New Folder")); + mItems.push_back(std::string("New Script")); + mItems.push_back(std::string("New Note")); + mItems.push_back(std::string("New Gesture")); + mItems.push_back(std::string("New Clothes")); + mItems.push_back(std::string("New Body Parts")); + mItems.push_back(std::string("Change Type")); + + LLViewerInventoryCategory *cat = getCategory(); + if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) + { + mDisabledItems.push_back(std::string("Change Type")); + } + + getClipboardEntries(false, mItems, mDisabledItems, flags); + } + else + { + // Want some but not all of the items from getClipboardEntries for outfits. + if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT) + { + mItems.push_back(std::string("Rename")); + mItems.push_back(std::string("Delete")); + } + } + + //Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 + mCallingCards = mWearables = FALSE; + + LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); + if (checkFolderForContentsOfType(model, is_callingcard)) + { + mCallingCards=TRUE; + } + + LLFindWearables is_wearable; + LLIsType is_object( LLAssetType::AT_OBJECT ); + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + + if (checkFolderForContentsOfType(model, is_wearable) || + checkFolderForContentsOfType(model, is_object) || + checkFolderForContentsOfType(model, is_gesture) ) + { + mWearables=TRUE; + } + + mMenu = &menu; + sSelf = this; + LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); + + LLInventoryFetchDescendentsObserver::folder_ref_t folders; + LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); + if (category) + { + folders.push_back(category->getUUID()); + } + fetch->fetchDescendents(folders); + inc_busy_count(); + if(fetch->isEverythingComplete()) + { + // everything is already here - call done. + fetch->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(fetch); + } + } + else + { + mItems.push_back(std::string("--no options--")); + mDisabledItems.push_back(std::string("--no options--")); + } + hide_context_entries(menu, mItems, mDisabledItems); +} + +BOOL LLFolderBridge::hasChildren() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLInventoryModel::EHasChildren has_children; + has_children = gInventory.categoryHasChildren(mUUID); + return has_children != LLInventoryModel::CHILDREN_NO; +} + +BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + //llinfos << "LLFolderBridge::dragOrDrop()" << llendl; + BOOL accept = FALSE; + switch(cargo_type) + { + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_CALLINGCARD: + case DAD_LANDMARK: + case DAD_SCRIPT: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_CLOTHING: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: + case DAD_LINK: + accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, + drop); + break; + case DAD_CATEGORY: + if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) + { + accept = FALSE; + } + else + { + accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); + } + break; + default: + break; + } + return accept; +} + +LLViewerInventoryCategory* LLFolderBridge::getCategory() const +{ + LLViewerInventoryCategory* cat = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + cat = (LLViewerInventoryCategory*)model->getCategory(mUUID); + } + return cat; +} + + +// static +void LLFolderBridge::pasteClipboard(void* user_data) +{ + LLFolderBridge* self = (LLFolderBridge*)user_data; + if(self) self->pasteFromClipboard(); +} + +void LLFolderBridge::createNewCategory(void* user_data) +{ + LLFolderBridge* bridge = (LLFolderBridge*)user_data; + if(!bridge) return; + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); + if (!panel) return; + LLInventoryModel* model = panel->getModel(); + if(!model) return; + LLUUID id; + id = model->createNewCategory(bridge->getUUID(), + LLFolderType::FT_NONE, + LLStringUtil::null); + model->notifyObservers(); + + // At this point, the bridge has probably been deleted, but the + // view is still there. + panel->setSelection(id, TAKE_FOCUS_YES); +} + +void LLFolderBridge::createNewShirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); +} + +void LLFolderBridge::createNewPants(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); +} + +void LLFolderBridge::createNewShoes(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); +} + +void LLFolderBridge::createNewSocks(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); +} + +void LLFolderBridge::createNewJacket(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); +} + +void LLFolderBridge::createNewSkirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); +} + +void LLFolderBridge::createNewGloves(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); +} + +void LLFolderBridge::createNewUndershirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); +} + +void LLFolderBridge::createNewUnderpants(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); +} + +void LLFolderBridge::createNewShape(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); +} + +void LLFolderBridge::createNewSkin(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); +} + +void LLFolderBridge::createNewHair(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); +} + +void LLFolderBridge::createNewEyes(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); +} + +// static +void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType 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)); +} + +void LLFolderBridge::modifyOutfit(BOOL append) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + + // BAP - was: + // wear_inventory_category_on_avatar( cat, append ); + LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append ); +} + +// helper stuff +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) +{ + LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; + LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); + S32 option = LLNotification::getSelectedOption(notification, response); + + if(option == 0 && object) + { + if (cat_and_wear && cat_and_wear->mWear) + { + InventoryObjectList inventory_objects; + object->getInventoryContents(inventory_objects); + int contents_count = inventory_objects.size()-1; //subtract one for containing folder + + LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); + gInventory.addObserver(inventoryObserver); + } + + two_uuids_list_t::iterator move_it; + for (move_it = move_inv->mMoveList.begin(); + move_it != move_inv->mMoveList.end(); + ++move_it) + { + object->moveInventory(move_it->first, move_it->second); + } + + // update the UI. + dialog_refresh_all(); + } + + if (move_inv->mCallback) + { + move_inv->mCallback(option, move_inv->mUserData); + } + + delete move_inv; + return false; +} + +/* +Next functions intended to reorder items in the inventory folder and save order on server +Is now used for Favorites folder. + +*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel +*/ +void saveItemsOrder(LLInventoryModel::item_array_t& items) +{ + int sortField = 0; + + // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + LLViewerInventoryItem* item = *i; + + item->setSortField(++sortField); + item->setComplete(TRUE); + item->updateServer(FALSE); + + gInventory.updateItem(item); + } + + gInventory.notifyObservers(); +} + +LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) +{ + LLInventoryModel::item_array_t::iterator result = items.end(); + + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + if ((*i)->getUUID() == id) + { + result = i; + break; + } + } + + return result; +} + +void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) +{ + LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); + LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); + + items.erase(findItemByUUID(items, srcItem->getUUID())); + items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); +} + +BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, + BOOL drop) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + // cannot drag into library + if(!isAgentInventory()) + { + return FALSE; + } + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) 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; + } + + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + 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); + + if(is_movable && move_is_into_trash) + { + switch(inv_item->getType()) + { + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); + break; + + case LLAssetType::AT_OBJECT: + is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); + break; + default: + break; + } + } + + if ( is_movable ) + { + // Don't allow creating duplicates in the Calling Card/Friends + // subfolders, see bug EXT-1599. Check is item direct descendent + // of target folder and forbid item's movement if it so. + // Note: isItemDirectDescendentOfCategory checks if + // passed category is in the Calling Card/Friends folder + is_movable = ! LLFriendCardsManager::instance() + .isObjDirectDescendentOfCategory (inv_item, getCategory()); + } + + const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK); + const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id)); + + // we can move item inside a folder only if this folder is Favorites. See EXT-719 + accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder); + if(accept && drop) + { + if (inv_item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) + { + LLGestureManager::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 + // the selection to its new location (which is very + // annoying). + if (LLFloaterInventory::getActiveInventory()) + { + LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + if (active_panel && (panel != active_panel)) + { + active_panel->unSelectAll(); + } + } + + // if dragging from/into favorites folder only reorder items + if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder) + { + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsType is_type(LLAssetType::AT_LANDMARK); + model->collectDescendentsIf(mUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; + if (itemp) + { + LLUUID srcItemId = inv_item->getUUID(); + LLUUID destItemId = itemp->getListener()->getUUID(); + + // update order + updateItemsOrder(items, srcItemId, destItemId); + + saveItemsOrder(items); + } + } + else if (favorites_id == mUUID) // if target is the favorites folder we use copy + { + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + else if (move_is_into_current_outfit || move_is_into_outfit) + { + // BAP - should skip if dup. + if (move_is_into_current_outfit) + { + LLAppearanceManager::instance().addCOFItemLink(inv_item); + } + else + { + LLPointer<LLInventoryCallback> cb = NULL; + link_inventory_item( + gAgent.getID(), + inv_item->getLinkedUUID(), + mUUID, + inv_item->getName(), + LLAssetType::AT_LINK, + cb); + } + } + else + { + // restamp if the move is into the trash. + LLInvFVBridge::changeItemParent( + model, + (LLViewerInventoryItem*)inv_item, + mUUID, + move_is_into_trash); + } + } + } + else if(LLToolDragAndDrop::SOURCE_WORLD == source) + { + // Make sure the object exists. If we allowed dragging from + // anonymous objects, it would be possible to bypass + // permissions. + object = gObjectList.findObject(inv_item->getParentUUID()); + if(!object) + { + llinfos << "Object not found for drop." << llendl; + return FALSE; + } + + // coming from a task. Need to figure out if the person can + // move/copy this item. + LLPermissions perm(inv_item->getPermissions()); + BOOL is_move = FALSE; + if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) + && perm.allowTransferTo(gAgent.getID()))) +// || gAgent.isGodlike()) + + { + accept = TRUE; + } + else if(object->permYouOwner()) + { + // If the object cannot be copied, but the object the + // inventory is owned by the agent, then the item can be + // moved from the task to agent inventory. + is_move = TRUE; + accept = TRUE; + } + if(drop && accept) + { + LLMoveInv* move_inv = new LLMoveInv; + move_inv->mObjectID = inv_item->getParentUUID(); + two_uuids_t item_pair(mUUID, inv_item->getUUID()); + move_inv->mMoveList.push_back(item_pair); + move_inv->mCallback = NULL; + move_inv->mUserData = NULL; + if(is_move) + { + warn_move_inventory(object, move_inv); + } + else + { + LLNotification::Params params("MoveInventoryFromObject"); + params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + LLNotifications::instance().forceResponse(params, 0); + } + } + + } + else if(LLToolDragAndDrop::SOURCE_NOTECARD == source) + { + accept = TRUE; + if(drop) + { + copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), + LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); + } + } + else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; + if(item && item->isComplete()) + { + accept = TRUE; + if(drop) + { + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + } + } + else + { + llwarns << "unhandled drag source" << llendl; + } + return accept; +} + +// +=================================================+ +// | 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); +} + +void LLTextureBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +} + +void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Texture Separator")); + items.push_back(std::string("Save As")); + } + hide_context_entries(menu, items, disabled_items); +} + +// virtual +void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("save_as" == action) + { + LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID); + if (preview_texture) + { + preview_texture->openToSave(); + } + } + else LLItemBridge::performAction(folder, 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(); + + 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() +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + send_sound_trigger(item->getAssetUUID(), 1.0); + } +} + +void LLSoundBridge::openSoundPreview(void* which) +{ + LLSoundBridge *me = (LLSoundBridge *)which; + LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES); +} + +void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLSoundBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Sound Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Sound Separator")); + items.push_back(std::string("Sound Play")); + + hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// | LLLandmarkBridge | +// +=================================================+ + +LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : +LLItemBridge(inventory, uuid) +{ + mVisited = FALSE; + if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + { + mVisited = TRUE; + } +} + +LLUIImagePtr LLLandmarkBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); +} + +void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Landmark Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Landmark Separator")); + items.push_back(std::string("About Landmark")); + + // Disable "About Landmark" menu item for + // multiple landmarks selected. Only one landmark + // info panel can be shown at a time. + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("About Landmark")); + } + + hide_context_entries(menu, items, disabled_items); +} + +// Convenience function for the two functions below. +void teleport_via_landmark(const LLUUID& asset_id) +{ + gAgent.teleportViaLandmark( asset_id ); + + // we now automatically track the landmark you're teleporting to + // because you'll probably arrive at a telehub instead + LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); + if( floater_world_map ) + { + floater_world_map->trackLandmark( asset_id ); + } +} + +// virtual +void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("teleport" == action) + { + LLViewerInventoryItem* item = getItem(); + if(item) + { + teleport_via_landmark(item->getAssetUUID()); + } + } + else if ("about" == action) + { + LLViewerInventoryItem* item = getItem(); + if(item) + { + LLSD key; + key["type"] = "landmark"; + key["id"] = item->getUUID(); + + LLSideTray::getInstance()->showPanel("panel_places", key); + } + } + else + { + LLItemBridge::performAction(folder, model, action); + } +} + +static bool open_landmark_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + + LLUUID asset_id = notification["payload"]["asset_id"].asUUID(); + if (option == 0) + { + teleport_via_landmark(asset_id); + } + + return false; +} +static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback); + + +void LLLandmarkBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + 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(); + LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); + } +*/ +} + + +// +=================================================+ +// | LLCallingCardObserver | +// +=================================================+ +void LLCallingCardObserver::changed(U32 mask) +{ + mBridgep->refreshFolderViewItem(); +} + +// +=================================================+ +// | LLCallingCardBridge | +// +=================================================+ + +LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : + LLItemBridge(inventory, uuid) +{ + mObserver = new LLCallingCardObserver(this); + LLAvatarTracker::instance().addObserver(mObserver); +} + +LLCallingCardBridge::~LLCallingCardBridge() +{ + LLAvatarTracker::instance().removeObserver(mObserver); + delete mObserver; +} + +void LLCallingCardBridge::refreshFolderViewItem() +{ + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL; + if (itemp) + { + itemp->refresh(); + } +} + +// virtual +void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("begin_im" == action) + { + LLViewerInventoryItem *item = getItem(); + if (item && (item->getCreatorUUID() != gAgent.getID()) && + (!item->getCreatorUUID().isNull())) + { + std::string callingcard_name; + gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); + LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } + } + } + else if ("lure" == action) + { + LLViewerInventoryItem *item = getItem(); + if (item && (item->getCreatorUUID() != gAgent.getID()) && + (!item->getCreatorUUID().isNull())) + { + LLAvatarActions::offerTeleport(item->getCreatorUUID()); + } + } + else LLItemBridge::performAction(folder, model, action); +} + +LLUIImagePtr LLCallingCardBridge::getIcon() const +{ + BOOL online = FALSE; + LLViewerInventoryItem* item = getItem(); + if(item) + { + online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); + } + return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); +} + +std::string LLCallingCardBridge::getLabelSuffix() const +{ + LLViewerInventoryItem* item = getItem(); + if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) ) + { + return LLItemBridge::getLabelSuffix() + " (online)"; + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +void LLCallingCardBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if(item && !item->getCreatorUUID().isNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } +*/ +} + +void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + LLInventoryItem* item = getItem(); + BOOL good_card = (item + && (LLUUID::null != item->getCreatorUUID()) + && (item->getCreatorUUID() != gAgent.getID())); + BOOL 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...")); + items.push_back(std::string("Conference Chat")); + + if (!good_card) + { + disabled_items.push_back(std::string("Send Instant Message")); + } + if (!good_card || !user_online) + { + disabled_items.push_back(std::string("Offer Teleport...")); + disabled_items.push_back(std::string("Conference Chat")); + } + } + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + LLViewerInventoryItem* item = getItem(); + BOOL rv = FALSE; + if(item) + { + // 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: + { + LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; + const LLPermissions& perm = inv_item->getPermissions(); + if(gInventory.getItem(inv_item->getUUID()) + && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) + { + rv = TRUE; + if(drop) + { + LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), + (LLInventoryItem*)cargo_data); + } + } + else + { + // It's not in the user's inventory (it's probably in + // an object's contents), so disallow dragging it here. + // You can't give something you don't yet have. + rv = FALSE; + } + break; + } + case DAD_CATEGORY: + { + LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; + if( gInventory.getCategory( inv_cat->getUUID() ) ) + { + rv = TRUE; + if(drop) + { + LLToolDragAndDrop::giveInventoryCategory( + item->getCreatorUUID(), + inv_cat); + } + } + else + { + // It's not in the user's inventory (it's probably in + // an object's contents), so disallow dragging it here. + // You can't give something you don't yet have. + rv = FALSE; + } + break; + } + default: + break; + } + } + return rv; +} + +BOOL LLCallingCardBridge::removeItem() +{ + if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem())) + { + LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID()); + return FALSE; + } + else + { + return LLItemBridge::removeItem(); + } +} +// +=================================================+ +// | 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) ) + { + return LLFontGL::BOLD; + } + else + { + return LLFontGL::NORMAL; + } +} + +std::string LLGestureBridge::getLabelSuffix() const +{ + if( LLGestureManager::instance().isGestureActive(mUUID) ) + { + return LLItemBridge::getLabelSuffix() + " (active)"; + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +// virtual +void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("activate" == action) + { + LLGestureManager::instance().activateGesture(mUUID); + + LLViewerInventoryItem* item = gInventory.getItem(mUUID); + if (!item) return; + + // Since we just changed the suffix to indicate (active) + // the server doesn't need to know, just the viewer. + gInventory.updateItem(item); + gInventory.notifyObservers(); + } + else if ("deactivate" == action) + { + LLGestureManager::instance().deactivateGesture(mUUID); + + LLViewerInventoryItem* item = gInventory.getItem(mUUID); + if (!item) return; + + // Since we just changed the suffix to indicate (active) + // the server doesn't need to know, just the viewer. + gInventory.updateItem(item); + gInventory.notifyObservers(); + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLGestureBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } +*/ +} + +BOOL LLGestureBridge::removeItem() +{ + // Force close the preview window, if it exists + LLGestureManager::instance().deactivateGesture(mUUID); + return LLItemBridge::removeItem(); +} + +void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + LLInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + items.push_back(std::string("Find Original")); + } + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Gesture Separator")); + items.push_back(std::string("Activate")); + items.push_back(std::string("Deactivate")); + } + hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// | LLAnimationBridge | +// +=================================================+ + +LLUIImagePtr LLAnimationBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); +} + +void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Animation Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Animation Separator")); + items.push_back(std::string("Animation Play")); + items.push_back(std::string("Animation Audition")); + + hide_context_entries(menu, items, disabled_items); + +} + +// virtual +void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ((action == "playworld") || (action == "playlocal")) + { + if (getItem()) + { + LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE; + if ("playworld" == action) activate = LLPreviewAnim::PLAY; + if ("playlocal" == action) activate = LLPreviewAnim::AUDITION; + + LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID)); + if (preview) + { + preview->activate(activate); + } + } + } + else + { + LLItemBridge::performAction(folder, model, action); + } +} + +void LLAnimationBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } +*/ +} + +// +=================================================+ +// | LLObjectBridge | +// +=================================================+ + +// static +LLUUID LLObjectBridge::sContextMenuItemID; + +LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : +LLItemBridge(inventory, uuid), mInvType(type) +{ + mAttachPt = (flags & 0xff); // low bye of inventory flags + + mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; +} + +BOOL LLObjectBridge::isItemRemovable() +{ + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + if(avatar->isWearingAttachment(mUUID)) return FALSE; + return LLInvFVBridge::isItemRemovable(); +} + +LLUIImagePtr LLObjectBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); +} + +LLInventoryObject* LLObjectBridge::getObject() const +{ + LLInventoryObject* object = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + object = (LLInventoryObject*)model->getObject(mUUID); + } + return object; +} + +// virtual +void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("attach" == action) + { + LLUUID object_id = mUUID; + LLViewerInventoryItem* item; + item = (LLViewerInventoryItem*)gInventory.getItem(object_id); + if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) + { + rez_attachment(item, NULL); + } + else if(item && item->isComplete()) + { + // must be in library. copy it to our inventory and put it on. + LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + gFocusMgr.setKeyboardFocus(NULL); + } + else if ("detach" == action) + { + LLInventoryItem* item = gInventory.getItem(mUUID); + if(item) + { + gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + 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); + } + } + else LLItemBridge::performAction(folder, 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; + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar && avatar->isWearingAttachment( mUUID ) ) + { + font |= LLFontGL::BOLD; + } + + LLInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + font |= LLFontGL::ITALIC; + } + + return (LLFontGL::StyleFlags)font; +} + +std::string LLObjectBridge::getLabelSuffix() const +{ + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar && avatar->isWearingAttachment( mUUID ) ) + { + std::string attachment_point_name = avatar->getAttachedPointName(mUUID); + + // e.g. "(worn on ...)" / "(attached to ...)" + LLStringUtil::format_map_t args; + args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str(); + return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) +{ + LLSD payload; + payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. + + S32 attach_pt = 0; + if (gAgent.getAvatarObject() && attachment) + { + for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); + iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) + { + if (iter->second == attachment) + { + attach_pt = iter->first; + break; + } + } + } + + payload["attachment_point"] = attach_pt; + +#if !ENABLE_MULTIATTACHMENTS + if (attachment && attachment->getNumObjects() > 0) + { + LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); + } + else +#endif + { + LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/); + } +} + +bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) +{ + LLVOAvatar *avatarp = gAgent.getAvatarObject(); + + if (!avatarp->canAttachMoreObjects()) + { + LLSD args; + args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); + LLNotifications::instance().add("MaxAttachmentsOnOutfit", args); + return false; + } + + S32 option = LLNotification::getSelectedOption(notification, response); + if (option == 0/*YES*/) + { + LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); + + if (itemp) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); + msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); + U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); +#if ENABLE_MULTIATTACHMENTS + attachment_pt |= ATTACHMENT_ADD; +#endif + msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); + pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); + msg->addStringFast(_PREHASH_Name, itemp->getName()); + msg->addStringFast(_PREHASH_Description, itemp->getDescription()); + msg->sendReliable(gAgent.getRegion()->getHost()); + } + } + return false; +} +static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); + +void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + LLInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + items.push_back(std::string("Find Original")); + } + + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + LLObjectBridge::sContextMenuItemID = mUUID; + + if(item) + { + LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); + if( !avatarp ) + { + return; + } + + if( avatarp->isWearingAttachment( mUUID ) ) + { + items.push_back(std::string("Detach From Yourself")); + } + else + if( !isInTrash() && !isLinkedObjectInTrash() ) + { + items.push_back(std::string("Attach Separator")); + items.push_back(std::string("Object Wear")); + items.push_back(std::string("Attach To")); + items.push_back(std::string("Attach To HUD")); + // commented out for DEV-32347 + //items.push_back(std::string("Restore to Last Position")); + + if (!avatarp->canAttachMoreObjects()) + { + disabled_items.push_back(std::string("Object Wear")); + disabled_items.push_back(std::string("Attach To")); + disabled_items.push_back(std::string("Attach To HUD")); + } + 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) + { + 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; + LLMenuItemCallGL::Params p; + std::string submenu_name = attachment->getName(); + if (LLTrans::getString(submenu_name) != "") + { + p.name = (" ")+LLTrans::getString(submenu_name)+" "; + } + else + { + p.name = submenu_name; + } + LLSD cbparams; + cbparams["index"] = curiter->first; + cbparams["label"] = attachment->getName(); + p.on_click.function_name = "Inventory.AttachObject"; + p.on_click.parameter = LLSD(attachment->getName()); + p.on_enable.function_name = "Attachment.Label"; + p.on_enable.parameter = cbparams; + LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; + LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); + } + } + } + } + } + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLObjectBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLPreview::dirty(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryItem* item = getItem(); + if(item && (item->getName() != new_name)) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + buildDisplayName(new_item, mDisplayName); + new_item->updateServer(FALSE); + model->updateItem(new_item); + + model->notifyObservers(); + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar ) + { + LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); + if( obj ) + { + LLSelectMgr::getInstance()->deselectAll(); + LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); + LLSelectMgr::getInstance()->selectionSetObjectName( new_name ); + LLSelectMgr::getInstance()->deselectAll(); + } + } + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + +// +=================================================+ +// | LLLSLTextBridge | +// +=================================================+ + +LLUIImagePtr LLLSLTextBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + +void LLLSLTextBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + 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 ) +{ + 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())); + } +} + +void remove_inventory_category_from_avatar( LLInventoryCategory* category ) +{ + if(!category) return; + lldebugs << "remove_inventory_category_from_avatar( " << category->getName() + << " )" << llendl; + + + if( gFloaterCustomize ) + { + gFloaterCustomize->askToSaveIfDirty( + boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); + } + else + { + remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); + } +} + +struct OnRemoveStruct +{ + LLUUID mUUID; + OnRemoveStruct(const LLUUID& uuid): + mUUID(uuid) + { + } +}; + +void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) +{ + + // Find all the wearables that are in the category's subtree. + lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; + if(proceed) + { + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + LLFindWearables is_wearable; + gInventory.collectDescendentsIf(category_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_wearable); + S32 i; + S32 wearable_count = item_array.count(); + + LLInventoryModel::cat_array_t obj_cat_array; + LLInventoryModel::item_array_t obj_item_array; + LLIsType is_object( LLAssetType::AT_OBJECT ); + gInventory.collectDescendentsIf(category_id, + obj_cat_array, + obj_item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_object); + S32 obj_count = obj_item_array.count(); + + // Find all gestures in this folder + LLInventoryModel::cat_array_t gest_cat_array; + LLInventoryModel::item_array_t gest_item_array; + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + gInventory.collectDescendentsIf(category_id, + gest_cat_array, + gest_item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_gesture); + S32 gest_count = gest_item_array.count(); + + if (wearable_count > 0) //Loop through wearables. If worn, remove. + { + for(i = 0; i < wearable_count; ++i) + { + if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) ) + { + LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(), + item_array.get(i)->getName(), + item_array.get(i)->getType(), + LLWearableBridge::onRemoveFromAvatarArrived, + new OnRemoveStruct(item_array.get(i)->getUUID())); + + } + } + } + + + if (obj_count > 0) + { + for(i = 0; i < obj_count; ++i) + { + gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() ); + + 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( obj_item_array.get(i)->getUUID()); + if (found_obj) + { + LLSelectMgr::getInstance()->remove(found_obj); + } + } + } + + if (gest_count > 0) + { + for(i = 0; i < gest_count; ++i) + { + if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) ) + { + LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() ); + gInventory.updateItem( gest_item_array.get(i) ); + gInventory.notifyObservers(); + } + + } + } + } +} + +BOOL LLWearableBridge::renameItem(const std::string& new_name) +{ + if( gAgentWearables.isWearingItem( mUUID ) ) + { + gAgentWearables.setWearableName( mUUID, new_name ); + } + return LLItemBridge::renameItem(new_name); +} + +BOOL LLWearableBridge::isItemRemovable() +{ + if (gAgentWearables.isWearingItem(mUUID)) return FALSE; + return LLInvFVBridge::isItemRemovable(); +} + +std::string LLWearableBridge::getLabelSuffix() const +{ + if( gAgentWearables.isWearingItem( mUUID ) ) + { + // e.g. "(worn)" + return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +LLUIImagePtr LLWearableBridge::getIcon() const +{ + return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); +} + +// virtual +void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("wear" == action) + { + wearOnAvatar(); + } + else if ("wear_add" == action) + { + wearAddOnAvatar(); + } + else if ("edit" == action) + { + editOnAvatar(); + return; + } + else if ("take_off" == action) + { + if(gAgentWearables.isWearingItem(mUUID)) + { + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + LLWearableBridge::onRemoveFromAvatarArrived, + new OnRemoveStruct(mUUID)); + } + } + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLWearableBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + /* + if( isInTrash() ) + { + LLNotifications::instance().add("CannotWearTrash"); + } + else if(isAgentInventory()) + { + if( !gAgentWearables.isWearingItem( 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. + LLNotifications::instance().add("CannotWearInfoNotComplete"); + } + } + */ +} + +void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere + BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM); + + // If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976 + LLViewerInventoryItem* item = getItem(); + if( !no_open && item ) + { + no_open = (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART); + } + if (!no_open) + { + items.push_back(std::string("Open")); + } + + if (item && item->getIsLinkType()) + { + items.push_back(std::string("Find Original")); + } + + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Wearable Separator")); + + items.push_back(std::string("Wearable Wear")); + items.push_back(std::string("Wearable Add")); + items.push_back(std::string("Wearable Edit")); + + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Wearable Edit")); + } + // Don't allow items to be worn if their baseobj is in the trash. + if (isLinkedObjectInTrash()) + { + disabled_items.push_back(std::string("Wearable Wear")); + disabled_items.push_back(std::string("Wearable Add")); + disabled_items.push_back(std::string("Wearable Edit")); + } + + // Disable wear and take off based on whether the item is worn. + if(item) + { + switch (item->getType()) + { + case LLAssetType::AT_CLOTHING: + items.push_back(std::string("Take Off")); + case LLAssetType::AT_BODYPART: + if (gAgentWearables.isWearingItem(item->getUUID())) + { + disabled_items.push_back(std::string("Wearable Wear")); + disabled_items.push_back(std::string("Wearable Add")); + } + else + { + disabled_items.push_back(std::string("Take Off")); + } + break; + default: + break; + } + } + } + hide_context_entries(menu, items, disabled_items); +} + +// Called from menus +// static +BOOL LLWearableBridge::canWearOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return FALSE; + if(!self->isAgentInventory()) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); + if(!item || !item->isComplete()) return FALSE; + } + return (!gAgentWearables.isWearingItem(self->mUUID)); +} + +// Called from menus +// static +void LLWearableBridge::onWearOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return; + self->wearOnAvatar(); +} + +void LLWearableBridge::wearOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + 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); + } + } +} + +void LLWearableBridge::wearAddOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + 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); + } + } +} + +// static +void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ + LLUUID* item_id = (LLUUID*) userdata; + if(wearable) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); + if(item) + { + if(item->getAssetUUID() == wearable->getAssetID()) + { + gAgentWearables.setWearableItem(item, wearable); + gInventory.notifyObservers(); + //self->getFolderItem()->refreshFromRoot(); + } + else + { + llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; + } + } + } + delete item_id; +} + +// static +// BAP remove the "add" code path once everything is fully COF-ified. +void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ + LLUUID* item_id = (LLUUID*) userdata; + if(wearable) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); + if(item) + { + if(item->getAssetUUID() == wearable->getAssetID()) + { + bool do_append = true; + gAgentWearables.setWearableItem(item, wearable, do_append); + gInventory.notifyObservers(); + //self->getFolderItem()->refreshFromRoot(); + } + else + { + llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; + } + } + } + delete item_id; +} + +// static +BOOL LLWearableBridge::canEditOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return FALSE; + + return (gAgentWearables.isWearingItem(self->mUUID)); +} + +// static +void LLWearableBridge::onEditOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(self) + { + self->editOnAvatar(); + } +} + +void LLWearableBridge::editOnAvatar() +{ + const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); + 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(); + } + } +} + +// static +BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) + { + return gAgentWearables.isWearingItem( self->mUUID ); + } + return FALSE; +} + +// static +void LLWearableBridge::onRemoveFromAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return; + if(gAgentWearables.isWearingItem(self->mUUID)) + { + LLViewerInventoryItem* item = self->getItem(); + if (item) + { + LLUUID parent_id = item->getParentUUID(); + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + onRemoveFromAvatarArrived, + new OnRemoveStruct(LLUUID(self->mUUID))); + } + } +} + +// static +void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, + void* userdata) +{ + OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; + const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); + if(wearable) + { + if( gAgentWearables.isWearingItem( item_id ) ) + { + EWearableType type = wearable->getType(); + + if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& + //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) + { + // MULTI_WEARABLE: FIXME HACK - always remove all + bool do_remove_all = false; + gAgentWearables.removeWearable( type, do_remove_all, 0 ); + } + } + } + + // Find and remove this item from the COF. + LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF()); + llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. + 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); + } + gInventory.notifyObservers(); + + delete on_remove_struct; +} + +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; + + 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; + } + return action; +} + +//static +void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, + const LLUUID& uuid,LLInventoryModel* model) +{ + LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); + if(action) + { + action->doIt(); + delete action; + } +} + +//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) + { + action->doIt(); + delete action; + } +} + +LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const +{ + if(mModel) + return (LLViewerInventoryItem*)mModel->getItem(mUUID); + return NULL; +} + +//virtual +void LLTextureBridgeAction::doIt() +{ + if (getItem()) + { + LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLSoundBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLLandmarkBridgeAction::doIt() +{ + 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(); + LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLCallingCardBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if(item && item->getCreatorUUID().notNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void +LLNotecardBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLGestureBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLAnimationBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLObjectBridgeAction::doIt() +{ + LLFloaterReg::showInstance("properties", mUUID); + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLLSLTextBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +BOOL LLWearableBridgeAction::isInTrash() const +{ + if(!mModel) return FALSE; + const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); + return mModel->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLWearableBridgeAction::isAgentInventory() const +{ + if(!mModel) return FALSE; + if(gInventory.getRootFolderID() == mUUID) return TRUE; + return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +void LLWearableBridgeAction::wearOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + 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); + } + } +} + +//virtual +void LLWearableBridgeAction::doIt() +{ + if(isInTrash()) + { + LLNotifications::instance().add("CannotWearTrash"); + } + else if(isAgentInventory()) + { + if(!gAgentWearables.isWearingItem(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. + LLNotifications::instance().add("CannotWearInfoNotComplete"); + } + } + + LLInvFVBridgeAction::doIt(); +} + +// +=================================================+ +// | LLLinkItemBridge | +// +=================================================+ +// For broken links + +std::string LLLinkItemBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkItemBridge::getIcon() const +{ + if (LLViewerInventoryItem *item = getItem()) + { + return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE); + } + return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); +} + +void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + } + hide_context_entries(menu, items, disabled_items); +} + + +// +=================================================+ +// | LLLinkBridge | +// +=================================================+ +// For broken links. + +std::string LLLinkFolderBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkFolderBridge::getIcon() const +{ + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; + if (LLViewerInventoryItem *item = getItem()) + { + if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) + { + preferred_type = cat->getPreferredType(); + } + } + return LLFolderBridge::getIcon(preferred_type); +} + +void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Find Original")); + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + } + hide_context_entries(menu, items, disabled_items); +} + +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; +} diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3ffeb55d6cfc7971f1afc90f1eac74f8ca6e92e7..49e64ebdded888521e3449f5d84bf5aad401da3f 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -33,14 +33,16 @@ #ifndef LL_LLINVENTORYBRIDGE_H #define LL_LLINVENTORYBRIDGE_H -#include "llfloaterproperties.h" -#include "llwearable.h" -#include "llviewercontrol.h" #include "llcallingcard.h" -#include "llinventorymodel.h" +#include "llfloaterproperties.h" #include "llfoldervieweventlistener.h" +#include "llinventorymodel.h" +#include "llinventoryobserver.h" +#include "llviewercontrol.h" +#include "llwearable.h" class LLInventoryPanel; +class LLInventoryModel; class LLMenuGL; enum EInventoryIcon @@ -105,22 +107,6 @@ struct LLAttachmentRezAction S32 mAttachPt; }; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryPanelObserver -// -// Bridge to support knowing when the inventory has changed. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryPanelObserver : public LLInventoryObserver -{ -public: - LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {} - virtual ~LLInventoryPanelObserver() {} - virtual void changed(U32 mask); -protected: - LLInventoryPanel* mIP; -}; - const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type); void hide_context_entries(LLMenuGL& menu, const std::vector<std::string> &entries_to_show, @@ -218,8 +204,6 @@ class LLInvFVBridge : public LLFolderViewEventListener const LLUUID& new_parent, BOOL restamp); void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch); - void renameLinkedItems(const LLUUID &item_id, const std::string& new_name); - protected: LLHandle<LLPanel> mInventoryPanel; const LLUUID mUUID; // item id diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 7ec8d3d0034cd09699e059bf8c54b14ecec95e67..085c96c93ddf9119a52d69803510147b99c8cf60 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -100,13 +100,18 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item) bool passed_type = false; if (mFilterOps.mFilterForCategories) { - if (listener->getInventoryType() == LLInventoryType::IT_CATEGORY) + // Pass if this item is a category of the filter type, or + // if its parent is a category of the filter type. + LLUUID uuid = listener->getUUID(); + if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY) { - LLViewerInventoryCategory *cat = gInventory.getCategory(listener->getUUID()); - if (cat) - { - passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0)); - } + const LLInventoryObject *obj = gInventory.getObject(uuid); + uuid = obj->getParentUUID(); + } + LLViewerInventoryCategory *cat = gInventory.getCategory(uuid); + if (cat) + { + passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0)); } } else diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 4b7e364cf9364812fa3f4911f5dc62717796f4a6..fbaab385feddd0233469e4594f02247ad13caae0 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -31,40 +31,25 @@ */ #include "llviewerprecompiledheaders.h" - #include "llinventorymodel.h" -#include "llassetstorage.h" -#include "llcrc.h" -#include "lldir.h" -#include "llsys.h" -#include "llxfermanager.h" -#include "message.h" - #include "llagent.h" #include "llagentwearables.h" -#include "llfloater.h" -#include "llfocusmgr.h" -#include "llinventorybridge.h" -#include "llinventoryfunctions.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" -#include "llviewerfoldertype.h" -#include "llviewerinventory.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventoryobserver.h" +#include "llwindow.h" +#include "llviewercontrol.h" +#include "llpreview.h" #include "llviewermessage.h" +#include "llviewerfoldertype.h" #include "llviewerwindow.h" -#include "llviewerregion.h" #include "llappviewer.h" -#include "lldbstrings.h" -#include "llviewerstats.h" -#include "llmutelist.h" -#include "llnotifications.h" +#include "llviewerregion.h" #include "llcallbacklist.h" -#include "llpreview.h" -#include "llviewercontrol.h" #include "llvoavatarself.h" -#include "llsdutil.h" -#include <deque> //#define DIFF_INVENTORY_FILES #ifdef DIFF_INVENTORY_FILES @@ -176,6 +161,7 @@ LLInventoryModel::LLInventoryModel() mRootFolderID(), mLibraryRootFolderID(), mLibraryOwnerID(), + mIsNotifyObservers(FALSE), mIsAgentInvUsable(false) { } @@ -321,10 +307,10 @@ 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) +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library) { - const LLUUID &rv = findCatUUID(t); - if(rv.isNull() && isInventoryUsable() && create_folder) + 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()) @@ -337,10 +323,10 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bo // 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) const +const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const { - const LLUUID &root_id = gInventory.getRootFolderID(); - if(LLFolderType::FT_CATEGORY == preferred_type) + const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID(); + if(LLFolderType::FT_ROOT_INVENTORY == preferred_type) { return root_id; } @@ -523,7 +509,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, } } -void LLInventoryModel::updateLinkedItems(const LLUUID& object_id) +void LLInventoryModel::addChangedMaskForLinks(const LLUUID& object_id, U32 mask) { const LLInventoryObject *obj = getObject(object_id); if (!obj || obj->getIsLinkType()) @@ -537,13 +523,16 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id) item_array, LLInventoryModel::INCLUDE_TRASH, is_linked_item_match); - + if (cat_array.empty() && item_array.empty()) + { + return; + } for (LLInventoryModel::cat_array_t::iterator cat_iter = cat_array.begin(); cat_iter != cat_array.end(); cat_iter++) { LLViewerInventoryCategory *linked_cat = (*cat_iter); - addChangedMask(LLInventoryObserver::LABEL, linked_cat->getUUID()); + addChangedMask(mask, linked_cat->getUUID()); }; for (LLInventoryModel::item_array_t::iterator iter = item_array.begin(); @@ -551,9 +540,8 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id) iter++) { LLViewerInventoryItem *linked_item = (*iter); - addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); + addChangedMask(mask, linked_item->getUUID()); }; - notifyObservers(); } const LLUUID& LLInventoryModel::getLinkedItemID(const LLUUID& object_id) const @@ -639,6 +627,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) new_item = old_item; LLUUID old_parent_id = old_item->getParentUUID(); LLUUID new_parent_id = item->getParentUUID(); + if(old_parent_id != new_parent_id) { // need to update the parent-child tree @@ -881,7 +870,8 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id) // Delete a particular inventory object by ID. void LLInventoryModel::deleteObject(const LLUUID& id) { - purgeLinkedObjects(id); + // Disabling this; let users manually purge linked objects. + // purgeLinkedObjects(id); lldebugs << "LLInventoryModel::deleteObject()" << llendl; LLPointer<LLInventoryObject> obj = getObject(id); if(obj) @@ -918,13 +908,14 @@ void LLInventoryModel::deleteObject(const LLUUID& id) } addChangedMask(LLInventoryObserver::REMOVE, id); obj = NULL; // delete obj + gInventory.notifyObservers(); } } // Delete a particular inventory item by ID, and remove it from the server. void LLInventoryModel::purgeObject(const LLUUID &id) { - lldebugs << "LLInventoryModel::purgeObject()" << llendl; + lldebugs << "LLInventoryModel::purgeObject() [ id: " << id << " ] " << llendl; LLPointer<LLInventoryObject> obj = getObject(id); if(obj) { @@ -1133,6 +1124,23 @@ BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer) const // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328] void LLInventoryModel::notifyObservers(const std::string service_name) { + if (mIsNotifyObservers) + { + // Within notifyObservers, something called notifyObservers + // again. This type of recursion is unsafe because it causes items to be + // processed twice, and this can easily lead to infinite loops. + llwarns << "Call was made to notifyObservers within notifyObservers!" << llendl; + return; + } + + if ((mModifyMask == LLInventoryObserver::NONE) && (service_name == "")) + { + mModifyMask = LLInventoryObserver::NONE; + mChangedItemIDs.clear(); + return; + } + + mIsNotifyObservers = TRUE; for (observer_list_t::iterator iter = mObservers.begin(); iter != mObservers.end(); ) { @@ -1154,12 +1162,21 @@ void LLInventoryModel::notifyObservers(const std::string service_name) mModifyMask = LLInventoryObserver::NONE; mChangedItemIDs.clear(); + mIsNotifyObservers = FALSE; } // store flag for change // and id of object change applies to void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent) { + if (mIsNotifyObservers) + { + // Something marked an item for change within a call to notifyObservers + // (which is in the process of processing the list of items marked for change). + // This means the change may fail to be processed. + llwarns << "Adding changed mask within notify observers! Change will likely be lost." << llendl; + } + mModifyMask |= mask; if (referent.notNull()) { @@ -1170,7 +1187,7 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent) // not sure what else might need to be accounted for this. if (mModifyMask & LLInventoryObserver::LABEL) { - updateLinkedItems(referent); + addChangedMaskForLinks(referent, LLInventoryObserver::LABEL); } } @@ -1189,7 +1206,7 @@ void LLInventoryModel::mock(const LLUUID& root_id) root_id, LLUUID::null, LLAssetType::AT_CATEGORY, - LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_CATEGORY), + LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_INVENTORY), gAgent.getID()); addCategory(cat); gInventory.buildParentChildMap(); @@ -1271,8 +1288,11 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) { - if(folder_id.isNull()) return false; - + if(folder_id.isNull()) + { + llwarns << "Calling fetch descendents on NULL folder id!" << llendl; + return false; + } LLViewerInventoryCategory* cat = getCategory(folder_id); if(!cat) { @@ -1830,13 +1850,13 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item) { //llinfos << "LLInventoryModel::addItem()" << llendl; - - // This can happen if assettype enums change. This can be a backwards compatibility issue - // in some viewer prototypes prior to when the AT_LINK enum changed from 23 to 24. + // 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; + llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl; return; } if(item) @@ -1845,7 +1865,7 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item) // 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; + llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl; } mItemMap[item->getUUID()] = item; } @@ -2173,7 +2193,7 @@ bool LLInventoryModel::loadSkeleton( // Add all the items loaded which are parented to a // category with a correctly cached parent - count = items.count(); + S32 bad_link_count = 0; cat_map_t::iterator unparented = mCategoryMap.end(); for(item_array_t::const_iterator item_iter = items.begin(); item_iter != items.end(); @@ -2190,7 +2210,11 @@ bool LLInventoryModel::loadSkeleton( // This can happen if the linked object's baseobj is removed from the cache but the linked object is still in the cache. if (item->getIsBrokenLink()) { - llinfos << "Attempted to add cached link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ). Ignoring and invalidating " << cat->getName() << " . " << llendl; + bad_link_count++; + lldebugs << "Attempted to add cached link item without baseobj present ( name: " + << item->getName() << " itemID: " << item->getUUID() + << " assetID: " << item->getAssetUUID() + << " ). Ignoring and invalidating " << cat->getName() << " . " << llendl; invalid_categories.insert(cit->second); continue; } @@ -2200,6 +2224,12 @@ bool LLInventoryModel::loadSkeleton( } } } + if (bad_link_count > 0) + { + llinfos << "Attempted to add " << bad_link_count + << " cached link items without baseobj present. " + << "The corresponding categories were invalidated." << llendl; + } } else { @@ -2427,7 +2457,7 @@ void LLInventoryModel::buildParentChildMap() { cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); } - else if(LLFolderType::FT_CATEGORY == pref) + else if(LLFolderType::FT_ROOT_INVENTORY == pref) { // it's the root cat->setParent(LLUUID::null); @@ -3304,6 +3334,12 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**) for(i = 0; i < count; ++i) { titem->unpackMessage(msg, _PREHASH_ItemData, i); + // If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added. + if (gInventory.getItem(titem->getUUID())) + { + lldebugs << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl; + continue; + } gInventory.updateItem(titem); } @@ -3679,513 +3715,6 @@ bool LLNameCategoryCollector::operator()( return false; } - - -///---------------------------------------------------------------------------- -/// Observers -///---------------------------------------------------------------------------- - -void LLInventoryCompletionObserver::changed(U32 mask) -{ - // scan through the incomplete items and move or erase them as - // appropriate. - if(!mIncomplete.empty()) - { - for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) - { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if(!item) - { - it = mIncomplete.erase(it); - continue; - } - if(item->isComplete()) - { - mComplete.push_back(*it); - it = mIncomplete.erase(it); - continue; - } - ++it; - } - if(mIncomplete.empty()) - { - done(); - } - } -} - -void LLInventoryCompletionObserver::watchItem(const LLUUID& id) -{ - if(id.notNull()) - { - mIncomplete.push_back(id); - } -} - - -void LLInventoryFetchObserver::changed(U32 mask) -{ - // scan through the incomplete items and move or erase them as - // appropriate. - if(!mIncomplete.empty()) - { - for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) - { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if(!item) - { - // 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); - 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(); -} - -void fetch_items_from_llsd(const LLSD& items_llsd) -{ - if (!items_llsd.size()) return; - LLSD body; - body[0]["cap_name"] = "FetchInventory"; - body[1]["cap_name"] = "FetchLib"; - for (S32 i=0; i<items_llsd.size();i++) - { - if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString()) - { - body[0]["items"].append(items_llsd[i]); - continue; - } - if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString()) - { - body[1]["items"].append(items_llsd[i]); - continue; - } - } - - for (S32 i=0; i<body.size(); i++) - { - if (0 >= body[i].size()) continue; - std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString()); - - if (!url.empty()) - { - body[i]["agent_id"] = gAgent.getID(); - LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i])); - break; - } - - LLMessageSystem* msg = gMessageSystem; - BOOL start_new_message = TRUE; - for (S32 j=0; j<body[i]["items"].size(); j++) - { - LLSD item_entry = body[i]["items"][j]; - if(start_new_message) - { - start_new_message = FALSE; - msg->newMessageFast(_PREHASH_FetchInventory); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - } - 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)) - { - start_new_message = TRUE; - gAgent.sendReliableMessage(); - } - } - if(!start_new_message) - { - gAgent.sendReliableMessage(); - } - } -} - -void LLInventoryFetchObserver::fetchItems( - const LLInventoryFetchObserver::item_ref_t& ids) -{ - LLUUID owner_id; - LLSD items_llsd; - for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it) - { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if(item) - { - if(item->isComplete()) - { - // It's complete, so put it on the complete container. - mComplete.push_back(*it); - continue; - } - else - { - owner_id = item->getPermissions().getOwner(); - } - } - else - { - // assume it's agent inventory. - owner_id = gAgent.getID(); - } - - // It's incomplete, so put it on the incomplete container, and - // pack this on the message. - mIncomplete.push_back(*it); - - // Prepare the data to fetch - LLSD item_entry; - item_entry["owner_id"] = owner_id; - item_entry["item_id"] = (*it); - items_llsd.append(item_entry); - } - fetch_items_from_llsd(items_llsd); -} - -// virtual -void LLInventoryFetchDescendentsObserver::changed(U32 mask) -{ - for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) - { - LLViewerInventoryCategory* cat = gInventory.getCategory(*it); - if(!cat) - { - it = mIncompleteFolders.erase(it); - continue; - } - if(isComplete(cat)) - { - mCompleteFolders.push_back(*it); - it = mIncompleteFolders.erase(it); - continue; - } - ++it; - } - if(mIncompleteFolders.empty()) - { - done(); - } -} - -void LLInventoryFetchDescendentsObserver::fetchDescendents( - const folder_ref_t& ids) -{ - for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it) - { - LLViewerInventoryCategory* cat = gInventory.getCategory(*it); - if(!cat) continue; - if(!isComplete(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. - } - else - { - mCompleteFolders.push_back(*it); - } - } -} - -bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const -{ - return mIncompleteFolders.empty(); -} - -bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat) -{ - S32 version = cat->getVersion(); - S32 descendents = cat->getDescendentCount(); - if((LLViewerInventoryCategory::VERSION_UNKNOWN == version) - || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents)) - { - 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) - { - // bit of a hack - pretend we're done if they are gone or - // incomplete. should never know, but it would suck if this - // kept tight looping because of a corrupt memory state. - return true; - } - S32 known = cats->count() + items->count(); - if(descendents == known) - { - // hey - we're done. - return true; - } - return false; -} - -void LLInventoryFetchComboObserver::changed(U32 mask) -{ - 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()) - { - for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.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; - } - } - if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty()) - { - mDone = true; - done(); - } -} - -void LLInventoryFetchComboObserver::fetch( - const folder_ref_t& folder_ids, - const item_ref_t& item_ids) -{ - 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; - } - } - - // 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) - { - 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; - } - } - fetch_items_from_llsd(items_llsd); -} - -void LLInventoryExistenceObserver::watchItem(const LLUUID& id) -{ - if(id.notNull()) - { - mMIA.push_back(id); - } -} - -void LLInventoryExistenceObserver::changed(U32 mask) -{ - // scan through the incomplete items and move or erase them as - // appropriate. - if(!mMIA.empty()) - { - for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); ) - { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if(!item) - { - ++it; - continue; - } - mExist.push_back(*it); - it = mMIA.erase(it); - } - if(mMIA.empty()) - { - done(); - } - } -} - -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; - - std::string msg_name; - if (mMessageName.empty()) - { - msg_name = msg->getMessageName(); - } - else - { - msg_name = mMessageName; - } - - if (msg_name.empty()) - { - return; - } - - // We only want newly created inventory items. JC - if ( msg_name != "UpdateCreateInventoryItem") - { - return; - } - - LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; - S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); - for(S32 i = 0; i < num_blocks; ++i) - { - titem->unpackMessage(msg, _PREHASH_InventoryData, i); - if (!(titem->getUUID().isNull())) - { - //we don't do anything with null keys - mAdded.push_back(titem->getUUID()); - } - } - if (!mAdded.empty()) - { - done(); - } -} - -LLInventoryTransactionObserver::LLInventoryTransactionObserver( - const LLTransactionID& transaction_id) : - mTransactionID(transaction_id) -{ -} - -void LLInventoryTransactionObserver::changed(U32 mask) -{ - if(mask & LLInventoryObserver::ADD) - { - // This could be it - see if we are processing a bulk update - LLMessageSystem* msg = gMessageSystem; - 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) - { - // woo hoo, we found it - folder_ref_t folders; - item_ref_t items; - S32 count; - count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); - S32 i; - for(i = 0; i < count; ++i) - { - msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i); - if(id.notNull()) - { - folders.push_back(id); - } - } - count = msg->getNumberOfBlocksFast(_PREHASH_ItemData); - for(i = 0; i < count; ++i) - { - msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i); - if(id.notNull()) - { - items.push_back(id); - } - } - - // call the derived class the implements this method. - done(folders, items); - } - } - } -} - - ///---------------------------------------------------------------------------- /// LLAssetIDMatches ///---------------------------------------------------------------------------- diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index faf026887a91f2a90da901f12ab0aa0849ebd143..da12dbdf7fd06fb671cbd022abe3f83c5dc4ae28 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -41,40 +41,22 @@ #include "lluuid.h" #include "llpermissionsflags.h" #include "llstring.h" - #include <map> #include <set> #include <string> #include <vector> -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryObserver -// -// This class is designed to be a simple abstract base class which can -// relay messages when the inventory changes. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryObserver; +class LLInventoryObject; +class LLInventoryItem; +class LLInventoryCategory; +class LLViewerInventoryItem; +class LLViewerInventoryCategory; +class LLViewerInventoryItem; +class LLViewerInventoryCategory; +class LLMessageSystem; +class LLInventoryCollectFunctor; -class LLInventoryObserver -{ -public: - // This enumeration is a way to refer to what changed in a more - // human readable format. You can mask the value provided by - // chaged() to see if the observer is interested in the change. - enum - { - NONE = 0, - LABEL = 1, // name changed - INTERNAL = 2, // internal change, eg, asset uuid different - ADD = 4, // something added - REMOVE = 8, // something deleted - STRUCTURE = 16, // structural change, eg, item or folder moved - CALLING_CARD = 32, // online, grant status, cancel, etc change - ALL = 0xffffffff - }; - virtual ~LLInventoryObserver() {}; - virtual void changed(U32 mask) = 0; - std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] -}; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInventoryModel @@ -87,16 +69,6 @@ class LLInventoryObserver //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryObject; -class LLInventoryItem; -class LLInventoryCategory; -class LLViewerInventoryItem; -class LLViewerInventoryCategory; -class LLViewerInventoryItem; -class LLViewerInventoryCategory; -class LLMessageSystem; -class LLInventoryCollectFunctor; - class LLInventoryModel { public: @@ -195,8 +167,6 @@ class LLInventoryModel // Assumes item_id is itself not a linked item. item_array_t collectLinkedItems(const LLUUID& item_id, const LLUUID& start_folder_id = LLUUID::null); - // Updates all linked items pointing to this id. - void updateLinkedItems(const LLUUID& object_id); // Get the inventoryID that this item points to, else just return item_id const LLUUID& getLinkedItemID(const LLUUID& object_id) const; @@ -275,13 +245,12 @@ class LLInventoryModel // 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: This - // will create a new inventory category on the fly if one does not - // exist. - + // 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); + const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false); // Call this method when it's time to update everyone on a new // state, by default, the inventory model will not update @@ -432,7 +401,7 @@ class LLInventoryModel // // 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) const; + const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const; // Empty the entire contents void empty(); @@ -469,27 +438,19 @@ class LLInventoryModel bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting); + // Updates all linked items pointing to this id. + void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); + protected: cat_array_t* getUnlockedCatArray(const LLUUID& id); item_array_t* getUnlockedItemArray(const LLUUID& id); -protected: +private: // Variables used to track what has changed since the last notify. U32 mModifyMask; typedef std::set<LLUUID> changed_items_t; changed_items_t mChangedItemIDs; - // 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; - std::map<LLUUID, bool> mCategoryLock; std::map<LLUUID, bool> mItemLock; @@ -525,6 +486,21 @@ class LLInventoryModel // 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; public: // *NOTE: DEBUG functionality void dumpInventory() const; @@ -767,183 +743,5 @@ class LLFindWearables : public LLInventoryCollectFunctor LLInventoryItem* item); }; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryCompletionObserver -// -// 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. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryCompletionObserver : public LLInventoryObserver -{ -public: - LLInventoryCompletionObserver() {} - virtual void changed(U32 mask); - - void watchItem(const LLUUID& id); - -protected: - virtual void done() = 0; - - typedef std::vector<LLUUID> item_ref_t; - item_ref_t mComplete; - item_ref_t mIncomplete; -}; - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryFetchObserver -// -// 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. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryFetchObserver : public LLInventoryObserver -{ -public: - LLInventoryFetchObserver() {} - 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() = 0; - -protected: - item_ref_t mComplete; - item_ref_t mIncomplete; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// 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. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryFetchDescendentsObserver : public LLInventoryObserver -{ -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; - -protected: - bool isComplete(LLViewerInventoryCategory* cat); - folder_ref_t mIncompleteFolders; - folder_ref_t mCompleteFolders; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// 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. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -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); - - virtual void done() = 0; - -protected: - bool mDone; - folder_ref_t mCompleteFolders; - folder_ref_t mIncompleteFolders; - item_ref_t mCompleteItems; - item_ref_t mIncompleteItems; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// 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. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryExistenceObserver : public LLInventoryObserver -{ -public: - LLInventoryExistenceObserver() {} - virtual void changed(U32 mask); - - void watchItem(const LLUUID& id); - -protected: - virtual void done() = 0; - - typedef std::vector<LLUUID> item_ref_t; - item_ref_t mExist; - item_ref_t mMIA; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// 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. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryAddedObserver : public LLInventoryObserver -{ -public: - LLInventoryAddedObserver() : mAdded() {} - virtual void changed(U32 mask); - -protected: - virtual void done() = 0; - - typedef std::vector<LLUUID> item_ref_t; - item_ref_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. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLInventoryTransactionObserver : public LLInventoryObserver -{ -public: - LLInventoryTransactionObserver(const LLTransactionID& transaction_id); - 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; - - LLTransactionID mTransactionID; -}; - - #endif // LL_LLINVENTORYMODEL_H diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3ccf593d278a7fb10c7f5b8d62639aed9823e7e8 --- /dev/null +++ b/indra/newview/llinventoryobserver.cpp @@ -0,0 +1,564 @@ +/** + * @file llinventoryobserver.cpp + * @brief Implementation of the inventory observers 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 "llinventoryobserver.h" + +#include "llassetstorage.h" +#include "llcrc.h" +#include "lldir.h" +#include "llsys.h" +#include "llxfermanager.h" +#include "message.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llfloater.h" +#include "llfocusmgr.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llviewermessage.h" +#include "llviewerwindow.h" +#include "llviewerregion.h" +#include "llappviewer.h" +#include "lldbstrings.h" +#include "llviewerstats.h" +#include "llmutelist.h" +#include "llnotifications.h" +#include "llcallbacklist.h" +#include "llpreview.h" +#include "llviewercontrol.h" +#include "llvoavatarself.h" +#include "llsdutil.h" +#include <deque> + +void LLInventoryCompletionObserver::changed(U32 mask) +{ + // scan through the incomplete items and move or erase them as + // appropriate. + if(!mIncomplete.empty()) + { + for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) + { + LLViewerInventoryItem* item = gInventory.getItem(*it); + if(!item) + { + it = mIncomplete.erase(it); + continue; + } + if(item->isComplete()) + { + mComplete.push_back(*it); + it = mIncomplete.erase(it); + continue; + } + ++it; + } + if(mIncomplete.empty()) + { + done(); + } + } +} + +void LLInventoryCompletionObserver::watchItem(const LLUUID& id) +{ + if(id.notNull()) + { + mIncomplete.push_back(id); + } +} + + +void LLInventoryFetchObserver::changed(U32 mask) +{ + // scan through the incomplete items and move or erase them as + // appropriate. + if(!mIncomplete.empty()) + { + for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) + { + LLViewerInventoryItem* item = gInventory.getItem(*it); + if(!item) + { + // 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); + 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(); +} + +void fetch_items_from_llsd(const LLSD& items_llsd) +{ + if (!items_llsd.size()) return; + LLSD body; + body[0]["cap_name"] = "FetchInventory"; + body[1]["cap_name"] = "FetchLib"; + for (S32 i=0; i<items_llsd.size();i++) + { + if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString()) + { + body[0]["items"].append(items_llsd[i]); + continue; + } + if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString()) + { + body[1]["items"].append(items_llsd[i]); + continue; + } + } + + for (S32 i=0; i<body.size(); i++) + { + if (0 >= body[i].size()) continue; + std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString()); + + if (!url.empty()) + { + body[i]["agent_id"] = gAgent.getID(); + LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i])); + break; + } + + LLMessageSystem* msg = gMessageSystem; + BOOL start_new_message = TRUE; + for (S32 j=0; j<body[i]["items"].size(); j++) + { + LLSD item_entry = body[i]["items"][j]; + if(start_new_message) + { + start_new_message = FALSE; + msg->newMessageFast(_PREHASH_FetchInventory); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + } + 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)) + { + start_new_message = TRUE; + gAgent.sendReliableMessage(); + } + } + if(!start_new_message) + { + gAgent.sendReliableMessage(); + } + } +} + +void LLInventoryFetchObserver::fetchItems( + const LLInventoryFetchObserver::item_ref_t& ids) +{ + LLUUID owner_id; + LLSD items_llsd; + for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it) + { + LLViewerInventoryItem* item = gInventory.getItem(*it); + if(item) + { + if(item->isComplete()) + { + // It's complete, so put it on the complete container. + mComplete.push_back(*it); + continue; + } + else + { + owner_id = item->getPermissions().getOwner(); + } + } + else + { + // assume it's agent inventory. + owner_id = gAgent.getID(); + } + + // It's incomplete, so put it on the incomplete container, and + // pack this on the message. + mIncomplete.push_back(*it); + + // Prepare the data to fetch + LLSD item_entry; + item_entry["owner_id"] = owner_id; + item_entry["item_id"] = (*it); + items_llsd.append(item_entry); + } + fetch_items_from_llsd(items_llsd); +} + +// virtual +void LLInventoryFetchDescendentsObserver::changed(U32 mask) +{ + for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(*it); + if(!cat) + { + it = mIncompleteFolders.erase(it); + continue; + } + if(isComplete(cat)) + { + mCompleteFolders.push_back(*it); + it = mIncompleteFolders.erase(it); + continue; + } + ++it; + } + if(mIncompleteFolders.empty()) + { + done(); + } +} + +void LLInventoryFetchDescendentsObserver::fetchDescendents( + const folder_ref_t& ids) +{ + for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(*it); + if(!cat) continue; + if(!isComplete(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. + } + else + { + mCompleteFolders.push_back(*it); + } + } +} + +bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const +{ + return mIncompleteFolders.empty(); +} + +bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat) +{ + S32 version = cat->getVersion(); + S32 descendents = cat->getDescendentCount(); + if((LLViewerInventoryCategory::VERSION_UNKNOWN == version) + || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents)) + { + 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) + { + // bit of a hack - pretend we're done if they are gone or + // incomplete. should never know, but it would suck if this + // kept tight looping because of a corrupt memory state. + return true; + } + S32 known = cats->count() + items->count(); + if(descendents == known) + { + // hey - we're done. + return true; + } + return false; +} + +void LLInventoryFetchComboObserver::changed(U32 mask) +{ + 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()) + { + for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.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; + } + } + if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty()) + { + mDone = true; + done(); + } +} + +void LLInventoryFetchComboObserver::fetch( + const folder_ref_t& folder_ids, + const item_ref_t& item_ids) +{ + 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; + } + } + + // 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) + { + 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; + } + } + fetch_items_from_llsd(items_llsd); +} + +void LLInventoryExistenceObserver::watchItem(const LLUUID& id) +{ + if(id.notNull()) + { + mMIA.push_back(id); + } +} + +void LLInventoryExistenceObserver::changed(U32 mask) +{ + // scan through the incomplete items and move or erase them as + // appropriate. + if(!mMIA.empty()) + { + for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); ) + { + LLViewerInventoryItem* item = gInventory.getItem(*it); + if(!item) + { + ++it; + continue; + } + mExist.push_back(*it); + it = mMIA.erase(it); + } + if(mMIA.empty()) + { + done(); + } + } +} + +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; + + std::string msg_name; + if (mMessageName.empty()) + { + msg_name = msg->getMessageName(); + } + else + { + msg_name = mMessageName; + } + + if (msg_name.empty()) + { + return; + } + + // We only want newly created inventory items. JC + if ( msg_name != "UpdateCreateInventoryItem") + { + return; + } + + LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; + S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); + for(S32 i = 0; i < num_blocks; ++i) + { + titem->unpackMessage(msg, _PREHASH_InventoryData, i); + if (!(titem->getUUID().isNull())) + { + //we don't do anything with null keys + mAdded.push_back(titem->getUUID()); + } + } + if (!mAdded.empty()) + { + done(); + } +} + +LLInventoryTransactionObserver::LLInventoryTransactionObserver( + const LLTransactionID& transaction_id) : + mTransactionID(transaction_id) +{ +} + +void LLInventoryTransactionObserver::changed(U32 mask) +{ + if(mask & LLInventoryObserver::ADD) + { + // This could be it - see if we are processing a bulk update + LLMessageSystem* msg = gMessageSystem; + 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) + { + // woo hoo, we found it + folder_ref_t folders; + item_ref_t items; + S32 count; + count = msg->getNumberOfBlocksFast(_PREHASH_FolderData); + S32 i; + for(i = 0; i < count; ++i) + { + msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i); + if(id.notNull()) + { + folders.push_back(id); + } + } + count = msg->getNumberOfBlocksFast(_PREHASH_ItemData); + for(i = 0; i < count; ++i) + { + msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i); + if(id.notNull()) + { + items.push_back(id); + } + } + + // call the derived class the implements this method. + done(folders, items); + } + } + } +} diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h new file mode 100644 index 0000000000000000000000000000000000000000..e908506b337ef5d1454c94aa6c2f8ccb2af077d8 --- /dev/null +++ b/indra/newview/llinventoryobserver.h @@ -0,0 +1,249 @@ +/** + * @file llinventoryobserver.h + * @brief LLInventoryObserver 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_LLINVENTORYOBSERVERS_H +#define LL_LLINVENTORYOBSERVERS_H + +#include "lluuid.h" +#include <string> +#include <vector> + +class LLViewerInventoryCategory; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryObserver +// +// This class is designed to be a simple abstract base class which can +// relay messages when the inventory changes. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryObserver +{ +public: + // This enumeration is a way to refer to what changed in a more + // human readable format. You can mask the value provided by + // chaged() to see if the observer is interested in the change. + enum + { + NONE = 0, + LABEL = 1, // name changed + INTERNAL = 2, // internal change, eg, asset uuid different + ADD = 4, // something added + REMOVE = 8, // something deleted + STRUCTURE = 16, // structural change, eg, item or folder moved + CALLING_CARD = 32, // online, grant status, cancel, etc change + ALL = 0xffffffff + }; + virtual ~LLInventoryObserver() {}; + virtual void changed(U32 mask) = 0; + std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328] +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryCompletionObserver +// +// 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. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryCompletionObserver : public LLInventoryObserver +{ +public: + LLInventoryCompletionObserver() {} + virtual void changed(U32 mask); + + void watchItem(const LLUUID& id); + +protected: + virtual void done() = 0; + + typedef std::vector<LLUUID> item_ref_t; + item_ref_t mComplete; + item_ref_t mIncomplete; +}; + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryFetchObserver +// +// 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. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryFetchObserver : public LLInventoryObserver +{ +public: + LLInventoryFetchObserver() {} + 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: + item_ref_t mComplete; + item_ref_t mIncomplete; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// 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. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryFetchDescendentsObserver : public LLInventoryObserver +{ +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; + +protected: + bool isComplete(LLViewerInventoryCategory* cat); + folder_ref_t mIncompleteFolders; + folder_ref_t mCompleteFolders; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// 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. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +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); + + virtual void done() = 0; + +protected: + bool mDone; + folder_ref_t mCompleteFolders; + folder_ref_t mIncompleteFolders; + item_ref_t mCompleteItems; + item_ref_t mIncompleteItems; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// 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. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryExistenceObserver : public LLInventoryObserver +{ +public: + LLInventoryExistenceObserver() {} + virtual void changed(U32 mask); + + void watchItem(const LLUUID& id); + +protected: + virtual void done() = 0; + + typedef std::vector<LLUUID> item_ref_t; + item_ref_t mExist; + item_ref_t mMIA; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// 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. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryAddedObserver : public LLInventoryObserver +{ +public: + LLInventoryAddedObserver() : mAdded() {} + virtual void changed(U32 mask); + +protected: + virtual void done() = 0; + + typedef std::vector<LLUUID> item_ref_t; + item_ref_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. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryTransactionObserver : public LLInventoryObserver +{ +public: + LLInventoryTransactionObserver(const LLTransactionID& transaction_id); + 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; + + LLTransactionID mTransactionID; +}; + + +#endif // LL_LLINVENTORYOBSERVERS_H + diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 9a71e53441e9f9f8ec32ce8c3633f258ddf03c7f..327a735f7833274630c76389adb696a06f55660c 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1,907 +1,890 @@ -/* - * @file llinventorypanel.cpp - * @brief Implementation of the inventory panel and associated stuff. - * - * $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 <utility> // for std::pair<> - -#include "llinventorypanel.h" - -// Seraph TODO: Remove unnecessary headers - -// library includes -#include "llagent.h" -#include "llagentwearables.h" -#include "llcallingcard.h" -#include "llfloaterreg.h" -#include "llsdserialize.h" -#include "llfiltereditor.h" -#include "llspinctrl.h" -#include "llui.h" -#include "message.h" - -// newview includes -#include "llappearancemgr.h" -#include "llappviewer.h" -#include "llfirstuse.h" -#include "llfloaterchat.h" -#include "llfloatercustomize.h" -#include "llfocusmgr.h" -#include "llfolderview.h" -#include "llgesturemgr.h" -#include "lliconctrl.h" -#include "llimview.h" -#include "llinventorybridge.h" -#include "llinventoryclipboard.h" -#include "llinventorymodel.h" -#include "lllineeditor.h" -#include "llmenugl.h" -#include "llpreviewanim.h" -#include "llpreviewgesture.h" -#include "llpreviewnotecard.h" -#include "llpreviewscript.h" -#include "llpreviewsound.h" -#include "llpreviewtexture.h" -#include "llresmgr.h" -#include "llscrollbar.h" -#include "llscrollcontainer.h" -#include "llselectmgr.h" -#include "lltabcontainer.h" -#include "lltooldraganddrop.h" -#include "lluictrlfactory.h" -#include "llviewerfoldertype.h" -#include "llviewerinventory.h" -#include "llviewermessage.h" -#include "llviewerobjectlist.h" -#include "llviewerregion.h" -#include "llviewerwindow.h" -#include "llvoavatarself.h" -#include "llwearablelist.h" -#include "llimfloater.h" - -static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); - -const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder"); -const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder"); -const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string(""); -static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; - -LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : - LLPanel(p), - mInventoryObserver(NULL), - mFolders(NULL), - mScroller(NULL), - mSortOrderSetting(p.sort_order_setting), - mInventory(p.inventory), - mAllowMultiSelect(p.allow_multi_select), - mHasInventoryConnection(false), - mStartFolderString(p.start_folder), - mBuildDefaultHierarchy(true), - mInvFVBridgeBuilder(NULL) -{ - mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; - - // contex menu callbacks - mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); - 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)); - - setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor")); - setBackgroundVisible(TRUE); - setBackgroundOpaque(TRUE); -} - -BOOL LLInventoryPanel::postBuild() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); - - mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves - - // create root folder - { - LLRect folder_rect(0, - 0, - getRect().getWidth(), - 0); - LLFolderView::Params p; - p.name = getName(); - p.rect = folder_rect; - p.parent_panel = this; - mFolders = LLUICtrlFactory::create<LLFolderView>(p); - mFolders->setAllowMultiSelect(mAllowMultiSelect); - } - - mCommitCallbackRegistrar.popScope(); - - mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); - - // scroller - { - LLRect scroller_view_rect = getRect(); - scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); - LLScrollContainer::Params p; - p.name("Inventory Scroller"); - p.rect(scroller_view_rect); - p.follows.flags(FOLLOWS_ALL); - p.reserve_scroll_corner(true); - p.tab_stop(true); - mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); - } - addChild(mScroller); - mScroller->addChild(mFolders); - - mFolders->setScrollContainer(mScroller); - - // set up the callbacks from the inventory we're viewing, and then - // build everything. - mInventoryObserver = new LLInventoryPanelObserver(this); - mInventory->addObserver(mInventoryObserver); - - // determine the root folder, if any, so inventory contents show just the children - // of that folder (i.e. not including the folder itself). - const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); - - if ("INVENTORY" == mStartFolderString) - { - mStartFolderID = gInventory.getRootFolderID(); - } - else if ("LIBRARY" == mStartFolderString) - { - mStartFolderID = gInventory.getLibraryRootFolderID(); - } - else - { - mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); - } - - // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback - if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection) - { - rebuildViewsFor(mStartFolderID); - mHasInventoryConnection = true; - } - - // bit of a hack to make sure the inventory is open. - mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory"); - - if (mSortOrderSetting != INHERIT_SORT_ORDER) - { - setSortOrder(gSavedSettings.getU32(mSortOrderSetting)); - } - else - { - setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); - } - mFolders->setSortOrder(mFolders->getFilter()->getSortOrder()); - - return TRUE; -} - -LLInventoryPanel::~LLInventoryPanel() -{ - // should this be a global setting? - if (mFolders) - { - U32 sort_order = mFolders->getSortOrder(); - if (mSortOrderSetting != INHERIT_SORT_ORDER) - { - gSavedSettings.setU32(mSortOrderSetting, sort_order); - } - } - - // LLView destructor will take care of the sub-views. - mInventory->removeObserver(mInventoryObserver); - delete mInventoryObserver; - mScroller = NULL; -} - -LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed? -void LLInventoryPanel::draw() -{ - // select the desired item (in case it wasn't loaded when the selection was requested) - mFolders->updateSelection(); - LLPanel::draw(); -} - -LLInventoryFilter* LLInventoryPanel::getFilter() -{ - if (mFolders) return mFolders->getFilter(); - return NULL; -} - -void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories) -{ - mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories); -} - -void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) -{ - mFolders->getFilter()->setFilterPermissions(filter_perm_mask); -} - -void LLInventoryPanel::setFilterSubString(const std::string& string) -{ - mFolders->getFilter()->setFilterSubString(string); -} - -void LLInventoryPanel::setSortOrder(U32 order) -{ - mFolders->getFilter()->setSortOrder(order); - if (mFolders->getFilter()->isModified()) - { - mFolders->setSortOrder(order); - // try to keep selection onscreen, even if it wasn't to start with - mFolders->scrollToShowSelection(); - } -} - -void LLInventoryPanel::setSinceLogoff(BOOL sl) -{ - mFolders->getFilter()->setDateRangeLastLogoff(sl); -} - -void LLInventoryPanel::setHoursAgo(U32 hours) -{ - mFolders->getFilter()->setHoursAgo(hours); -} - -void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) -{ - mFolders->getFilter()->setShowFolderState(show); -} - -LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState() -{ - return mFolders->getFilter()->getShowFolderState(); -} - -static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh"); - -void LLInventoryPanel::modelChanged(U32 mask) -{ - LLFastTimer t2(FTM_REFRESH); - - bool handled = false; - - // inventory just initialized, do complete build - if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection) - { - rebuildViewsFor(mStartFolderID); - mHasInventoryConnection = true; - return; - } - - if(mask & LLInventoryObserver::LABEL) - { - handled = true; - // label change - empty out the display name for each object - // in this change set. - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - LLFolderViewItem* view = NULL; - LLInvFVBridge* bridge = NULL; - for (;id_it != id_end; ++id_it) - { - view = mFolders->getItemByID(*id_it); - if(view) - { - // request refresh on this item (also flags for filtering) - bridge = (LLInvFVBridge*)view->getListener(); - if(bridge) - { // Clear the display name first, so it gets properly re-built during refresh() - bridge->clearDisplayName(); - } - view->refresh(); - } - } - } - if((mask & (LLInventoryObserver::STRUCTURE - | LLInventoryObserver::ADD - | LLInventoryObserver::REMOVE)) != 0) - { - handled = true; - // Record which folders are open by uuid. - LLInventoryModel* model = getModel(); - if (model) - { - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - for (;id_it != id_end; ++id_it) - { - // sync view with model - LLInventoryObject* model_item = model->getObject(*id_it); - LLFolderViewItem* view_item = mFolders->getItemByID(*id_it); - - if (model_item) - { - if (!view_item) - { - // this object was just created, need to build a view for it - if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD) - { - llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl; - } - buildNewViews(*id_it); - - // select any newly created object - // that has the auto rename at top of folder - // root set - if(mFolders->getRoot()->needsAutoRename()) - { - setSelection(*id_it, FALSE); - } - } - else - { - // this object was probably moved, check its parent - if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE) - { - llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl; - } - - LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); - - // added check against NULL for cases when Inventory panel contains startFolder. - // in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself. - // this check is a fix for bug EXT-1859. - if (NULL != new_parent && view_item->getParentFolder() != new_parent) - { - view_item->getParentFolder()->extractItem(view_item); - view_item->addToFolder(new_parent, mFolders); - } -/* - on the other side in case Inventory Panel has content of the any folder - it is possible that item moved to some folder which is absent in current - Panel. For ex. removing item (via moving to trash). - In this case we need to check if new parent is other then inventory start folder - and simply remove its View from the hierarchy. - See details in EXT-2098. -*/ - // So, let check if item was moved into folder out of this Inventory Panel. - else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID) - { - view_item->getParentFolder()->extractItem(view_item); - } - } - } - else - { - if (view_item) - { - if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE) - { - llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl; - } - // item in view but not model, need to delete view - view_item->destroyView(); - } - else - { - llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl; - } - } - } - } - } - - if (!handled) - { - // it's a small change that only requires a refresh. - // *TODO: figure out a more efficient way to do the refresh - // since it is expensive on large inventories - mFolders->refresh(); - } -} - - -void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) -{ - LLFolderViewItem* old_view = NULL; - - // get old LLFolderViewItem - old_view = mFolders->getItemByID(id); - if (old_view && id.notNull()) - { - old_view->destroyView(); - } - - buildNewViews(id); -} - -void LLInventoryPanel::buildNewViews(const LLUUID& id) -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS); - LLFolderViewItem* itemp = NULL; - LLInventoryObject* objectp = NULL; - - // Don't add the start folder (the inventory panel will show contents - // beginning with the children of the starting folder, excluding the starting folder itself). - if (id != mStartFolderID) - { - objectp = gInventory.getObject(id); - if (objectp) - { - const LLUUID &parent_id = objectp->getParentUUID(); - // If this item's parent is the starting folder, then just add it to the top level (recall that - // the starting folder isn't actually represented in the view, parent_folder would be NULL in - // this case otherwise). - LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ? - mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id)); - - // This item exists outside the inventory's hierarchy, so don't add it. - if (!parent_folder) - { - return; - } - - if (objectp->getType() <= LLAssetType::AT_NONE || - objectp->getType() >= LLAssetType::AT_COUNT) - { - llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << - ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl; - return; - } - - if (objectp->getType() == LLAssetType::AT_CATEGORY && - objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) - { - LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(), - objectp->getType(), - LLInventoryType::IT_CATEGORY, - this, - objectp->getUUID()); - - if (new_listener) - { - LLFolderViewFolder::Params p; - p.name = new_listener->getDisplayName(); - p.icon = new_listener->getIcon(); - p.root = mFolders; - p.listener = new_listener; - LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p); - - folderp->setItemSortOrder(mFolders->getSortOrder()); - itemp = folderp; - } - } - else - { - // Build new view for item - LLInventoryItem* item = (LLInventoryItem*)objectp; - LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(), - item->getActualType(), - item->getInventoryType(), - this, - item->getUUID(), - item->getFlags()); - - if (new_listener) - { - LLFolderViewItem::Params params; - params.name(new_listener->getDisplayName()); - params.icon(new_listener->getIcon()); - params.creation_date(new_listener->getCreationDate()); - params.root(mFolders); - params.listener(new_listener); - params.rect(LLRect (0, 0, 0, 0)); - itemp = LLUICtrlFactory::create<LLFolderViewItem> (params); - } - } - - if (itemp) - { - itemp->addToFolder(parent_folder, mFolders); - } - } - } - - // If this is a folder, add the children of the folder and recursively add any - // child folders. - if ((id == mStartFolderID) || - (objectp && objectp->getType() == LLAssetType::AT_CATEGORY)) - { - LLViewerInventoryCategory::cat_array_t* categories; - LLViewerInventoryItem::item_array_t* items; - - mInventory->lockDirectDescendentArrays(id, categories, items); - if(categories) - { - S32 count = categories->count(); - for(S32 i = 0; i < count; ++i) - { - LLInventoryCategory* cat = categories->get(i); - buildNewViews(cat->getUUID()); - } - } - if(items) - { - S32 count = items->count(); - for(S32 i = 0; i < count; ++i) - { - LLInventoryItem* item = items->get(i); - buildNewViews(item->getUUID()); - } - } - mInventory->unlockDirectDescendentArrays(id); - } -} - -struct LLConfirmPurgeData -{ - LLUUID mID; - LLInventoryModel* mModel; -}; - -class LLIsNotWorn : public LLInventoryCollectFunctor -{ -public: - LLIsNotWorn() {} - virtual ~LLIsNotWorn() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item) - { - return !gAgentWearables.isWearingItem(item->getUUID()); - } -}; - -class LLOpenFolderByID : public LLFolderViewFunctor -{ -public: - LLOpenFolderByID(const LLUUID& id) : mID(id) {} - virtual ~LLOpenFolderByID() {} - virtual void doFolder(LLFolderViewFolder* folder) - { - if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } - virtual void doItem(LLFolderViewItem* item) {} -protected: - const LLUUID& mID; -}; - - -void LLInventoryPanel::openSelected() -{ - LLFolderViewItem* folder_item = mFolders->getCurSelectedItem(); - if(!folder_item) return; - LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); - if(!bridge) return; - bridge->openItem(); -} - -BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) -{ - BOOL handled = LLView::handleHover(x, y, mask); - if(handled) - { - ECursorType cursor = getWindow()->getCursor(); - if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW) - { - // replace arrow cursor with arrow and hourglass cursor - getWindow()->setCursor(UI_CURSOR_WORKING); - } - } - else - { - getWindow()->setCursor(UI_CURSOR_ARROW); - } - return TRUE; -} - -BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - - BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - - if (handled) - { - mFolders->setDragAndDropThisFrame(); - } - - return handled; -} - -void LLInventoryPanel::onFocusLost() -{ - // inventory no longer handles cut/copy/paste/delete - if (LLEditMenuHandler::gEditMenuHandler == mFolders) - { - LLEditMenuHandler::gEditMenuHandler = NULL; - } - - LLPanel::onFocusLost(); -} - -void LLInventoryPanel::onFocusReceived() -{ - // inventory now handles cut/copy/paste/delete - LLEditMenuHandler::gEditMenuHandler = mFolders; - - LLPanel::onFocusReceived(); -} - - -void LLInventoryPanel::openAllFolders() -{ - mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - mFolders->arrangeAll(); -} - -void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type) -{ - LLUUID category_id = mInventory->findCategoryUUIDForType(type); - LLOpenFolderByID opener(category_id); - mFolders->applyFunctorRecursively(opener); -} - -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::getCOF()) - { - return; - } - mFolders->setSelectionByID(obj_id, take_keyboard_focus); -} - -void LLInventoryPanel::clearSelection() -{ - mFolders->clearSelection(); -} - -void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action) -{ - LLFolderView* fv = getRootFolder(); - if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename - { - fv->setNeedsAutoRename(FALSE); - if (items.size()) // new asset is visible and selected - { - fv->startRenamingSelectedItem(); - } - } - // Seraph - Put determineFolderType in here for ensemble typing? -} - -//---------------------------------------------------------------------------- - -void LLInventoryPanel::doToSelected(const LLSD& userdata) -{ - mFolders->doToSelected(&gInventory, userdata); -} - -void LLInventoryPanel::doCreate(const LLSD& userdata) -{ - menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata); -} - -bool LLInventoryPanel::beginIMSession() -{ - std::set<LLUUID> selected_items; - mFolders->getSelectionList(selected_items); - - std::string name; - static int session_num = 1; - - LLDynamicArray<LLUUID> members; - EInstantMessage type = IM_SESSION_CONFERENCE_START; - - std::set<LLUUID>::const_iterator iter; - for (iter = selected_items.begin(); iter != selected_items.end(); iter++) - { - - LLUUID item = *iter; - LLFolderViewItem* folder_item = mFolders->getItemByID(item); - - if(folder_item) - { - LLFolderViewEventListener* fve_listener = folder_item->getListener(); - if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY)) - { - - LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); - if(!bridge) return true; - LLViewerInventoryCategory* cat = bridge->getCategory(); - if(!cat) return true; - name = cat->getName(); - LLUniqueBuddyCollector is_buddy; - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - gInventory.collectDescendentsIf(bridge->getUUID(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_buddy); - S32 count = item_array.count(); - if(count > 0) - { - LLFloaterReg::showInstance("communicate"); - // create the session - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id; - for(S32 i = 0; i < count; ++i) - { - id = item_array.get(i)->getCreatorUUID(); - if(at.isBuddyOnline(id)) - { - members.put(id); - } - } - } - } - else - { - LLFolderViewItem* folder_item = mFolders->getItemByID(item); - if(!folder_item) return true; - LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); - - if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) - { - LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID()); - - if (inv_item) - { - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id = inv_item->getCreatorUUID(); - - if(at.isBuddyOnline(id)) - { - members.put(id); - } - } - } //if IT_CALLINGCARD - } //if !IT_CATEGORY - } - } //for selected_items - - // the session_id is randomly generated UUID which will be replaced later - // with a server side generated number - - if (name.empty()) - { - name = llformat("Session %d", session_num++); - } - - LLUUID session_id = gIMMgr->addSession(name, type, members[0], members); - if (session_id != LLUUID::null) - { - LLIMFloater::show(session_id); - } - - return true; -} - -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; - } - - 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); - } - } - gFocusMgr.setKeyboardFocus(NULL); - - return true; -} - - -//---------------------------------------------------------------------------- - -// static DEBUG ONLY: -void LLInventoryPanel::dumpSelectionInformation(void* user_data) -{ - LLInventoryPanel* iv = (LLInventoryPanel*)user_data; - iv->mFolders->dumpSelectionInformation(); -} - -BOOL LLInventoryPanel::getSinceLogoff() -{ - return mFolders->getFilter()->isSinceLogoff(); -} - -void example_param_block_usage() -{ - LLInventoryPanel::Params param_block; - param_block.name(std::string("inventory")); - - param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER); - param_block.allow_multi_select(true); - param_block.filter(LLInventoryPanel::Filter() - .sort_order(1) - .types(0xffff0000)); - param_block.inventory(&gInventory); - param_block.has_border(true); - - LLUICtrlFactory::create<LLInventoryPanel>(param_block); - - param_block = LLInventoryPanel::Params(); - param_block.name(std::string("inventory")); - - //LLSD param_block_sd; - //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER; - //param_block_sd["allow_multi_select"] = true; - //param_block_sd["filter"]["sort_order"] = 1; - //param_block_sd["filter"]["types"] = (S32)0xffff0000; - //param_block_sd["has_border"] = true; - - //LLInitParam::LLSDParser(param_block_sd).parse(param_block); - - LLUICtrlFactory::create<LLInventoryPanel>(param_block); -} +/* + * @file llinventorypanel.cpp + * @brief Implementation of the inventory panel and associated stuff. + * + * $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 <utility> // for std::pair<> + +#include "llinventorypanel.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llfloaterreg.h" +#include "llimview.h" +#include "llinventorybridge.h" +#include "llscrollcontainer.h" +#include "llviewerfoldertype.h" +#include "llimfloater.h" +#include "llvoavatarself.h" + +static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); + +const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder"); +const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder"); +const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string(""); +static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryPanelObserver +// +// Bridge to support knowing when the inventory has changed. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryPanelObserver : public LLInventoryObserver +{ +public: + LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {} + virtual ~LLInventoryPanelObserver() {} + virtual void changed(U32 mask); +protected: + LLInventoryPanel* mIP; +}; + +LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : + LLPanel(p), + mInventoryObserver(NULL), + mFolders(NULL), + mScroller(NULL), + mSortOrderSetting(p.sort_order_setting), + mInventory(p.inventory), + mAllowMultiSelect(p.allow_multi_select), + mHasInventoryConnection(false), + mStartFolderString(p.start_folder), + mBuildDefaultHierarchy(true), + mInvFVBridgeBuilder(NULL) +{ + mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; + + // contex menu callbacks + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); + 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)); + + setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor")); + setBackgroundVisible(TRUE); + setBackgroundOpaque(TRUE); +} + +BOOL LLInventoryPanel::postBuild() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); + + mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves + + // create root folder + { + LLRect folder_rect(0, + 0, + getRect().getWidth(), + 0); + LLFolderView::Params p; + p.name = getName(); + p.rect = folder_rect; + p.parent_panel = this; + p.tool_tip = p.name; + mFolders = LLUICtrlFactory::create<LLFolderView>(p); + mFolders->setAllowMultiSelect(mAllowMultiSelect); + } + + mCommitCallbackRegistrar.popScope(); + + mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + + // scroller + { + LLRect scroller_view_rect = getRect(); + scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); + LLScrollContainer::Params p; + p.name("Inventory Scroller"); + p.rect(scroller_view_rect); + p.follows.flags(FOLLOWS_ALL); + p.reserve_scroll_corner(true); + p.tab_stop(true); + mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); + } + addChild(mScroller); + mScroller->addChild(mFolders); + + mFolders->setScrollContainer(mScroller); + + // set up the callbacks from the inventory we're viewing, and then + // build everything. + mInventoryObserver = new LLInventoryPanelObserver(this); + mInventory->addObserver(mInventoryObserver); + + // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback + if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection) + { + rebuildViews(); + mHasInventoryConnection = true; + defaultOpenInventory(); + } + + if (mSortOrderSetting != INHERIT_SORT_ORDER) + { + setSortOrder(gSavedSettings.getU32(mSortOrderSetting)); + } + else + { + setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); + } + mFolders->setSortOrder(mFolders->getFilter()->getSortOrder()); + + return TRUE; +} + +LLInventoryPanel::~LLInventoryPanel() +{ + // should this be a global setting? + if (mFolders) + { + U32 sort_order = mFolders->getSortOrder(); + if (mSortOrderSetting != INHERIT_SORT_ORDER) + { + gSavedSettings.setU32(mSortOrderSetting, sort_order); + } + } + + // LLView destructor will take care of the sub-views. + mInventory->removeObserver(mInventoryObserver); + delete mInventoryObserver; + mScroller = NULL; +} + +LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed? +void LLInventoryPanel::draw() +{ + // select the desired item (in case it wasn't loaded when the selection was requested) + mFolders->updateSelection(); + LLPanel::draw(); +} + +LLInventoryFilter* LLInventoryPanel::getFilter() +{ + if (mFolders) return mFolders->getFilter(); + return NULL; +} + +void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories) +{ + mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories); +} + +void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) +{ + mFolders->getFilter()->setFilterPermissions(filter_perm_mask); +} + +void LLInventoryPanel::setFilterSubString(const std::string& string) +{ + mFolders->getFilter()->setFilterSubString(string); +} + +void LLInventoryPanel::setSortOrder(U32 order) +{ + mFolders->getFilter()->setSortOrder(order); + if (mFolders->getFilter()->isModified()) + { + mFolders->setSortOrder(order); + // try to keep selection onscreen, even if it wasn't to start with + mFolders->scrollToShowSelection(); + } +} + +void LLInventoryPanel::setSinceLogoff(BOOL sl) +{ + mFolders->getFilter()->setDateRangeLastLogoff(sl); +} + +void LLInventoryPanel::setHoursAgo(U32 hours) +{ + mFolders->getFilter()->setHoursAgo(hours); +} + +void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) +{ + mFolders->getFilter()->setShowFolderState(show); +} + +LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState() +{ + return mFolders->getFilter()->getShowFolderState(); +} + +static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh"); + +void LLInventoryPanel::modelChanged(U32 mask) +{ + LLFastTimer t2(FTM_REFRESH); + + bool handled = false; + + // inventory just initialized, do complete build + if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection) + { + rebuildViews(); + mHasInventoryConnection = true; + defaultOpenInventory(); + return; + } + + if (mask & LLInventoryObserver::LABEL) + { + handled = true; + // label change - empty out the display name for each object + // in this change set. + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + LLFolderViewItem* view = NULL; + LLInvFVBridge* bridge = NULL; + for (;id_it != id_end; ++id_it) + { + view = mFolders->getItemByID(*id_it); + if(view) + { + // request refresh on this item (also flags for filtering) + bridge = (LLInvFVBridge*)view->getListener(); + if(bridge) + { // Clear the display name first, so it gets properly re-built during refresh() + bridge->clearDisplayName(); + } + view->refresh(); + } + } + } + + // We don't really care which of these masks the item is actually flagged with, since the masks + // may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into + // Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks + // panel). What's relevant is that the item and UI are probably out of sync and thus need to be + // resynchronized. + if (mask & (LLInventoryObserver::STRUCTURE | + LLInventoryObserver::ADD | + LLInventoryObserver::REMOVE)) + { + handled = true; + // Record which folders are open by uuid. + LLInventoryModel* model = getModel(); + if (model) + { + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + for (;id_it != id_end; ++id_it) + { + // sync view with model + LLInventoryObject* model_item = model->getObject(*id_it); + LLFolderViewItem* view_item = mFolders->getItemByID(*id_it); + + // Item exists in memory but a UI element hasn't been created for it. + if (model_item && !view_item) + { + // Add the UI element for this item. + buildNewViews(*id_it); + // Select any newly created object that has the auto rename at top of folder root set. + if(mFolders->getRoot()->needsAutoRename()) + { + setSelection(*id_it, FALSE); + } + } + + // This item already exists in both memory and UI. It was probably moved + // around in the panel's directory structure (i.e. reparented). + if (model_item && view_item) + { + LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); + + // Item has been moved. + if (view_item->getParentFolder() != new_parent) + { + if (new_parent != NULL) + { + // 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); + } + else + { + // Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that + // doesn't include trash). Just remove the item's UI. + view_item->destroyView(); + } + } + } + + // This item has been removed from memory, but its associated UI element still exists. + if (!model_item && view_item) + { + // Remove the item's UI. + view_item->destroyView(); + } + } + } + } + + if (!handled) + { + // it's a small change that only requires a refresh. + // *TODO: figure out a more efficient way to do the refresh + // since it is expensive on large inventories + mFolders->refresh(); + } +} + + +void LLInventoryPanel::rebuildViews() +{ + // Determine the root folder and rebuild the views starting + // at that folder. + const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); + + if ("LIBRARY" == mStartFolderString) + { + mStartFolderID = gInventory.getLibraryRootFolderID(); + } + else + { + mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); + } + + rebuildViewsFor(mStartFolderID); +} + +void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) +{ + LLFolderViewItem* old_view = NULL; + + // get old LLFolderViewItem + old_view = mFolders->getItemByID(id); + if (old_view && id.notNull()) + { + old_view->destroyView(); + } + + buildNewViews(id); +} + +void LLInventoryPanel::buildNewViews(const LLUUID& id) +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS); + LLFolderViewItem* itemp = NULL; + LLInventoryObject* objectp = gInventory.getObject(id); + if (objectp) + { + const LLUUID &parent_id = objectp->getParentUUID(); + LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id); + if (id == mStartFolderID) + parent_folder = mFolders; + + if (!parent_folder) + { + // This item exists outside the inventory's hierarchy, so don't add it. + return; + } + + if (objectp->getType() <= LLAssetType::AT_NONE || + objectp->getType() >= LLAssetType::AT_COUNT) + { + llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << + ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl; + return; + } + + if (objectp->getType() == LLAssetType::AT_CATEGORY && + objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) + { + LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(), + objectp->getType(), + LLInventoryType::IT_CATEGORY, + this, + objectp->getUUID()); + + if (new_listener) + { + LLFolderViewFolder::Params p; + p.name = new_listener->getDisplayName(); + p.icon = new_listener->getIcon(); + p.root = mFolders; + p.listener = new_listener; + p.tool_tip = p.name; + LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p); + folderp->setItemSortOrder(mFolders->getSortOrder()); + itemp = folderp; + + // Hide the root folder, so we can show the contents of a folder + // flat but still have the parent folder present for listener-related + // operations. + if (id == mStartFolderID) + { + folderp->setDontShowInHierarchy(TRUE); + } + } + } + else + { + // Build new view for item + LLInventoryItem* item = (LLInventoryItem*)objectp; + LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(), + item->getActualType(), + item->getInventoryType(), + this, + item->getUUID(), + item->getFlags()); + + if (new_listener) + { + LLFolderViewItem::Params params; + params.name(new_listener->getDisplayName()); + params.icon(new_listener->getIcon()); + params.creation_date(new_listener->getCreationDate()); + params.root(mFolders); + params.listener(new_listener); + params.rect(LLRect (0, 0, 0, 0)); + params.tool_tip = params.name; + itemp = LLUICtrlFactory::create<LLFolderViewItem> (params); + } + } + + if (itemp) + { + itemp->addToFolder(parent_folder, mFolders); + } + } + + // If this is a folder, add the children of the folder and recursively add any + // child folders. + if ((id == mStartFolderID) || + (objectp && objectp->getType() == LLAssetType::AT_CATEGORY)) + { + LLViewerInventoryCategory::cat_array_t* categories; + LLViewerInventoryItem::item_array_t* items; + + mInventory->lockDirectDescendentArrays(id, categories, items); + if(categories) + { + S32 count = categories->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryCategory* cat = categories->get(i); + buildNewViews(cat->getUUID()); + } + } + if(items) + { + S32 count = items->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryItem* item = items->get(i); + buildNewViews(item->getUUID()); + } + } + mInventory->unlockDirectDescendentArrays(id); + } +} + +// bit of a hack to make sure the inventory is open. +void LLInventoryPanel::defaultOpenInventory() +{ + const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); + if (preferred_type != LLFolderType::FT_NONE) + { + const std::string& top_level_folder_name = LLViewerFolderType::lookupNewCategoryName(preferred_type); + mFolders->openFolder(top_level_folder_name); + } + else + { + // Get the first child (it should be "My Inventory") and + // open it up by name (just to make sure the first child is actually a folder). + LLView* first_child = mFolders->getFirstChild(); + const std::string& first_child_name = first_child->getName(); + mFolders->openFolder(first_child_name); + } +} + +struct LLConfirmPurgeData +{ + LLUUID mID; + LLInventoryModel* mModel; +}; + +class LLIsNotWorn : public LLInventoryCollectFunctor +{ +public: + LLIsNotWorn() {} + virtual ~LLIsNotWorn() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item) + { + return !gAgentWearables.isWearingItem(item->getUUID()); + } +}; + +class LLOpenFolderByID : public LLFolderViewFunctor +{ +public: + LLOpenFolderByID(const LLUUID& id) : mID(id) {} + virtual ~LLOpenFolderByID() {} + virtual void doFolder(LLFolderViewFolder* folder) + { + if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } + virtual void doItem(LLFolderViewItem* item) {} +protected: + const LLUUID& mID; +}; + + +void LLInventoryPanel::openSelected() +{ + LLFolderViewItem* folder_item = mFolders->getCurSelectedItem(); + if(!folder_item) return; + LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); + if(!bridge) return; + bridge->openItem(); +} + +BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLView::handleHover(x, y, mask); + if(handled) + { + ECursorType cursor = getWindow()->getCursor(); + if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW) + { + // replace arrow cursor with arrow and hourglass cursor + getWindow()->setCursor(UI_CURSOR_WORKING); + } + } + else + { + getWindow()->setCursor(UI_CURSOR_ARROW); + } + return TRUE; +} + +BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + + BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + + if (handled) + { + mFolders->setDragAndDropThisFrame(); + } + + return handled; +} + +void LLInventoryPanel::onFocusLost() +{ + // inventory no longer handles cut/copy/paste/delete + if (LLEditMenuHandler::gEditMenuHandler == mFolders) + { + LLEditMenuHandler::gEditMenuHandler = NULL; + } + + LLPanel::onFocusLost(); +} + +void LLInventoryPanel::onFocusReceived() +{ + // inventory now handles cut/copy/paste/delete + LLEditMenuHandler::gEditMenuHandler = mFolders; + + LLPanel::onFocusReceived(); +} + + +void LLInventoryPanel::openAllFolders() +{ + mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + mFolders->arrangeAll(); +} + +void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type) +{ + LLUUID category_id = mInventory->findCategoryUUIDForType(type); + LLOpenFolderByID opener(category_id); + mFolders->applyFunctorRecursively(opener); +} + +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()) + { + return; + } + mFolders->setSelectionByID(obj_id, take_keyboard_focus); +} + +void LLInventoryPanel::clearSelection() +{ + mFolders->clearSelection(); +} + +void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action) +{ + LLFolderView* fv = getRootFolder(); + if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename + { + fv->setNeedsAutoRename(FALSE); + if (items.size()) // new asset is visible and selected + { + fv->startRenamingSelectedItem(); + } + } + // Seraph - Put determineFolderType in here for ensemble typing? +} + +//---------------------------------------------------------------------------- + +void LLInventoryPanel::doToSelected(const LLSD& userdata) +{ + mFolders->doToSelected(&gInventory, userdata); +} + +void LLInventoryPanel::doCreate(const LLSD& userdata) +{ + menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata); +} + +bool LLInventoryPanel::beginIMSession() +{ + std::set<LLUUID> selected_items; + mFolders->getSelectionList(selected_items); + + std::string name; + static int session_num = 1; + + LLDynamicArray<LLUUID> members; + EInstantMessage type = IM_SESSION_CONFERENCE_START; + + std::set<LLUUID>::const_iterator iter; + for (iter = selected_items.begin(); iter != selected_items.end(); iter++) + { + + LLUUID item = *iter; + LLFolderViewItem* folder_item = mFolders->getItemByID(item); + + if(folder_item) + { + LLFolderViewEventListener* fve_listener = folder_item->getListener(); + if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY)) + { + + LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); + if(!bridge) return true; + LLViewerInventoryCategory* cat = bridge->getCategory(); + if(!cat) return true; + name = cat->getName(); + LLUniqueBuddyCollector is_buddy; + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendentsIf(bridge->getUUID(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_buddy); + S32 count = item_array.count(); + if(count > 0) + { + LLFloaterReg::showInstance("communicate"); + // create the session + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id; + for(S32 i = 0; i < count; ++i) + { + id = item_array.get(i)->getCreatorUUID(); + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } + } + } + else + { + LLFolderViewItem* folder_item = mFolders->getItemByID(item); + if(!folder_item) return true; + LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); + + if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) + { + LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID()); + + if (inv_item) + { + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id = inv_item->getCreatorUUID(); + + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } + } //if IT_CALLINGCARD + } //if !IT_CATEGORY + } + } //for selected_items + + // the session_id is randomly generated UUID which will be replaced later + // with a server side generated number + + if (name.empty()) + { + name = llformat("Session %d", session_num++); + } + + LLUUID session_id = gIMMgr->addSession(name, type, members[0], members); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } + + return true; +} + +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; + } + + 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); + } + } + gFocusMgr.setKeyboardFocus(NULL); + + return true; +} + + +//---------------------------------------------------------------------------- + +// static DEBUG ONLY: +void LLInventoryPanel::dumpSelectionInformation(void* user_data) +{ + LLInventoryPanel* iv = (LLInventoryPanel*)user_data; + iv->mFolders->dumpSelectionInformation(); +} + +BOOL LLInventoryPanel::getSinceLogoff() +{ + return mFolders->getFilter()->isSinceLogoff(); +} + +void example_param_block_usage() +{ + LLInventoryPanel::Params param_block; + param_block.name(std::string("inventory")); + + param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER); + param_block.allow_multi_select(true); + param_block.filter(LLInventoryPanel::Filter() + .sort_order(1) + .types(0xffff0000)); + param_block.inventory(&gInventory); + param_block.has_border(true); + + LLUICtrlFactory::create<LLInventoryPanel>(param_block); + + param_block = LLInventoryPanel::Params(); + param_block.name(std::string("inventory")); + + //LLSD param_block_sd; + //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER; + //param_block_sd["allow_multi_select"] = true; + //param_block_sd["filter"]["sort_order"] = 1; + //param_block_sd["filter"]["types"] = (S32)0xffff0000; + //param_block_sd["has_border"] = true; + + //LLInitParam::LLSDParser(param_block_sd).parse(param_block); + + LLUICtrlFactory::create<LLInventoryPanel>(param_block); +} + +// +=================================================+ +// | LLInventoryPanelObserver | +// +=================================================+ +void LLInventoryPanelObserver::changed(U32 mask) +{ + mIP->modelChanged(mask); +} diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 9f74fad5c1c0acca15b4be0bff86b128602c7a58..0ccee337c94e3506f665737591ce4b80347757bb 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -162,10 +162,14 @@ class LLInventoryPanel : public LLPanel void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); } protected: + // Destroys the old views, and regenerates them based on the + // start folder ID. + void rebuildViews(); + // Given the id and the parent, build all of the folder views. void rebuildViewsFor(const LLUUID& id); virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719 - + void defaultOpenInventory(); // open the first level of inventory protected: LLInventoryModel* mInventory; LLInventoryObserver* mInventoryObserver; diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index bd6702a0b2f6f9dabafca900cf460caf658fdb9d..2cc5c8335d3e7b9ac23b153e31b759466d520268 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -134,16 +134,33 @@ void LLJoystick::updateSlop() return; } +bool LLJoystick::pointInCircle(S32 x, S32 y) const +{ + if(this->getLocalRect().getHeight() != this->getLocalRect().getWidth()) + { + llwarns << "Joystick shape is not square"<<llendl; + return true; + } + //center is x and y coordinates of center of joystick circle, and also its radius + int center = this->getLocalRect().getHeight()/2; + bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center; + return in_circle; +} BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask) { //llinfos << "joystick mouse down " << x << ", " << y << llendl; + bool handles = false; - mLastMouse.set(x, y); - mFirstMouse.set(x, y); + if(pointInCircle(x, y)) + { + mLastMouse.set(x, y); + mFirstMouse.set(x, y); + mMouseDownTimer.reset(); + handles = LLButton::handleMouseDown(x, y, mask); + } - mMouseDownTimer.reset(); - return LLButton::handleMouseDown(x, y, mask); + return handles; } diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h index 4c657913b8c3a6fadc782182b3f43fcaec7f3643..2b071a8999befd61cb7ba6face2f0183b81bc1dc 100644 --- a/indra/newview/lljoystickbutton.h +++ b/indra/newview/lljoystickbutton.h @@ -78,6 +78,14 @@ class LLJoystick static void onBtnHeldDown(void *userdata); // called by llbutton callback handler void setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; }; + + /** + * Checks if click location is inside joystick circle. + * + * Image containing circle is square and this square has adherent points with joystick + * circle. Make sure to change method according to shape other than square. + */ + bool pointInCircle(S32 x, S32 y) const; static std::string nameFromQuadrant(const EJoystickQuadrant quadrant); static EJoystickQuadrant quadrantFromName(const std::string& name); diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index e0dc1b6f0fce150a0771e390e9431f2f3a6d5c9b..d50b68b624071dd0028eeb60fa711e7f67607677 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -324,7 +324,7 @@ void LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(const LLVector3d& gl { LLVector3 pos = sim_infop->getLocalPos(global_pos); std::string name = sim_infop->getName() ; - cb(name, llround(pos.mV[VX]), llround(pos.mV[VY])); + cb(name, llround(pos.mV[VX]), llround(pos.mV[VY]),llround(pos.mV[VZ])); } else { @@ -368,28 +368,40 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal { LLVector3 local_pos = sim_infop->getLocalPos(global_pos); std::string name = sim_infop->getName() ; - cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY])); + cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]), llround(local_pos.mV[VZ])); } } bool LLLandmarkActions::getLandmarkGlobalPos(const LLUUID& landmarkInventoryItemID, LLVector3d& posGlobal) { - LLLandmark* landmark = LLLandmarkActions::getLandmark(landmarkInventoryItemID); + LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID); + if (NULL == item) + return false; + + const LLUUID& asset_id = item->getAssetUUID(); + LLLandmark* landmark = gLandmarkList.getAsset(asset_id, NULL); if (NULL == landmark) return false; return landmark->getGlobalPos(posGlobal); } -LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID) +LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb) { LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID); if (NULL == item) return NULL; const LLUUID& asset_id = item->getAssetUUID(); - return gLandmarkList.getAsset(asset_id, NULL); + + LLLandmark* landmark = gLandmarkList.getAsset(asset_id, cb); + if (landmark) + { + return landmark; + } + + return NULL; } void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItemID) diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h index 1c524c820c962b27abda5df1525babc96e64ffa4..987caf0936df9658aba308880851d5496677936f 100644 --- a/indra/newview/lllandmarkactions.h +++ b/indra/newview/lllandmarkactions.h @@ -35,7 +35,10 @@ #include "llinventorymodel.h" +#include "lllandmarklist.h" + class LLLandmark; + /** * @brief Provides helper functions to manage landmarks */ @@ -43,7 +46,7 @@ class LLLandmarkActions { public: typedef boost::function<void(std::string& slurl)> slurl_callback_t; - typedef boost::function<void(std::string& slurl, S32 x, S32 y)> region_name_and_coords_callback_t; + typedef boost::function<void(std::string& slurl, S32 x, S32 y, S32 z)> region_name_and_coords_callback_t; /** * @brief Fetches landmark LLViewerInventoryItems for the given landmark name. @@ -112,10 +115,11 @@ class LLLandmarkActions /** * @brief Retrieve a landmark from gLandmarkList by inventory item's id + * If a landmark is not currently in the gLandmarkList a callback "cb" is called when it is loaded. * * @return pointer to loaded landmark from gLandmarkList or NULL if landmark does not exist or wasn't loaded. */ - static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID); + static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb = NULL); /** * @brief Performs standard action of copying of SLURL from landmark to user's clipboard. diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8fe317a2921543a740dadb48aec5593526aa8773..6b28edf0b631699890b0dbeaa1ae416c252086aa 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -45,13 +45,14 @@ #include "lltooltip.h" // newview includes -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "lllandmarkactions.h" #include "lllandmarklist.h" #include "lllocationhistory.h" #include "llteleporthistory.h" #include "llsidetray.h" #include "llslurl.h" +#include "llstatusbar.h" // getHealth() #include "lltrans.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" @@ -157,15 +158,22 @@ LLLocationInputCtrl::Params::Params() add_landmark_image_disabled("add_landmark_image_disabled"), add_landmark_image_hover("add_landmark_image_hover"), add_landmark_image_selected("add_landmark_image_selected"), + icon_hpad("icon_hpad", 0), add_landmark_button("add_landmark_button"), - add_landmark_hpad("add_landmark_hpad", 0), - info_button("info_button") + info_button("info_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") { } LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) : LLComboBox(p), - mAddLandmarkHPad(p.add_landmark_hpad), + mIconHPad(p.icon_hpad), mInfoBtn(NULL), mLocationContextMenu(NULL), mAddLandmarkBtn(NULL), @@ -188,13 +196,12 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) params.rect(text_entry_rect); params.default_text(LLStringUtil::null); params.max_length_bytes(p.max_chars); - 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); mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params); - this->addChild(mTextEntry); + addChild(mTextEntry); // LLLineEditor is replaced with LLLocationLineEditor // "Place information" button. @@ -230,6 +237,35 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params); enableAddLandmarkButton(true); addChild(mAddLandmarkBtn); + + // Parcel property icons + LLIconCtrl::Params voice_icon = p.voice_icon; + mParcelIcon[VOICE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(voice_icon); + addChild(mParcelIcon[VOICE_ICON]); + + LLIconCtrl::Params fly_icon = p.fly_icon; + mParcelIcon[FLY_ICON] = LLUICtrlFactory::create<LLIconCtrl>(fly_icon); + addChild(mParcelIcon[FLY_ICON]); + + LLIconCtrl::Params push_icon = p.push_icon; + mParcelIcon[PUSH_ICON] = LLUICtrlFactory::create<LLIconCtrl>(push_icon); + addChild(mParcelIcon[PUSH_ICON]); + + LLIconCtrl::Params build_icon = p.build_icon; + mParcelIcon[BUILD_ICON] = LLUICtrlFactory::create<LLIconCtrl>(build_icon); + addChild(mParcelIcon[BUILD_ICON]); + + LLIconCtrl::Params scripts_icon = p.scripts_icon; + mParcelIcon[SCRIPTS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(scripts_icon); + addChild(mParcelIcon[SCRIPTS_ICON]); + + LLIconCtrl::Params damage_icon = p.damage_icon; + mParcelIcon[DAMAGE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(damage_icon); + addChild(mParcelIcon[DAMAGE_ICON]); + + LLTextBox::Params damage_text = p.damage_text; + mDamageText = LLUICtrlFactory::create<LLTextBox>(damage_text); + addChild(mDamageText); // Register callbacks and load the location field context menu (NB: the order matters). LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2)); @@ -373,11 +409,8 @@ void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor) */ void LLLocationInputCtrl::setText(const LLStringExplicit& text) { - if (mTextEntry) - { - mTextEntry->setText(text); - mHasAutocompletedText = FALSE; - } + mTextEntry->setText(text); + mHasAutocompletedText = FALSE; } void LLLocationInputCtrl::setFocus(BOOL b) @@ -410,11 +443,20 @@ void LLLocationInputCtrl::onFocusLost() mTextEntry->deselect(); } } -void LLLocationInputCtrl::draw(){ - - if(!hasFocus() && gSavedSettings.getBOOL("ShowCoordinatesOption")){ + +void LLLocationInputCtrl::draw() +{ + static LLUICachedControl<bool> show_coords("NavBarShowCoordinates", false); + if(!hasFocus() && show_coords) + { refreshLocation(); } + + static LLUICachedControl<bool> show_icons("NavBarShowParcelProperties", false); + if (show_icons) + { + refreshHealth(); + } LLComboBox::draw(); } @@ -511,10 +553,12 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data) mList->mouseOverHighlightNthItem(-1); // Clear highlight on the last selected item. } + bool LLLocationInputCtrl::findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter) { return item.mTitle.find(filter) != std::string::npos; } + void LLLocationInputCtrl::onTextEditorRightClicked(S32 x, S32 y, MASK mask) { if (mLocationContextMenu) @@ -532,6 +576,7 @@ void LLLocationInputCtrl::onTextEditorRightClicked(S32 x, S32 y, MASK mask) void LLLocationInputCtrl::refresh() { refreshLocation(); // update location string + refreshParcelIcons(); updateAddLandmarkButton(); // indicate whether current parcel has been landmarked } @@ -548,13 +593,98 @@ void LLLocationInputCtrl::refreshLocation() // Update location field. std::string location_name; - LLAgentUI::ELocationFormat format = (gSavedSettings.getBOOL("ShowCoordinatesOption") ? - LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM: LLAgentUI::LOCATION_FORMAT_NORMAL); + LLAgentUI::ELocationFormat format = + (gSavedSettings.getBOOL("NavBarShowCoordinates") + ? LLAgentUI::LOCATION_FORMAT_FULL + : LLAgentUI::LOCATION_FORMAT_NO_COORDS); - if (!LLAgentUI::buildLocationString(location_name, format)) location_name = "Unknown"; + if (!LLAgentUI::buildLocationString(location_name, format)) + { + location_name = "???"; + } setText(location_name); } +void LLLocationInputCtrl::refreshParcelIcons() +{ + // Our "cursor" moving right to left + S32 x = mAddLandmarkBtn->getRect().mLeft - mIconHPad; + + static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false); + if (show_properties) + { + LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); + // *TODO buy + //bool allow_buy = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false); + bool allow_voice = vpm->allowAgentVoice(); + bool allow_fly = vpm->allowAgentFly(); + bool allow_push = vpm->allowAgentPush(); + bool allow_build = vpm->allowAgentBuild(); + bool allow_scripts = vpm->allowAgentScripts(); + bool allow_damage = vpm->allowAgentDamage(); + + // 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); + + // Slide the parcel icons rect from right to left, adjusting rectangles of + // visible icons. Assumes all icon rects are the same. + for (S32 i = 0; i < ICON_COUNT; ++i) + { + LLIconCtrl* icon = mParcelIcon[i]; + if (icon->getVisible()) + { + LLRect r = icon->getRect(); + r.mLeft = x - r.getWidth(); + r.mRight = x; + icon->setRect( r ); + x -= r.getWidth() + mIconHPad; + } + } + LLRect text_rect = mDamageText->getRect(); + text_rect.mLeft = x - text_rect.getWidth(); + text_rect.mRight = x; + mDamageText->setRect(text_rect); + x -= text_rect.getWidth() + mIconHPad; + } + else + { + 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; + llinfos << "JAMESDEBUG text entry rect " << mTextEntry->getRect() + << " x " << x << " left_pad " << left_pad << " right_pad " << right_pad << llendl; + mTextEntry->setTextPadding(left_pad, right_pad); +} + +void LLLocationInputCtrl::refreshHealth() +{ + // *FIXME: Status bar owns health information, should be in agent + if (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 LLLocationInputCtrl::rebuildLocationHistory(std::string filter) { LLLocationHistory::location_list_t filtered_items; @@ -651,13 +781,11 @@ void LLLocationInputCtrl::updateWidgetlayout() mInfoBtn->setRect(info_btn_rect); // "Add Landmark" button - { - LLRect al_btn_rect = mAddLandmarkBtn->getRect(); - al_btn_rect.translate( - hist_btn_rect.mLeft - mAddLandmarkHPad - al_btn_rect.getWidth(), - (rect.getHeight() - al_btn_rect.getHeight()) / 2); - mAddLandmarkBtn->setRect(al_btn_rect); - } + LLRect al_btn_rect = mAddLandmarkBtn->getRect(); + al_btn_rect.translate( + hist_btn_rect.mLeft - mIconHPad - al_btn_rect.getWidth(), + (rect.getHeight() - al_btn_rect.getHeight()) / 2); + mAddLandmarkBtn->setRect(al_btn_rect); } void LLLocationInputCtrl::changeLocationPresentation() @@ -678,11 +806,17 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata) { std::string item = userdata.asString(); - if (item == std::string("show_coordinates")) + if (item == "show_coordinates") + { + gSavedSettings.setBOOL("NavBarShowCoordinates",!gSavedSettings.getBOOL("NavBarShowCoordinates")); + } + else if (item == "show_properties") { - gSavedSettings.setBOOL("ShowCoordinatesOption",!gSavedSettings.getBOOL("ShowCoordinatesOption")); + gSavedSettings.setBOOL("NavBarShowParcelProperties", + !gSavedSettings.getBOOL("NavBarShowParcelProperties")); + refreshParcelIcons(); } - else if (item == std::string("landmark")) + else if (item == "landmark") { LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos(); @@ -696,23 +830,23 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata) LLSD().insert("type", "landmark").insert("id",landmark->getUUID())); } } - else if (item == std::string("cut")) + else if (item == "cut") { mTextEntry->cut(); } - else if (item == std::string("copy")) + else if (item == "copy") { mTextEntry->copy(); } - else if (item == std::string("paste")) + else if (item == "paste") { mTextEntry->paste(); } - else if (item == std::string("delete")) + else if (item == "delete") { mTextEntry->deleteSelection(); } - else if (item == std::string("select_all")) + else if (item == "select_all") { mTextEntry->selectAll(); } @@ -722,29 +856,29 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata) { std::string item = userdata.asString(); - if (item == std::string("can_cut")) + if (item == "can_cut") { return mTextEntry->canCut(); } - else if (item == std::string("can_copy")) + else if (item == "can_copy") { return mTextEntry->canCopy(); } - else if (item == std::string("can_paste")) + else if (item == "can_paste") { return mTextEntry->canPaste(); } - else if (item == std::string("can_delete")) + else if (item == "can_delete") { return mTextEntry->canDeselect(); } - else if (item == std::string("can_select_all")) + else if (item == "can_select_all") { return mTextEntry->canSelectAll(); } - else if(item == std::string("show_coordinates")){ - - return gSavedSettings.getBOOL("ShowCoordinatesOption"); + else if(item == "show_coordinates") + { + return gSavedSettings.getBOOL("NavBarShowCoordinates"); } return false; diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index 44dc0cb2510bf3abc96cfe87b7cb9d90dd5e0ee9..3bd23e80a98a4ad615d3418ccc3f5afe07d3c386 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -33,7 +33,9 @@ #ifndef LL_LLLOCATIONINPUTCTRL_H #define LL_LLLOCATIONINPUTCTRL_H -#include <llcombobox.h> +#include "llcombobox.h" +#include "lliconctrl.h" // Params +#include "lltextbox.h" // Params class LLLandmark; @@ -63,9 +65,16 @@ class LLLocationInputCtrl add_landmark_image_disabled, add_landmark_image_hover, add_landmark_image_selected; - Optional<S32> add_landmark_hpad; + Optional<S32> icon_hpad; Optional<LLButton::Params> add_landmark_button, info_button; + Optional<LLIconCtrl::Params> voice_icon, + fly_icon, + push_icon, + build_icon, + scripts_icon, + damage_icon; + Optional<LLTextBox::Params> damage_text; Params(); }; @@ -103,6 +112,10 @@ class LLLocationInputCtrl void enableAddLandmarkButton(bool val); void refresh(); void refreshLocation(); + void refreshParcelIcons(); + // Refresh the value in the health percentage text field + void refreshHealth(); + void rebuildLocationHistory(std::string filter = ""); bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter); void setText(const LLStringExplicit& text); @@ -126,7 +139,20 @@ class LLLocationInputCtrl LLMenuGL* mLocationContextMenu; LLButton* mAddLandmarkBtn; LLButton* mInfoBtn; - S32 mAddLandmarkHPad; + S32 mIconHPad; + + enum EParcelIcon + { + VOICE_ICON = 0, + FLY_ICON, + PUSH_ICON, + BUILD_ICON, + SCRIPTS_ICON, + DAMAGE_ICON, + ICON_COUNT + }; + LLIconCtrl* mParcelIcon[ICON_COUNT]; + LLTextBox* mDamageText; LLAddLandmarkObserver* mAddLandmarkObserver; LLRemoveLandmarkObserver* mRemoveLandmarkObserver; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index a16ffe19c6de4bdaa4a381a2cd3c006370f7ae96..941ccc227cd5abc2933d636faedd6812eea50560 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -96,9 +96,6 @@ void LLLogChat::saveHistory(const std::string& filename, const LLUUID& from_id, const std::string& line) { - if (!gSavedPerAccountSettings.getBOOL("LogInstantMessages")) - return; - if(!filename.size()) { llinfos << "Filename is Empty!" << llendl; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index e5f347ddc404696933b6ccc7e78840d67268670d..955347bce2d27db40322126997fb8cdf11ee5755 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -182,6 +182,9 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials) mRequestData["method"] = "login_to_simulator"; mRequestData["params"] = request_params; mRequestData["options"] = requested_options; + + mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); + mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump"); } bool LLLoginInstance::handleLoginEvent(const LLSD& event) diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index f62d7229a31276eab5a7638147b69fc3a74f1cea..f30821cacf08bb990f6d69581e73598347ef2d70 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -265,8 +265,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->getWindowWidth() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom; - F32 mouse_y = ((F32)y / gViewerWindow->getWindowHeight() - 0.5f) / gAgent.mHUDCurZoom; + 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; LLVector3 origin_agent = gAgent.getPosAgentFromGlobal(origin); LLVector3 mouse_pos = LLVector3(0.f, -mouse_x, mouse_y); @@ -304,8 +304,8 @@ BOOL LLManip::nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, co if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidth()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom; - F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeight()) - 0.5f) / gAgent.mHUDCurZoom; + 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; 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); } @@ -429,9 +429,10 @@ void LLManip::renderXYZ(const LLVector3 &vec) const S32 PAD = 10; std::string feedback_string; LLVector3 camera_pos = LLViewerCamera::getInstance()->getOrigin() + LLViewerCamera::getInstance()->getAtAxis(); - S32 vertical_offset = gViewerWindow->getWindowHeight() / 2 - VERTICAL_OFFSET; - S32 window_center_x = gViewerWindow->getWindowWidth() / 2; - S32 window_center_y = gViewerWindow->getWindowHeight() / 2; + S32 window_center_x = gViewerWindow->getWorldViewRectScaled().getWidth() / 2; + S32 window_center_y = gViewerWindow->getWorldViewRectScaled().getHeight() / 2; + S32 vertical_offset = window_center_y - VERTICAL_OFFSET; + glPushMatrix(); { diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index c99e67be3f24830142148c27c173f14cf80e6dfd..8535d52015a2988189c6a47fccf3bd6e447fa693 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1107,8 +1107,11 @@ BOOL LLManipRotate::updateVisiblity() mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag; mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm; - mCenterScreen.set((S32)((0.5f - mRotationCenter.mdV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewWidth()), - (S32)((mRotationCenter.mdV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeight())); + // 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())); visible = TRUE; } else @@ -1624,8 +1627,8 @@ 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->getWorldViewWidth()) - 0.5f) / gAgent.mHUDCurZoom; - F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewHeight()) - 0.5f) / gAgent.mHUDCurZoom; + F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewRectScaled().getWidth()) - 0.5f) / gAgent.mHUDCurZoom; + F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewRectScaled().getHeight()) - 0.5f) / gAgent.mHUDCurZoom; *ray_pt = LLVector3(-1.f, -mouse_x, mouse_y); *ray_dir = LLVector3(1.f, 0.f, 0.f); @@ -1699,7 +1702,7 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y ) F32 dist_y = mouse_dir_y.normVec(); F32 dist_z = mouse_dir_z.normVec(); - F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeight(); + F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeightScaled(); if (llabs(dist_x - mRadiusMeters) * llmax(0.05f, proj_rot_x_axis) < distance_threshold) { diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 72596e850a7c043c6d3e09f3498ab4034c1357ab..84a5eb7352be56a0cc3b16e0cefeb23f3a27c64b 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -493,8 +493,9 @@ void LLManipScale::highlightManipulators(S32 x, S32 y) mProjectedManipulators.insert(projManipulator); } - F32 half_width = (F32)gViewerWindow->getWorldViewWidth() / 2.f; - F32 half_height = (F32)gViewerWindow->getWorldViewHeight() / 2.f; + LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled(); + F32 half_width = (F32)world_view_rect.getWidth() / 2.f; + F32 half_height = (F32)world_view_rect.getHeight() / 2.f; LLVector2 manip2d; LLVector2 mousePos((F32)x - half_width, (F32)y - half_height); LLVector2 delta; @@ -1368,7 +1369,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) else { F32 object_distance = dist_vec(mScaleCenter, LLViewerCamera::getInstance()->getOrigin()); - mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidth() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio(); + mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidthRaw() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio(); } LLVector3 cam_at_axis; F32 snap_guide_length; @@ -1381,7 +1382,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) { cam_at_axis = LLViewerCamera::getInstance()->getAtAxis(); F32 manipulator_distance = dist_vec(box_corner_agent, LLViewerCamera::getInstance()->getOrigin()); - snap_guide_length = (SNAP_GUIDE_SCREEN_LENGTH * gViewerWindow->getWorldViewWidth() * manipulator_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio(); + snap_guide_length = (SNAP_GUIDE_SCREEN_LENGTH * gViewerWindow->getWorldViewWidthRaw() * manipulator_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio(); } mSnapGuideLength = snap_guide_length / llmax(0.1f, (llmin(mSnapGuideDir1 * cam_at_axis, mSnapGuideDir2 * cam_at_axis))); diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index f1b3a37677a445fe9a680e902b4da572f30f40ea..932a3d8a83f7509412a16f349eb2f8c48dbeffef 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -413,8 +413,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) } // Handle auto-rotation if necessary. + LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD; - const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidth() / 20; + const S32 ROTATE_H_MARGIN = world_rect.getWidth() / 20; const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped; BOOL rotated = FALSE; @@ -426,7 +427,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) gAgent.cameraOrbitAround(rotate_angle); rotated = TRUE; } - else if (x > gViewerWindow->getWorldViewWidth() - ROTATE_H_MARGIN) + else if (x > world_rect.getWidth() - ROTATE_H_MARGIN) { gAgent.cameraOrbitAround(-rotate_angle); rotated = TRUE; @@ -960,8 +961,9 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y) LLVector2 manip_start_2d; LLVector2 manip_end_2d; LLVector2 manip_dir; - F32 half_width = gViewerWindow->getWorldViewWidth() / 2.f; - F32 half_height = gViewerWindow->getWorldViewHeight() / 2.f; + LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled(); + F32 half_width = (F32)world_view_rect.getWidth() / 2.f; + F32 half_height = (F32)world_view_rect.getHeight() / 2.f; LLVector2 mousePos((F32)x - half_width, (F32)y - half_height); LLVector2 mouse_delta; @@ -1225,7 +1227,7 @@ void LLManipTranslate::renderSnapGuides() { LLVector3 cam_to_selection = getPivotPoint() - LLViewerCamera::getInstance()->getOrigin(); F32 current_range = cam_to_selection.normVec(); - guide_size_meters = SNAP_GUIDE_SCREEN_SIZE * gViewerWindow->getWorldViewHeight() * current_range / LLViewerCamera::getInstance()->getPixelMeterRatio(); + guide_size_meters = SNAP_GUIDE_SCREEN_SIZE * gViewerWindow->getWorldViewHeightRaw() * current_range / LLViewerCamera::getInstance()->getPixelMeterRatio(); F32 fraction_of_fov = mAxisArrowLength / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels(); F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians @@ -1800,7 +1802,7 @@ void LLManipTranslate::renderTranslationHandles() // Drag handles if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { - mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeight(); + mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeightRaw(); mArrowLengthMeters /= gAgent.mHUDCurZoom; } else diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 8f29f908e5c74c70ed77e4fcd08b98320c301871..2376a3581db53c58c6fe896cbd5a40ee5afaf4e1 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -92,6 +92,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mStretchToFill( true ), mMaintainAspectRatio ( true ), mHideLoading (false), + mHidingInitialLoad (false), mDecoupleTextureSize ( false ), mTextureWidth ( 1024 ), mTextureHeight ( 1024 ) @@ -101,17 +102,17 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : setCaretColor( (unsigned int)color.mV[0], (unsigned int)color.mV[1], (unsigned int)color.mV[2] ); } - setIgnoreUIScale(p.ignore_ui_scale()); + setIgnoreUIScale(p.ignore_ui_scale); - setHomePageUrl(p.start_url()); + setHomePageUrl(p.start_url); - setBorderVisible(p.border_visible()); + setBorderVisible(p.border_visible); - mHideLoading = p.hide_loading(); + mHideLoading = p.hide_loading; - setDecoupleTextureSize(p.decouple_texture_size()); + setDecoupleTextureSize(p.decouple_texture_size); - setTextureSize(p.texture_width(), p.texture_height()); + setTextureSize(p.texture_width, p.texture_height); if(!getDecoupleTextureSize()) { @@ -355,7 +356,7 @@ void LLMediaCtrl::onFocusLost() // BOOL LLMediaCtrl::postBuild () { - mVisibleSignal.connect(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2)); + setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2)); return TRUE; } @@ -616,6 +617,11 @@ bool LLMediaCtrl::ensureMediaSourceExists() mMediaSource->setHomeURL(mHomePageUrl); mMediaSource->setVisible( getVisible() ); mMediaSource->addObserver( this ); + + if(mHideLoading) + { + mHidingInitialLoad = true; + } } else { @@ -685,7 +691,13 @@ void LLMediaCtrl::draw() { setFrequentUpdates( false ); }; - + + if(mHidingInitialLoad) + { + // If we're hiding loading, don't draw at all. + return; + } + // alpha off for this LLGLSUIDefault gls_ui; LLGLDisable gls_alphaTest( GL_ALPHA_TEST ); @@ -723,13 +735,13 @@ void LLMediaCtrl::draw() { // max width, adjusted height width = r.getWidth(); - height = llmin(llmax(S32(width / media_aspect), 0), r.getHeight()); + height = llmin(llmax(llround(width / media_aspect), 0), r.getHeight()); } else { // max height, adjusted width height = r.getHeight(); - width = llmin(llmax(S32(height * media_aspect), 0), r.getWidth()); + width = llmin(llmax(llround(height * media_aspect), 0), r.getWidth()); } } else @@ -747,6 +759,14 @@ void LLMediaCtrl::draw() x_offset = (r.getWidth() - width) / 2; y_offset = (r.getHeight() - height) / 2; + if(mIgnoreUIScale) + { + x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]); + y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]); + width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); + height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]); + } + // draw the browser gGL.setSceneBlendType(LLRender::BT_REPLACE); gGL.begin( LLRender::QUADS ); @@ -865,19 +885,15 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) case MEDIA_EVENT_NAVIGATE_BEGIN: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL; - if(mMediaSource && mHideLoading) - { - mMediaSource->suspendUpdates(true); - } }; break; case MEDIA_EVENT_NAVIGATE_COMPLETE: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << LL_ENDL; - if(mMediaSource && mHideLoading) + if(mHidingInitialLoad) { - mMediaSource->suspendUpdates(false); + mHidingInitialLoad = false; } }; break; diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 76ddc61ebf28ec285f07f32b1f9e0a2d48362702..f07513a3fdbc921ba90d2527ba7fd859f63d3f37 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -188,6 +188,7 @@ class LLMediaCtrl : bool mStretchToFill; bool mMaintainAspectRatio; bool mHideLoading; + bool mHidingInitialLoad; bool mDecoupleTextureSize; S32 mTextureWidth; S32 mTextureHeight; diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index 512104a2f420e0b43a14bfa7be77e852dc72ac0f..badef4c7ae8039213a6777fc5f6a3eb622f31bc3 100755 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -324,6 +324,22 @@ std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::PriorityQueue return s; } +// find the given object in the queue. +bool LLMediaDataClient::PriorityQueue::find(const LLMediaDataClientObject::ptr_t &obj) const +{ + std::vector<LLMediaDataClient::request_ptr_t>::const_iterator iter = c.begin(); + std::vector<LLMediaDataClient::request_ptr_t>::const_iterator end = c.end(); + while (iter < end) + { + if (obj->getID() == (*iter)->getObject()->getID()) + { + return true; + } + iter++; + } + return false; +} + ////////////////////////////////////////////////////////////////////////////////////// // // LLMediaDataClient::QueueTimer @@ -355,67 +371,87 @@ BOOL LLMediaDataClient::QueueTimer::tick() } LLMediaDataClient::PriorityQueue &queue = *(mMDC->pRequestQueue); - - if (queue.empty()) + + if(!queue.empty()) { - LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL; - return TRUE; + LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is: " << queue << LL_ENDL; } - LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is: " << queue << LL_ENDL; - - // Peel one off of the items from the queue, and execute request - request_ptr_t request = queue.top(); - llassert(!request.isNull()); - const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject(); - bool performed_request = false; - bool error = false; - llassert(NULL != object); - if (NULL != object && object->hasMedia()) + // quick retry loop for cases where we shouldn't wait for the next timer tick + while(true) { - std::string url = request->getCapability(); - if (!url.empty()) + if (queue.empty()) { - const LLSD &sd_payload = request->getPayload(); - LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL; - - // Call the subclass for creating the responder - LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request)); - performed_request = true; - } - else { - LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL; + return TRUE; } - } - else { - if (request.isNull()) + + // Peel one off of the items from the queue, and execute request + request_ptr_t request = queue.top(); + llassert(!request.isNull()); + const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject(); + bool performed_request = false; + bool error = false; + llassert(NULL != object); + + if(object->isDead()) { - LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL; + // This object has been marked dead. Pop it and move on to the next item in the queue immediately. + LL_INFOS("LLMediaDataClient") << "Skipping " << *request << ": object is dead!" << LL_ENDL; + queue.pop(); + continue; // jump back to the start of the quick retry loop } - else if (NULL == object) + + if (NULL != object && object->hasMedia()) { - LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL; + std::string url = request->getCapability(); + if (!url.empty()) + { + const LLSD &sd_payload = request->getPayload(); + LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL; + + // Call the subclass for creating the responder + LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request)); + performed_request = true; + } + else { + LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL; + } } - else if (!object->hasMedia()) - { - LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL; + else { + if (request.isNull()) + { + LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL; + } + else if (NULL == object) + { + LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL; + } + else if (!object->hasMedia()) + { + LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL; + } + error = true; } - error = true; - } - bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries; - if (performed_request || exceeded_retries || error) // Try N times before giving up - { - if (exceeded_retries) + bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries; + if (performed_request || exceeded_retries || error) // Try N times before giving up { - LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " - << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; - // XXX Should we bring up a warning dialog?? + if (exceeded_retries) + { + LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " + << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; + // XXX Should we bring up a warning dialog?? + } + queue.pop(); } - queue.pop(); - } - else { - request->incRetryCount(); - } + else { + request->incRetryCount(); + } + + // end of quick retry loop -- any cases where we want to loop will use 'continue' to jump back to the start. + break; + } + LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, queue is now: " << (*(mMDC->pRequestQueue)) << LL_ENDL; return queue.empty(); @@ -491,6 +527,11 @@ bool LLMediaDataClient::isEmpty() const return (NULL == pRequestQueue) ? true : pRequestQueue->empty(); } +bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object) const +{ + return (NULL == pRequestQueue) ? false : pRequestQueue->find(object); +} + ////////////////////////////////////////////////////////////////////////////////////// // // LLObjectMediaDataClient @@ -596,6 +637,9 @@ void LLObjectMediaNavigateClient::navigate(LLMediaDataClientObject *object, U8 t sd_payload[LLTextureEntry::OBJECT_ID_KEY] = object->getID(); sd_payload[LLMediaEntry::CURRENT_URL_KEY] = url; sd_payload[LLTextureEntry::TEXTURE_INDEX_KEY] = (LLSD::Integer)texture_index; + + LL_INFOS("LLMediaDataClient") << "navigate() initiated: " << ll_print_sd(sd_payload) << LL_ENDL; + request(object, sd_payload); } diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h index 9d0aa0981e77cb9a651f2fbf259467374dd838ab..d5dd050111faec3400001a7cbed9b27316eb1745 100755 --- a/indra/newview/llmediadataclient.h +++ b/indra/newview/llmediadataclient.h @@ -62,6 +62,8 @@ class LLMediaDataClientObject : public LLRefCount virtual F64 getTotalMediaInterest() const = 0; // Return the given cap url virtual std::string getCapabilityUrl(const std::string &name) const = 0; + // Return whether the object has been marked dead + virtual bool isDead() const = 0; // smart pointer typedef LLPointer<LLMediaDataClientObject> ptr_t; @@ -89,7 +91,10 @@ class LLMediaDataClient : public LLRefCount F32 getRetryTimerDelay() const { return mRetryTimerDelay; } // Returns true iff the queue is empty - bool isEmpty() const; + bool isEmpty() const; + + // Returns true iff the given object is in the queue + bool isInQueue(const LLMediaDataClientObject::ptr_t &object) const; protected: // Destructor @@ -206,6 +211,9 @@ class LLMediaDataClient : public LLRefCount Comparator > { public: + // Return whether the given object is in the queue + bool find(const LLMediaDataClientObject::ptr_t &obj) const; + friend std::ostream& operator<<(std::ostream &s, const PriorityQueue &q); }; diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp index b3aa67733b051c54e8abeb3c58d8b04fab3db4a7..cbe4cef12f8132208271b18bc42ddf30ae283477 100644 --- a/indra/newview/llmemoryview.cpp +++ b/indra/newview/llmemoryview.cpp @@ -130,8 +130,8 @@ void LLMemoryView::draw() curUpdate++; // setup window properly - S32 height = (S32) (gViewerWindow->getVirtualWindowRect().getHeight()*0.75f); - S32 width = (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.9f); + S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f); + S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.9f); setRect(LLRect().setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height)); // setup window color diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index e3ba1b8e4adb3b17a3297a9dc64f17ca691e029a..9e46a4422a6d3e463968631451ef0be518908a82 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -156,6 +156,31 @@ void LLFloaterMove::setEnabled(BOOL enabled) showModeButtons(enabled); } +// *NOTE: we assume that setVisible() is called on floater close. +// virtual +void LLFloaterMove::setVisible(BOOL visible) +{ + // Ignore excessive calls of this method (from LLTransientFloaterMgr?). + if (getVisible() == visible) + return; + + if (visible) + { + // Attach the Stand/Stop Flying panel. + LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance(); + ssf_panel->reparent(this); + const LLRect& mode_actions_rect = mModeActionsPanel->getRect(); + ssf_panel->setOrigin(mode_actions_rect.mLeft, mode_actions_rect.mBottom); + } + else + { + // Detach the Stand/Stop Flying panel. + LLPanelStandStopFlying::getInstance()->reparent(NULL); + } + + LLTransientDockableFloater::setVisible(visible); +} + // static F32 LLFloaterMove::getYawRate( F32 time ) { @@ -424,43 +449,6 @@ void LLFloaterMove::showModeButtons(BOOL bShow) if (NULL == mModeActionsPanel || mModeActionsPanel->getVisible() == bShow) return; mModeActionsPanel->setVisible(bShow); - - if (isDocked()) - { - return; - } - - updateHeight(bShow); -} - -void LLFloaterMove::updateHeight(bool show_mode_buttons) -{ - static bool size_changed = false; - static S32 origin_height = getRect().getHeight(); - LLRect rect = getRect(); - - static S32 mode_panel_height = mModeActionsPanel->getRect().getHeight(); - - S32 newHeight = getRect().getHeight(); - - if (!show_mode_buttons && origin_height == newHeight) - { - newHeight -= mode_panel_height; - size_changed = true; - } - else if (show_mode_buttons && origin_height > newHeight) - { - newHeight += mode_panel_height; - size_changed = true; - } - - if (!size_changed) - return; - - rect.setLeftTopAndSize(rect.mLeft, rect.mTop, rect.getWidth(), newHeight); - reshape(rect.getWidth(), rect.getHeight()); - setRect(rect); - size_changed = false; } //static @@ -504,14 +492,6 @@ void LLFloaterMove::onOpen(const LLSD& key) //virtual void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/) { - LLDockableFloater::setDocked(docked, pop_on_undock); - bool show_mode_buttons = isDocked() || !gAgent.getFlying(); - - if (!isMinimized()) - { - updateHeight(show_mode_buttons); - } - LLTransientDockableFloater::setDocked(docked, pop_on_undock); } @@ -535,7 +515,8 @@ void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode) /************************************************************************/ LLPanelStandStopFlying::LLPanelStandStopFlying() : mStandButton(NULL), - mStopFlyingButton(NULL) + mStopFlyingButton(NULL), + mAttached(false) { // make sure we have the only instance of this class static bool b = true; @@ -605,7 +586,8 @@ void LLPanelStandStopFlying::setVisible(BOOL visible) updatePosition(); } - LLPanel::setVisible(visible); + //change visibility of parent layout_panel to animate in/out + if (getParent()) getParent()->setVisible(visible); } BOOL LLPanelStandStopFlying::handleToolTip(S32 x, S32 y, MASK mask) @@ -624,6 +606,45 @@ BOOL LLPanelStandStopFlying::handleToolTip(S32 x, S32 y, MASK mask) return TRUE; } +void LLPanelStandStopFlying::reparent(LLFloaterMove* move_view) +{ + LLPanel* parent = dynamic_cast<LLPanel*>(getParent()); + if (!parent) + { + llwarns << "Stand/stop flying panel parent is unset" << llendl; + return; + } + + if (move_view != NULL) + { + llassert(move_view != parent); // sanity check + + // Save our original container. + if (!mOriginalParent.get()) + mOriginalParent = parent->getHandle(); + + // Attach to movement controls. + parent->removeChild(this); + move_view->addChild(this); + // Origin must be set by movement controls. + mAttached = true; + } + else + { + if (!mOriginalParent.get()) + { + llwarns << "Original parent of the stand / stop flying panel not found" << llendl; + return; + } + + // Detach from movement controls. + parent->removeChild(this); + mOriginalParent.get()->addChild(this); + mAttached = false; + updatePosition(); // don't defer until next draw() to avoid flicker + } +} + ////////////////////////////////////////////////////////////////////////// // Private Section ////////////////////////////////////////////////////////////////////////// @@ -668,27 +689,14 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick() */ void LLPanelStandStopFlying::updatePosition() { - LLBottomTray* tray = LLBottomTray::getInstance(); - if (!tray) return; + if (!tray || mAttached) return; LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); - //align centers of a button and a floater + // Align centers of the button and the panel. S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - - S32 y = 0; - - LLFloater *move_floater = LLFloaterReg::findInstance("moveview"); - if (move_floater) - { - if (move_floater->isDocked()) - { - y = move_floater->getRect().mBottom + getRect().getHeight(); - } - } - - setOrigin(x, y); + setOrigin(x, 0); } diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index cee6078ee990530f5fb01ca44325adb68224d40a..06463f02af2debede64dc2792a2d8100e2fce95f 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -46,6 +46,7 @@ class LLJoystickAgentSlide; class LLFloaterMove : public LLTransientDockableFloater { + LOG_CLASS(LLFloaterMove); friend class LLFloaterReg; private: @@ -55,6 +56,7 @@ class LLFloaterMove /*virtual*/ BOOL postBuild(); /*virtual*/ void setEnabled(BOOL enabled); + /*virtual*/ void setVisible(BOOL visible); static F32 getYawRate(F32 time); static void setFlyingMode(BOOL fly); void setFlyingModeImpl(BOOL fly); @@ -96,7 +98,6 @@ class LLFloaterMove void updateButtonsWithMovementMode(const EMovementMode newMode); void updatePosition(); void showModeButtons(BOOL bShow); - void updateHeight(bool show_mode_buttons); public: @@ -126,6 +127,7 @@ class LLFloaterMove */ class LLPanelStandStopFlying : public LLPanel { + LOG_CLASS(LLPanelStandStopFlying); public: typedef enum stand_stop_flying_mode_t { @@ -133,6 +135,19 @@ class LLPanelStandStopFlying : public LLPanel SSFM_STOP_FLYING } EStandStopFlyingMode; + /** + * Attach or detach the panel to/from the movement controls floater. + * + * Called when the floater gets opened/closed, user sits, stands up or starts/stops flying. + * + * @param move_view The floater to attach to (not always accessible via floater registry). + * If NULL is passed, the panel gets reparented to its original container. + * + * @see mAttached + * @see mOriginalParent + */ + void reparent(LLFloaterMove* move_view); + static LLPanelStandStopFlying* getInstance(); static void setStandStopFlyingMode(EStandStopFlyingMode mode); static void clearStandStopFlyingMode(EStandStopFlyingMode mode); @@ -157,6 +172,23 @@ class LLPanelStandStopFlying : public LLPanel LLButton* mStandButton; LLButton* mStopFlyingButton; + + /** + * The original parent of the panel. + * + * Makes it possible to move (reparent) the panel to the movement controls floater and back. + * + * @see reparent() + */ + LLHandle<LLPanel> mOriginalParent; + + /** + * True if the panel is currently attached to the movement controls floater. + * + * @see reparent() + * @see updatePosition() + */ + bool mAttached; }; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 541db0ca6e1bb2fa02d68e11908b951bebfd9d68..7e6145f578fdff64fe1837480a174196c999b27f 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -143,11 +143,14 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) BOOL handled = FALSE; S32 column_index = getColumnIndexFromOffset(x); LLScrollListItem* hit_item = hitItem(x, y); - if (hit_item) + if (hit_item + && column_index == mNameColumnIndex) { - if (column_index == mNameColumnIndex) + // ...this is the column with the avatar name + LLUUID avatar_id = hit_item->getValue().asUUID(); + if (avatar_id.notNull()) { - // ...this is the column with the avatar name + // ...valid avatar id LLScrollListCell* hit_cell = hit_item->getColumn(column_index); if (hit_cell) { @@ -160,7 +163,6 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) // Spawn at right side of cell LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop ); LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); - LLUUID avatar_id = hit_item->getValue().asUUID(); LLToolTip::Params params; params.background_visible( false ); @@ -323,8 +325,8 @@ void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first, LLInstanceTracker<LLNameListCtrl>::instance_iter it; for (it = beginInstances(); it != endInstances(); ++it) { - LLNameListCtrl* ctrl = *it; - ctrl->refresh(id, first, last, is_group); + LLNameListCtrl& ctrl = *it; + ctrl.refresh(id, first, last, is_group); } } diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 17b712bc5e81d79574df1e7f96fb52b1ebe60432..41376c4c097d9ab7ece339c0a675d31da5f7fc31 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -172,7 +172,8 @@ LLNavigationBar::LLNavigationBar() mBtnHome(NULL), mCmbLocation(NULL), mSearchComboBox(NULL), - mPurgeTPHistoryItems(false) + mPurgeTPHistoryItems(false), + mSaveToLocationHistory(false) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml"); @@ -186,7 +187,7 @@ LLNavigationBar::LLNavigationBar() LLNavigationBar::~LLNavigationBar() { mTeleportFinishConnection.disconnect(); - LLSearchHistory::getInstance()->save(); + mTeleportFailedConnection.disconnect(); } BOOL LLNavigationBar::postBuild() @@ -217,10 +218,16 @@ BOOL LLNavigationBar::postBuild() mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this)); - mCmbLocation->setSelectionCallback(boost::bind(&LLNavigationBar::onLocationSelection, this)); + mCmbLocation->setCommitCallback(boost::bind(&LLNavigationBar::onLocationSelection, this)); mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this)); + mTeleportFinishConnection = LLViewerParcelMgr::getInstance()-> + setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1)); + + mTeleportFailedConnection = LLViewerParcelMgr::getInstance()-> + setTeleportFailedCallback(boost::bind(&LLNavigationBar::onTeleportFailed, this)); + mDefaultNbRect = getRect(); mDefaultFpRect = getChild<LLFavoritesBarCtrl>("favorite")->getRect(); @@ -231,6 +238,16 @@ BOOL LLNavigationBar::postBuild() return TRUE; } +void LLNavigationBar::setVisible(BOOL visible) +{ + // change visibility of grandparent layout_panel to animate in and out + if (getParent() && getParent()->getParent()) + { + getParent()->getParent()->setVisible(visible); + } +} + + void LLNavigationBar::fillSearchComboBox() { if(!mSearchComboBox) @@ -396,15 +413,19 @@ void LLNavigationBar::onLocationSelection() LLWorldMapMessage::url_callback_t cb = boost::bind( &LLNavigationBar::onRegionNameResponse, this, typed_location, region_name, local_coords, _1, _2, _3, _4); - // connect the callback each time, when user enter new location to get real location of agent after teleport - mTeleportFinishConnection = LLViewerParcelMgr::getInstance()-> - setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1,typed_location)); + mSaveToLocationHistory = true; LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false); } -void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location) +void LLNavigationBar::onTeleportFailed() { - // Location is valid. Add it to the typed locations history. + mSaveToLocationHistory = false; +} + +void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos) +{ + if (!mSaveToLocationHistory) + return; LLLocationHistory* lh = LLLocationHistory::getInstance(); //TODO*: do we need convert surl into readable format? @@ -414,7 +435,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con * At this moment gAgent.getPositionAgent() contains previous coordinates. * according to EXT-65 agent position is being reseted on each frame. */ - LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM, + 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)); @@ -427,8 +448,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con lh->save(); - if(mTeleportFinishConnection.connected()) - mTeleportFinishConnection.disconnect(); + mSaveToLocationHistory = false; } @@ -480,7 +500,7 @@ void LLNavigationBar::rebuildTeleportHistoryMenu() type = LLTeleportHistoryMenuItem::TYPE_CURRENT; LLTeleportHistoryMenuItem::Params item_params; - item_params.label = item_params.name = hist_items[i].getTitle(); + item_params.label = item_params.name = hist_items[i].mTitle; item_params.item_type = type; item_params.on_click.function(boost::bind(&LLNavigationBar::onTeleportHistoryMenuItemClicked, this, i)); LLTeleportHistoryMenuItem* new_itemp = LLUICtrlFactory::create<LLTeleportHistoryMenuItem>(item_params); diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 52f5a827e4b17bdc232cb72a710e8d771cce74cf..9d0687f193d9058dc0216858b6a09b730c97c204 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -56,6 +56,7 @@ class LLNavigationBar /*virtual*/ void draw(); /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL postBuild(); + /*virtual*/ void setVisible(BOOL visible); void handleLoginComplete(); void clearHistoryCache(); @@ -81,7 +82,8 @@ class LLNavigationBar void onLocationSelection(); void onLocationPrearrange(const LLSD& data); void onSearchCommit(); - void onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location); + void onTeleportFinished(const LLVector3d& global_agent_pos); + void onTeleportFailed(); void onRegionNameResponse( std::string typed_location, std::string region_name, @@ -99,8 +101,11 @@ class LLNavigationBar LLLocationInputCtrl* mCmbLocation; LLRect mDefaultNbRect; LLRect mDefaultFpRect; + boost::signals2::connection mTeleportFailedConnection; boost::signals2::connection mTeleportFinishConnection; bool mPurgeTPHistoryItems; + // if true, save location to location history when teleport finishes + bool mSaveToLocationHistory; }; #endif diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 974291a54e8eaaf30fe54a366d10f0fcd50dab2d..80a6cc343fae56c615ffa23e316ff280c5261b87 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -89,8 +89,6 @@ BOOL LLNearbyChat::postBuild() mChatHistory = getChild<LLChatHistory>("chat_history"); - setCanResize(true); - if(!LLDockableFloater::postBuild()) return false; @@ -98,7 +96,7 @@ BOOL LLNearbyChat::postBuild() { setDockControl(new LLDockControl( LLBottomTray::getInstance()->getNearbyChatBar(), this, - getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); + getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); } return true; @@ -132,120 +130,61 @@ void LLNearbyChat::applySavedVariables() } } -LLColor4 nearbychat_get_text_color(const LLChat& chat) -{ - LLColor4 text_color; - - if(chat.mMuted) - { - text_color.setVec(0.8f, 0.8f, 0.8f, 1.f); - } - else - { - switch(chat.mSourceType) - { - case CHAT_SOURCE_SYSTEM: - text_color = LLUIColorTable::instance().getColor("SystemChatColor"); - break; - case CHAT_SOURCE_AGENT: - if (chat.mFromID.isNull()) - { - text_color = LLUIColorTable::instance().getColor("SystemChatColor"); - } - else - { - if(gAgentID == chat.mFromID) - { - text_color = LLUIColorTable::instance().getColor("UserChatColor"); - } - else - { - text_color = LLUIColorTable::instance().getColor("AgentChatColor"); - } - } - break; - case CHAT_SOURCE_OBJECT: - if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) - { - text_color = LLUIColorTable::instance().getColor("ScriptErrorColor"); - } - else if ( chat.mChatType == CHAT_TYPE_OWNER ) - { - text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor"); - } - else - { - text_color = LLUIColorTable::instance().getColor("ObjectChatColor"); - } - break; - default: - text_color.setToWhite(); - } - - if (!chat.mPosAgent.isExactlyZero()) - { - LLVector3 pos_agent = gAgent.getPositionAgent(); - F32 distance = dist_vec(pos_agent, chat.mPosAgent); - if (distance > gAgent.getNearChatRadius()) - { - // diminish far-off chat - text_color.mV[VALPHA] = 0.8f; - } - } - } - - return text_color; -} - -void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color) -{ - S32 font_size = gSavedSettings.getS32("ChatFontSize"); - - const LLFontGL* fontp = NULL; - switch(font_size) - { - case 0: - fontp = LLFontGL::getFontSansSerifSmall(); - break; - default: - case 1: - fontp = LLFontGL::getFontSansSerif(); - break; - case 2: - fontp = LLFontGL::getFontSansSerifBig(); - break; - } - - LLStyle::Params style_params; - style_params.color(color); - style_params.font(fontp); - LLUUID uuid = chat.mFromID; - std::string from = chat.mFromName; - std::string message = chat.mText; - mChatHistory->appendWidgetMessage(chat, style_params); -} - void LLNearbyChat::addMessage(const LLChat& chat) { - LLColor4 color = nearbychat_get_text_color(chat); - 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, - color, + txt_color, chat.mFromID); return; } } - // could flash the chat button in the status bar here. JC if (!chat.mMuted) - add_timestamped_line(chat, color); + { + std::string message = chat.mText; + std::string prefix = message.substr(0, 4); + + if (chat.mChatStyle == CHAT_STYLE_IRC) + { + LLColor4 txt_color = LLUIColorTable::instance().getColor("White"); + LLViewerChat::getChatColor(chat,txt_color); + LLFontGL* fontp = LLViewerChat::getChatFont(); + std::string font_name = LLFontGL::nameFromFont(fontp); + std::string font_size = LLFontGL::sizeFromFont(fontp); + LLStyle::Params append_style_params; + append_style_params.color(txt_color); + append_style_params.readonly_color(txt_color); + append_style_params.font.name(font_name); + append_style_params.font.size(font_size); + if (chat.mFromName.size() > 0) + { + append_style_params.font.style = "ITALIC"; + LLChat add_chat=chat; + add_chat.mText = chat.mFromName + " "; + mChatHistory->appendMessage(add_chat, false, append_style_params); + } + + message = message.substr(3); + append_style_params.font.style = "ITALIC"; + mChatHistory->appendText(message, FALSE, append_style_params); + } + else + { + mChatHistory->appendMessage(chat); + } + } } void LLNearbyChat::onNearbySpeakers() @@ -276,13 +215,6 @@ void LLNearbyChat::onOpen(const LLSD& key ) } } -void LLNearbyChat::setDocked (bool docked, bool pop_on_undock) -{ - LLDockableFloater::setDocked(docked, pop_on_undock); - - setCanResize(!docked); -} - void LLNearbyChat::setRect (const LLRect &rect) { LLDockableFloater::setRect(rect); @@ -290,7 +222,5 @@ void LLNearbyChat::setRect (const LLRect &rect) void LLNearbyChat::getAllowedRect(LLRect& rect) { - rect = gViewerWindow->getWorldViewRect(); + rect = gViewerWindow->getWorldViewRectScaled(); } - - diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index cb4654654a952562b21b252153de284759ad3516..561c2d3677699f16b2c272d933cc0c1d2cc51b92 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -35,7 +35,7 @@ #include "lldockablefloater.h" #include "llscrollbar.h" -#include "llchat.h" +#include "llviewerchat.h" class LLResizeBar; class LLChatHistory; @@ -47,13 +47,10 @@ class LLNearbyChat: public LLDockableFloater ~LLNearbyChat(); BOOL postBuild (); - void addMessage (const LLChat& message); - + void addMessage (const LLChat& message); void onNearbyChatContextMenuItemClicked(const LLSD& userdata); bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); - void setDocked (bool docked, bool pop_on_undock = true); - /*virtual*/ void onOpen (const LLSD& key); virtual void setRect (const LLRect &rect); @@ -64,7 +61,6 @@ class LLNearbyChat: public LLDockableFloater void getAllowedRect (LLRect& rect); void onNearbySpeakers (); - void add_timestamped_line(const LLChat& chat, const LLColor4& color); private: diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index d54545971bbb684ef9b304941623e46720b851f6..8fb4ea42119eb226eb45eb6a4af62dafe0892dda 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -36,7 +36,6 @@ #include "lltrans.h" #include "llnearbychatbar.h" -#include "llspeakbutton.h" #include "llbottomtray.h" #include "llagent.h" #include "llgesturemgr.h" @@ -98,9 +97,10 @@ void LLGestureComboBox::refreshGestures() clearRows(); mGestures.clear(); - LLGestureManager::item_map_t::iterator it; + LLGestureManager::item_map_t::const_iterator it; + const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures(); LLSD::Integer idx(0); - for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it) + for (it = active_gestures.begin(); it != active_gestures.end(); ++it) { LLMultiGesture* gesture = (*it).second; if (gesture) @@ -234,14 +234,6 @@ BOOL LLNearbyChatBar::postBuild() mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator"); mOutputMonitor->setVisible(FALSE); - mSpeakBtn = getParent()->getChild<LLSpeakButton>("talk"); - - // Speak button should be initially disabled because - // it takes some time between logging in to world and connecting to voice channel. - mSpeakBtn->setEnabled(FALSE); - - // Registering Chat Bar to receive Voice client status change notifications. - gVoiceClient->addObserver(this); return TRUE; } @@ -260,16 +252,6 @@ bool LLNearbyChatBar::instanceExists() void LLNearbyChatBar::draw() { - LLRect rect = getRect(); - S32 max_width = getMaxWidth(); - - if (rect.getWidth() > max_width) - { - rect.setLeftTopAndSize(rect.mLeft, rect.mTop, max_width, rect.getHeight()); - reshape(rect.getWidth(), rect.getHeight(), FALSE); - setRect(rect); - } - displaySpeakingIndicator(); LLPanel::draw(); } @@ -730,27 +712,6 @@ class LLChatHandler : public LLCommandHandler } }; -void LLNearbyChatBar::onChange(EStatusType status, const std::string &channelURI, bool proximal) -{ - // Time it takes to connect to voice channel might be pretty long, - // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED. - BOOL enable = FALSE; - - switch (status) - { - // Do not add STATUS_VOICE_ENABLED because voice chat is - // inactive until STATUS_JOINED - case STATUS_JOINED: - enable = TRUE; - break; - default: - enable = FALSE; - break; - } - - mSpeakBtn->setEnabled(enable); -} - // Creating the object registers with the dispatcher. LLChatHandler gChatHandler; diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 56ee706a9746a865c7ea2c49d77bfc5203ef04b5..224118e088d6db9300babb35076c74593b4ad1a5 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -42,9 +42,6 @@ #include "llspeakers.h" -class LLSpeakButton; - - class LLGestureComboBox : public LLComboBox , public LLGestureManagerObserver @@ -76,7 +73,6 @@ class LLGestureComboBox class LLNearbyChatBar : public LLPanel -, public LLVoiceClientStatusObserver { public: // constructor for inline chat-bars (e.g. hosted in chat history window) @@ -105,11 +101,6 @@ class LLNearbyChatBar S32 getMinWidth() const; S32 getMaxWidth() const; - /** - * Implements LLVoiceClientStatusObserver::onChange() - */ - /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); - protected: static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str); static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata); @@ -127,7 +118,6 @@ class LLNearbyChatBar static S32 sLastSpecialChatChannel; LLLineEditor* mChatBox; - LLSpeakButton* mSpeakBtn; LLOutputMonitorCtrl* mOutputMonitor; LLLocalSpeakerMgr* mSpeakerMgr; }; diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 8a8ad9d073fc65b9df128bed5f1f2949eb9a4b84..74a75d036959ec634e353796b94e8b886519bd1b 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -63,8 +63,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase public: LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;}; - void init (S32 channel_left, S32 channel_right); - void addNotification (LLSD& notification); void arrangeToasts (); void showToastsBottom (); @@ -120,15 +118,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase bool mStopProcessing; }; -void LLNearbyChatScreenChannel::init(S32 channel_left, S32 channel_right) -{ - S32 channel_top = gViewerWindow->getWorldViewRect().getHeight(); - S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom; - setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom)); - setVisible(TRUE); -} - - void LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer) { //we don't need overflow toast in nearby chat @@ -223,7 +212,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) void LLNearbyChatScreenChannel::arrangeToasts() { - if(m_active_toasts.size() == 0 || mIsHovering) + if(m_active_toasts.size() == 0 || isHovering()) return; hideToastsFromScreen(); @@ -332,7 +321,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg) //only messages from AGENTS if(CHAT_SOURCE_OBJECT == chat_msg.mSourceType) { - return;//dn't show toast for messages from objects + if(chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG) + return;//ok for now we don't skip messeges from object, so skip only debug messages } LLUUID id; @@ -351,7 +341,15 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg) notification["time"] = chat_msg.mTime; notification["source"] = (S32)chat_msg.mSourceType; notification["chat_type"] = (S32)chat_msg.mChatType; - + notification["chat_style"] = (S32)chat_msg.mChatStyle; + + std::string r_color_name = "White"; + F32 r_color_alpha = 1.0f; + LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha); + + notification["text_color"] = r_color_name; + notification["color_alpha"] = r_color_alpha; + notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ; channel->addNotification(notification); } diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 6145588df285092709f34af3b37b9918418b69e6..234fe13217f935efba7c0151a149d326418aed4e 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -92,7 +92,6 @@ LLNetMap::LLNetMap (const Params & p) mObjectImagep(), mClosestAgentToCursor(), mClosestAgentAtLastRightClick(), - mRotateMap(FALSE), mToolTipMsg() { mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS); @@ -175,7 +174,8 @@ void LLNetMap::draw() gGL.translatef( (F32) center_sw_left, (F32) center_sw_bottom, 0.f); - if( mRotateMap ) + static LLUICachedControl<bool> rotate_map("MiniMapRotate", true); + if( rotate_map ) { // rotate subsequent draws to agent rotation rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ); @@ -408,7 +408,7 @@ void LLNetMap::draw() gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - if( mRotateMap ) + if( rotate_map ) { gGL.color4fv((map_frustum_color()).mV); @@ -454,7 +454,8 @@ LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos ) pos_local.mV[VY] *= mPixelsPerMeter; // leave Z component in meters - if( mRotateMap ) + static LLUICachedControl<bool> rotate_map("MiniMapRotate", true); + if( rotate_map ) { F32 radians = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ); LLQuaternion rot(radians, LLVector3(0.f, 0.f, 1.f)); @@ -502,7 +503,8 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y ) F32 radians = - atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ); - if( mRotateMap ) + static LLUICachedControl<bool> rotate_map("MiniMapRotate", true); + if( rotate_map ) { LLQuaternion rot(radians, LLVector3(0.f, 0.f, 1.f)); pos_local.rotVec( rot ); diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 7088ab3e70c08c965b8fec78e8845e831b81e909..3d7f3233acb2a55806010a35aad96c0774247bf5 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -80,9 +80,7 @@ class LLNetMap : public LLUICtrl /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); void setScale( F32 scale ); - void setRotateMap( BOOL b ) { mRotateMap = b; } void setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; } - BOOL getRotateMap( ) { return mRotateMap; } void renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius ); private: @@ -122,7 +120,6 @@ class LLNetMap : public LLUICtrl LLUUID mClosestAgentToCursor; LLUUID mClosestAgentAtLastRightClick; - BOOL mRotateMap; std::string mToolTipMsg; }; diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 1be03cef0b57be4e2f05e28ad5e1954761eaea06..5c11bc7310a3c64db6aae4c6369e3878d71200ce 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -66,7 +66,7 @@ LLAlertHandler::~LLAlertHandler() //-------------------------------------------------------------------------- void LLAlertHandler::initChannel() { - S32 channel_right_bound = gViewerWindow->getWorldViewRect().getWidth() / 2; + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().getWidth() / 2; mChannel->init(channel_right_bound, channel_right_bound); } diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index ffa92b543cc459344760b7ce7b24effd47fae34d..b7466ec6d4f199e8a72b3b642e2a8d53dff0ebed 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -37,6 +37,7 @@ #include "llgroupactions.h" #include "llviewercontrol.h" #include "llviewerwindow.h" +#include "llnotificationmanager.h" using namespace LLNotificationsUI; @@ -47,6 +48,9 @@ LLGroupHandler::LLGroupHandler(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(&LLGroupHandler::onRejectToast, this, _1)); } //-------------------------------------------------------------------------- @@ -57,7 +61,7 @@ LLGroupHandler::~LLGroupHandler() //-------------------------------------------------------------------------- void LLGroupHandler::initChannel() { - S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); mChannel->init(channel_right_bound - channel_width, channel_right_bound); } @@ -118,5 +122,15 @@ void LLGroupHandler::onDeleteToast(LLToast* toast) } //-------------------------------------------------------------------------- +void LLGroupHandler::onRejectToast(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/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 23998a0e5d1bbef91e4ff232d495c41ac7f1df51..42cc7cacc238e5e38a6c8619e3f2973981e1ca30 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -209,6 +209,9 @@ class LLGroupHandler : public LLSysHandler protected: virtual void onDeleteToast(LLToast* toast); virtual void initChannel(); + + // own handlers + void onRejectToast(LLUUID& id); }; /** diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 75ef5208e76329227b84ee25beb27f29be589402..0a595765a92f582ff62968a1c45003e708fe0c73 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -65,7 +65,7 @@ LLOfferHandler::~LLOfferHandler() //-------------------------------------------------------------------------- void LLOfferHandler::initChannel() { - S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); mChannel->init(channel_right_bound - channel_width, channel_right_bound); } @@ -92,21 +92,26 @@ bool LLOfferHandler::processNotification(const LLSD& notify) if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change") { // add message to IM - LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]); - if (!LLIMMgr::instance().hasSession(session_id)) + const std::string + name = + notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"] + : notification->getSubstitutions()["[NAME]"]; + + // don't create IM session with objects + if (notification->getName() != "ObjectGiveItem" + && notification->getName() != "ObjectGiveItemUnknownUser") { - // create session with faked type to avoid creating chicklets - session_id = LLIMMgr::instance().addSession( - notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL, - notification->getPayload()["from_id"]); - if (session_id != LLUUID::null) + LLUUID from_id = notification->getPayload()["from_id"]; + LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, + from_id); + if (!LLIMMgr::instance().hasSession(session_id)) { - LLIMFloater::show(session_id); + session_id = LLIMMgr::instance().addSession(name, + IM_NOTHING_SPECIAL, from_id); } + LLIMMgr::instance().addMessage(session_id, LLUUID(), name, + notification->getMessage()); } - LLIMMgr::instance().addMessage(session_id, LLUUID(), - notification->getSubstitutions()["NAME"], - notification->getMessage()); LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index dac7a4ca3a4eecce8a7a83af4305bf813ff3eb0c..f01f2e44414448be4674754f9e039ab40dd9ea93 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -38,9 +38,13 @@ #include "llviewercontrol.h" #include "llviewerwindow.h" #include "llnotificationmanager.h" +#include "llscriptfloater.h" using namespace LLNotificationsUI; +static const std::string SCRIPT_DIALOG ("ScriptDialog"); +static const std::string SCRIPT_DIALOG_GROUP ("ScriptDialogGroup"); + //-------------------------------------------------------------------------- LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id) { @@ -64,7 +68,7 @@ LLScriptHandler::~LLScriptHandler() //-------------------------------------------------------------------------- void LLScriptHandler::initChannel() { - S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); mChannel->init(channel_right_bound - channel_width, channel_right_bound); } @@ -90,25 +94,40 @@ bool LLScriptHandler::processNotification(const LLSD& notify) if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change") { - LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); - - LLToast::Params p; - p.notif_id = notification->getID(); - p.notification = notification; - p.panel = notify_box; - p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1); - - LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); - if(channel) - channel->addToast(p); - - // send a signal to the counter manager - mNewNotificationSignal(); - + if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) + { + LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID()); + } + else + { + LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); + + LLToast::Params p; + p.notif_id = notification->getID(); + p.notification = notification; + p.panel = notify_box; + p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1); + + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); + if(channel) + { + channel->addToast(p); + } + + // send a signal to the counter manager + mNewNotificationSignal(); + } } else if (notify["sigtype"].asString() == "delete") { - mChannel->killToastByNotificationID(notification->getID()); + if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) + { + LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID()); + } + else + { + mChannel->killToastByNotificationID(notification->getID()); + } } return true; } @@ -123,6 +142,14 @@ void LLScriptHandler::onDeleteToast(LLToast* toast) // 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 mNotificationIDSignal(toast->getNotificationID()); + + LLNotificationPtr notification = LLNotifications::getInstance()->find(toast->getNotificationID()); + + if( notification && + (SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) ) + { + LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID()); + } } //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 543198c1d2158c8aa62d92d54465b4a2b95c4f84..b962fa218401d820afd6d1ce81c758ca9e3bc7aa 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -60,7 +60,7 @@ LLTipHandler::~LLTipHandler() //-------------------------------------------------------------------------- void LLTipHandler::initChannel() { - S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); mChannel->init(channel_right_bound - channel_width, channel_right_bound); } @@ -91,6 +91,7 @@ bool LLTipHandler::processNotification(const LLSD& notify) if(nearby_chat) { LLChat chat_msg(notification->getMessage()); + chat_msg.mSourceType = CHAT_SOURCE_SYSTEM; nearby_chat->addMessage(chat_msg); // don't show toast if Nearby Chat is opened diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index 8a9ba66ec0bb47594eff1921c796b31f8f3c5579..c2f8dbd074a12cbc23865988f3d54968073eff09 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -53,12 +53,8 @@ class LLPanelAppearanceTab : public LLPanel bool isTabVisible(); // Check if parent TabContainer is visible. - void setPanelAppearanceButtons(LLPanelAppearance* panel); - protected: - LLButton* mWearBtn; - LLButton* mEditBtn; LLPanelAppearance* mParent; }; diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 3b54f1546e8ce996d7dc9c4b6fc1b03ebed53f2c..2c27808f036f324c0d5d774967373330772aaa01 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -38,9 +38,11 @@ #include "llavatarconstants.h" // AVATAR_ONLINE #include "llcallingcard.h" #include "llcombobox.h" +#include "lldateutil.h" // ageFromDate() #include "llimview.h" #include "lltexteditor.h" #include "lltexturectrl.h" +#include "lltoggleablemenu.h" #include "lltooldraganddrop.h" #include "llscrollcontainer.h" #include "llavatariconctrl.h" @@ -118,7 +120,7 @@ BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, static LLDefaultChildRegistry::Register<LLDropTarget> r("drop_target"); static LLRegisterPanelClassWrapper<LLPanelAvatarProfile> t_panel_profile("panel_profile"); -static LLRegisterPanelClassWrapper<LLPanelAvatarMeProfile> t_panel_me_profile("panel_me_profile"); +static LLRegisterPanelClassWrapper<LLPanelMyProfile> t_panel_my_profile("panel_my_profile"); static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes"); //----------------------------------------------------------------------------- @@ -333,8 +335,14 @@ BOOL LLPanelAvatarProfile::postBuild() childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL); childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL); childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL); + childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL); childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL); + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this)); + + mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic"); pic->setFallbackImageName("default_profile_picture.j2c"); @@ -351,7 +359,7 @@ void LLPanelAvatarProfile::onOpen(const LLSD& key) { LLPanelProfileTab::onOpen(key); - mGroups.erase(); + mGroups.clear(); //Disable "Add Friend" button for friends. childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId())); @@ -383,7 +391,7 @@ void LLPanelAvatarProfile::resetControls() void LLPanelAvatarProfile::resetData() { - mGroups.erase(); + mGroups.clear(); childSetValue("2nd_life_pic",LLUUID::null); childSetValue("real_world_pic",LLUUID::null); childSetValue("online_status",LLStringUtil::null); @@ -435,23 +443,29 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g // Group properties may arrive in two callbacks, we need to save them across // different calls. We can't do that in textbox as textbox may change the text. - std::string groups = mGroups; LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin(); const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end(); - if(groups.empty() && it_end != it) - { - groups = (*it).group_name; - ++it; - } for(; it_end != it; ++it) { LLAvatarGroups::LLGroupData group_data = *it; - groups += ", "; - groups += group_data.group_name; + + // Check if there is no duplicates for this group + if (std::find(mGroups.begin(), mGroups.end(), group_data.group_name) == mGroups.end()) + mGroups.push_back(group_data.group_name); + } + + // Creating string, containing group list + std::string groups = ""; + for (group_list_t::const_iterator it = mGroups.begin(); it != mGroups.end(); ++it) + { + if (it != mGroups.begin()) + groups += ", "; + + groups += *it; } - mGroups = groups; - childSetValue("sl_groups",mGroups); + + childSetValue("sl_groups", groups); } void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data) @@ -459,8 +473,11 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data) //remove avatar id from cache to get fresh info LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id); - - childSetValue("register_date", avatar_data->born_on ); + LLStringUtil::format_map_t args; + args["[REG_DATE]"] = avatar_data->born_on; + args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now()); + std::string register_date = getString("RegisterDateFormat", args); + childSetValue("register_date", register_date ); childSetValue("sl_description_edit", avatar_data->about_text); childSetValue("fl_description_edit",avatar_data->fl_about_text); childSetValue("2nd_life_pic", avatar_data->image_id); @@ -513,6 +530,11 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data) childSetValue("acc_status_text", caption_text); } +void LLPanelAvatarProfile::pay() +{ + LLAvatarActions::pay(getAvatarId()); +} + void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url) { LLWeb::loadURL(url); @@ -552,23 +574,40 @@ void LLPanelAvatarProfile::onShareButtonClick() //*TODO not implemented } +void LLPanelAvatarProfile::onOverflowButtonClicked() +{ + if (!mProfileMenu->toggleVisibility()) + return; + + LLView* btn = getChild<LLView>("overflow_btn"); + + if (mProfileMenu->getButtonRect().isEmpty()) + { + mProfileMenu->setButtonRect(btn); + } + mProfileMenu->updateParent(LLMenuGL::sMenuContainer); + + LLRect rect = btn->getRect(); + LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop); +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// -LLPanelAvatarMeProfile::LLPanelAvatarMeProfile() +LLPanelMyProfile::LLPanelMyProfile() : LLPanelAvatarProfile() { } -BOOL LLPanelAvatarMeProfile::postBuild() +BOOL LLPanelMyProfile::postBuild() { LLPanelAvatarProfile::postBuild(); mStatusCombobox = getChild<LLComboBox>("status_combo"); - childSetCommitCallback("status_combo", boost::bind(&LLPanelAvatarMeProfile::onStatusChanged, this), NULL); - childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelAvatarMeProfile::onStatusMessageChanged, this), NULL); + childSetCommitCallback("status_combo", boost::bind(&LLPanelMyProfile::onStatusChanged, this), NULL); + childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelMyProfile::onStatusMessageChanged, this), NULL); resetControls(); resetData(); @@ -576,12 +615,12 @@ BOOL LLPanelAvatarMeProfile::postBuild() return TRUE; } -void LLPanelAvatarMeProfile::onOpen(const LLSD& key) +void LLPanelMyProfile::onOpen(const LLSD& key) { LLPanelProfileTab::onOpen(key); } -void LLPanelAvatarMeProfile::processProfileProperties(const LLAvatarData* avatar_data) +void LLPanelMyProfile::processProfileProperties(const LLAvatarData* avatar_data) { fillCommonData(avatar_data); @@ -592,7 +631,7 @@ void LLPanelAvatarMeProfile::processProfileProperties(const LLAvatarData* avatar fillAccountStatus(avatar_data); } -void LLPanelAvatarMeProfile::fillStatusData(const LLAvatarData* avatar_data) +void LLPanelMyProfile::fillStatusData(const LLAvatarData* avatar_data) { std::string status; if (gAgent.getAFK()) @@ -611,7 +650,7 @@ void LLPanelAvatarMeProfile::fillStatusData(const LLAvatarData* avatar_data) mStatusCombobox->setValue(status); } -void LLPanelAvatarMeProfile::resetControls() +void LLPanelMyProfile::resetControls() { childSetVisible("status_panel", false); childSetVisible("profile_buttons_panel", false); @@ -621,7 +660,7 @@ void LLPanelAvatarMeProfile::resetControls() childSetVisible("profile_me_buttons_panel", true); } -void LLPanelAvatarMeProfile::onStatusChanged() +void LLPanelMyProfile::onStatusChanged() { LLSD::String status = mStatusCombobox->getValue().asString(); @@ -643,7 +682,7 @@ void LLPanelAvatarMeProfile::onStatusChanged() } } -void LLPanelAvatarMeProfile::onStatusMessageChanged() +void LLPanelMyProfile::onStatusMessageChanged() { updateData(); } diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index ae0b8e98449f893b2fc2f4f419c20cf632fb480b..716bb29d45657ce91ec6c003ca9073c1eda4bce0 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -38,6 +38,7 @@ class LLComboBox; class LLLineEditor; +class LLToggleableMenu; enum EOnlineStatus { @@ -46,7 +47,7 @@ enum EOnlineStatus }; /** -* Base class for any Profile View or Me Profile Panel. +* Base class for any Profile View or My Profile Panel. */ class LLPanelProfileTab : public LLPanel @@ -147,7 +148,7 @@ class LLPanelAvatarProfile virtual void processGroupProperties(const LLAvatarGroups* avatar_groups); /** - * Fills common for Avatar profile and Me Profile fields. + * Fills common for Avatar profile and My Profile fields. */ virtual void fillCommonData(const LLAvatarData* avatar_data); @@ -160,12 +161,17 @@ class LLPanelAvatarProfile * Fills Avatar's online status. */ virtual void fillOnlineStatus(const LLAvatarData* avatar_data); - + /** * Fills account status. */ virtual void fillAccountStatus(const LLAvatarData* avatar_data); + /** + * Opens "Pay Resident" dialog. + */ + void pay(); + void onUrlTextboxClicked(const std::string& url); void onHomepageTextboxClicked(); void onAddFriendButtonClick(); @@ -173,20 +179,24 @@ class LLPanelAvatarProfile void onCallButtonClick(); void onTeleportButtonClick(); void onShareButtonClick(); + void onOverflowButtonClicked(); private: - std::string mGroups; + typedef std::list<std::string> group_list_t; + group_list_t mGroups; + + LLToggleableMenu* mProfileMenu; }; /** * Panel for displaying own first and second life related info. */ -class LLPanelAvatarMeProfile +class LLPanelMyProfile : public LLPanelAvatarProfile { public: - LLPanelAvatarMeProfile(); + LLPanelMyProfile(); /*virtual*/ BOOL postBuild(); diff --git a/indra/newview/llpanelavatartag.cpp b/indra/newview/llpanelavatartag.cpp index 03ad19f9118ca92836ba090095b55d8727f9fdd6..7563cc7f61cf4a400df81f39241a581f74c9eb59 100644 --- a/indra/newview/llpanelavatartag.cpp +++ b/indra/newview/llpanelavatartag.cpp @@ -92,7 +92,7 @@ void LLPanelAvatarTag::setAvatarId(const LLUUID& avatar_id) boost::signals2::connection LLPanelAvatarTag::setLeftButtonClickCallback( const commit_callback_t& cb) { - return mCommitSignal.connect(cb); + return setCommitCallback(cb); } BOOL LLPanelAvatarTag::handleMouseDown(S32 x, S32 y, MASK mask) diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index a29c9752e6dc6792f219d78ce1916004ef9b2a98..67a270450132b67f48dc7ffebc2d1e66b90cdf3d 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -1142,3 +1142,552 @@ void LLPanelClassified::setDefaultAccessCombo() break; } } + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLPanelClassifiedInfo::LLPanelClassifiedInfo() + : LLPanel() + , mInfoLoaded(false) +{ +} + +LLPanelClassifiedInfo::~LLPanelClassifiedInfo() +{ +} + +// static +LLPanelClassifiedInfo* LLPanelClassifiedInfo::create() +{ + LLPanelClassifiedInfo* panel = new LLPanelClassifiedInfo(); + LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_classified_info.xml"); + return panel; +} + +BOOL LLPanelClassifiedInfo::postBuild() +{ + childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this)); + childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this)); + childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this)); + + return TRUE; +} + +void LLPanelClassifiedInfo::setExitCallback(const commit_callback_t& cb) +{ + getChild<LLButton>("back_btn")->setClickedCallback(cb); +} + +void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& cb) +{ + getChild<LLButton>("edit_btn")->setClickedCallback(cb); +} + +void LLPanelClassifiedInfo::onOpen(const LLSD& key) +{ + LLUUID avatar_id = key["avatar_id"]; + if(avatar_id.isNull()) + { + return; + } + + if(getAvatarId().notNull()) + { + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this); + } + + setAvatarId(avatar_id); + + resetData(); + resetControls(); + + setClassifiedId(key["classified_id"]); + setClassifiedName(key["name"]); + setDescription(key["desc"]); + setSnapshotId(key["snapshot_id"]); + + LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this); + LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId()); + setInfoLoaded(false); +} + +void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType type) +{ + if(APT_CLASSIFIED_INFO == type) + { + LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data); + if(c_info && getClassifiedId() == c_info->classified_id) + { + setClassifiedName(c_info->name); + setDescription(c_info->description); + setSnapshotId(c_info->snapshot_id); + setParcelId(c_info->parcel_id); + setPosGlobal(c_info->pos_global); + 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"); + + 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)); + + childSetTextArg("price_for_listing", "[PRICE]", llformat("%d", c_info->price_for_listing)); + + setInfoLoaded(true); + } + } +} + +void LLPanelClassifiedInfo::resetData() +{ + setClassifiedName(LLStringUtil::null); + setDescription(LLStringUtil::null); + setClassifiedLocation(LLStringUtil::null); + setClassifiedId(LLUUID::null); + setSnapshotId(LLUUID::null); + mPosGlobal.clearVec(); + childSetValue("category", LLStringUtil::null); + childSetValue("content_type", LLStringUtil::null); +} + +void LLPanelClassifiedInfo::resetControls() +{ + if(getAvatarId() == gAgent.getID()) + { + childSetEnabled("edit_btn", TRUE); + childSetVisible("edit_btn", TRUE); + } + else + { + childSetEnabled("edit_btn", FALSE); + childSetVisible("edit_btn", FALSE); + } +} + +void LLPanelClassifiedInfo::setClassifiedName(const std::string& name) +{ + childSetValue("classified_name", name); +} + +std::string LLPanelClassifiedInfo::getClassifiedName() +{ + return childGetValue("classified_name").asString(); +} + +void LLPanelClassifiedInfo::setDescription(const std::string& desc) +{ + childSetValue("classified_desc", desc); +} + +std::string LLPanelClassifiedInfo::getDescription() +{ + return childGetValue("classified_desc").asString(); +} + +void LLPanelClassifiedInfo::setClassifiedLocation(const std::string& location) +{ + childSetValue("classified_location", location); +} + +void LLPanelClassifiedInfo::setSnapshotId(const LLUUID& id) +{ + childSetValue("classified_snapshot", id); +} + +LLUUID LLPanelClassifiedInfo::getSnapshotId() +{ + return childGetValue("classified_snapshot").asUUID(); +} + +// static +std::string LLPanelClassifiedInfo::createLocationText( + const std::string& original_name, + const std::string& sim_name, + const LLVector3d& pos_global) +{ + std::string location_text; + + location_text.append(original_name); + + if (!sim_name.empty()) + { + if (!location_text.empty()) + location_text.append(", "); + location_text.append(sim_name); + } + + if (!location_text.empty()) + location_text.append(" "); + + if (!pos_global.isNull()) + { + S32 region_x = llround((F32)pos_global.mdV[VX]) % REGION_WIDTH_UNITS; + S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS; + S32 region_z = llround((F32)pos_global.mdV[VZ]); + location_text.append(llformat(" (%d, %d, %d)", region_x, region_y, region_z)); + } + + return location_text; +} + +void LLPanelClassifiedInfo::onMapClick() +{ + LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal()); + LLFloaterReg::showInstance("world_map", "center"); +} + +void LLPanelClassifiedInfo::onTeleportClick() +{ + if (!getPosGlobal().isExactlyZero()) + { + gAgent.teleportViaLocation(getPosGlobal()); + LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal()); + } +} + +void LLPanelClassifiedInfo::onExit() +{ + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +static const S32 CB_ITEM_MATURE = 0; +static const S32 CB_ITEM_PG = 1; + +LLPanelClassifiedEdit::LLPanelClassifiedEdit() + : LLPanelClassifiedInfo() + , mIsNew(false) +{ +} + +LLPanelClassifiedEdit::~LLPanelClassifiedEdit() +{ +} + +//static +LLPanelClassifiedEdit* LLPanelClassifiedEdit::create() +{ + LLPanelClassifiedEdit* panel = new LLPanelClassifiedEdit(); + LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_edit_classified.xml"); + return panel; +} + +BOOL LLPanelClassifiedEdit::postBuild() +{ + LLPanelClassifiedInfo::postBuild(); + + LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot"); + snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this)); + + LLUICtrl* edit_icon = getChild<LLUICtrl>("edit_icon"); + snapshot->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon)); + snapshot->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon)); + edit_icon->setVisible(false); + + LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name"); + line_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL); + + LLTextEditor* text_edit = getChild<LLTextEditor>("classified_desc"); + text_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this)); + + LLComboBox* combobox = getChild<LLComboBox>( "category"); + LLClassifiedInfo::cat_map::iterator iter; + for (iter = LLClassifiedInfo::sCategories.begin(); + iter != LLClassifiedInfo::sCategories.end(); + iter++) + { + combobox->add(LLTrans::getString(iter->second)); + } + + combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this)); + + childSetCommitCallback("content_type", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL); + childSetCommitCallback("price_for_listing", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL); + childSetCommitCallback("auto_renew", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL); + + childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onSaveClick, this)); + childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onSetLocationClick, this)); + + return TRUE; +} + +void LLPanelClassifiedEdit::onOpen(const LLSD& key) +{ + LLUUID classified_id = key["classified_id"]; + + mIsNew = classified_id.isNull(); + + if(mIsNew) + { + setAvatarId(gAgent.getID()); + + resetData(); + resetControls(); + + setPosGlobal(gAgent.getPositionGlobal()); + + LLUUID snapshot_id = LLUUID::null; + std::string desc; + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + + if(parcel) + { + desc = parcel->getDesc(); + snapshot_id = parcel->getSnapshotID(); + } + + std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish"); + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + region_name = region->getName(); + } + + 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); + + enableVerbs(true); + enableEditing(true); + } + else + { + LLPanelClassifiedInfo::onOpen(key); + enableVerbs(false); + enableEditing(false); + } + + resetDirty(); + setInfoLoaded(false); +} + +void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType type) +{ + if(APT_CLASSIFIED_INFO == type) + { + LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data); + if(c_info && getClassifiedId() == c_info->classified_id) + { + enableEditing(true); + + setClassifiedName(c_info->name); + setDescription(c_info->description); + setSnapshotId(c_info->snapshot_id); + 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(); + + 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); + childSetValue("auto_renew", auto_renew); + childSetValue("price_for_listing", c_info->price_for_listing); + + resetDirty(); + setInfoLoaded(true); + } + } +} + +BOOL LLPanelClassifiedEdit::isDirty() const +{ + if(mIsNew) + { + return TRUE; + } + + BOOL dirty = false; + + dirty |= LLPanelClassifiedInfo::isDirty(); + dirty |= getChild<LLUICtrl>("classified_snapshot")->isDirty(); + dirty |= getChild<LLUICtrl>("classified_name")->isDirty(); + dirty |= getChild<LLUICtrl>("classified_desc")->isDirty(); + dirty |= getChild<LLUICtrl>("category")->isDirty(); + dirty |= getChild<LLUICtrl>("content_type")->isDirty(); + dirty |= getChild<LLUICtrl>("auto_renew")->isDirty(); + dirty |= getChild<LLUICtrl>("price_for_listing")->isDirty(); + + return dirty; +} + +void LLPanelClassifiedEdit::resetDirty() +{ + LLPanelClassifiedInfo::resetDirty(); + getChild<LLUICtrl>("classified_snapshot")->resetDirty(); + getChild<LLUICtrl>("classified_name")->resetDirty(); + getChild<LLUICtrl>("classified_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) +{ + getChild<LLButton>("save_changes_btn")->setClickedCallback(cb); +} + +void LLPanelClassifiedEdit::setCancelCallback(const commit_callback_t& cb) +{ + getChild<LLButton>("cancel_btn")->setClickedCallback(cb); +} + +void LLPanelClassifiedEdit::resetControls() +{ + LLPanelClassifiedInfo::resetControls(); + + getChild<LLComboBox>("category")->setCurrentByIndex(0); + getChild<LLComboBox>("content_type")->setCurrentByIndex(0); + childSetValue("auto_renew", false); + childSetValue("price_for_listing", MINIMUM_PRICE_FOR_LISTING); +} + +void LLPanelClassifiedEdit::sendUpdate() +{ + LLAvatarClassifiedInfo c_data; + + if(getClassifiedId().isNull()) + { + LLUUID id; + id.generate(); + setClassifiedId(id); + } + + c_data.agent_id = gAgent.getID(); + c_data.classified_id = getClassifiedId(); + c_data.category = getCategory(); + c_data.name = getClassifiedName(); + c_data.description = getDescription(); + c_data.parcel_id = getParcelId(); + c_data.snapshot_id = getSnapshotId(); + c_data.pos_global = getPosGlobal(); + c_data.flags = getFlags(); + c_data.price_for_listing = getPriceForListing(); + + LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoUpdate(&c_data); +} + +U32 LLPanelClassifiedEdit::getCategory() +{ + LLComboBox* cat_cb = getChild<LLComboBox>("category"); + return cat_cb->getCurrentIndex() + 1; +} + +U8 LLPanelClassifiedEdit::getFlags() +{ + bool auto_renew = childGetValue("auto_renew").asBoolean(); + + LLComboBox* content_cb = getChild<LLComboBox>("content_type"); + bool mature = content_cb->getCurrentIndex() == CB_ITEM_MATURE; + + return pack_classified_flags_request(auto_renew, false, mature, false); +} + +void LLPanelClassifiedEdit::enableVerbs(bool enable) +{ + childSetEnabled("save_changes_btn", enable); +} + +void LLPanelClassifiedEdit::enableEditing(bool enable) +{ + childSetEnabled("classified_snapshot", enable); + childSetEnabled("classified_name", enable); + childSetEnabled("classified_desc", enable); + childSetEnabled("set_to_curr_location_btn", enable); + childSetEnabled("category", enable); + childSetEnabled("content_type", enable); + childSetEnabled("price_for_listing", enable); + childSetEnabled("auto_renew", enable); +} + +std::string LLPanelClassifiedEdit::makeClassifiedName() +{ + std::string name; + + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if(parcel) + { + name = parcel->getName(); + } + + if(!name.empty()) + { + return name; + } + + LLViewerRegion* region = gAgent.getRegion(); + if(region) + { + name = region->getName(); + } + + return name; +} + +S32 LLPanelClassifiedEdit::getPriceForListing() +{ + return childGetValue("price_for_listing").asInteger(); +} + +void LLPanelClassifiedEdit::onSetLocationClick() +{ + setPosGlobal(gAgent.getPositionGlobal()); + setParcelId(LLUUID::null); + + std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish"); + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + region_name = region->getName(); + } + + setClassifiedLocation(createLocationText(getLocationNotice(), region_name, getPosGlobal())); + + // mark classified as dirty + setValue(LLSD()); + + onChange(); +} + +void LLPanelClassifiedEdit::onChange() +{ + enableVerbs(isDirty()); +} + +void LLPanelClassifiedEdit::onSaveClick() +{ + sendUpdate(); + resetDirty(); +} + +std::string LLPanelClassifiedEdit::getLocationNotice() +{ + static std::string location_notice = getString("location_notice"); + return location_notice; +} + +void LLPanelClassifiedEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl) +{ + ctrl->setVisible(TRUE); +} + +void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl) +{ + ctrl->setVisible(FALSE); +} + +//EOF diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index 417eddf460622b331b3cc55af2ce03271df6e150..8b32495854b8b0a9d46b54c2ac258815550c88be 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -37,6 +37,7 @@ #ifndef LL_LLPANELCLASSIFIED_H #define LL_LLPANELCLASSIFIED_H +#include "llavatarpropertiesprocessor.h" #include "llpanel.h" #include "llclassifiedinfo.h" #include "v3dmath.h" @@ -55,6 +56,8 @@ class LLTextureCtrl; class LLUICtrl; class LLMessageSystem; +// *TODO deprecated, should be removed. +// New class implemented in ticket EXT-2095 class LLPanelClassified : public LLPanel { public: @@ -198,5 +201,139 @@ class LLFloaterPriceForListing void* mUserData; }; +class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver +{ +public: + + static LLPanelClassifiedInfo* create(); + + virtual ~LLPanelClassifiedInfo(); + + /*virtual*/ void onOpen(const LLSD& key); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void processProperties(void* data, EAvatarProcessorType type); + + void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; } + + LLUUID& getAvatarId() { return mAvatarId; } + + void setSnapshotId(const LLUUID& id); + + LLUUID getSnapshotId(); + + void setClassifiedId(const LLUUID& id) { mClassifiedId = id; } + + LLUUID& getClassifiedId() { return mClassifiedId; } + + void setClassifiedName(const std::string& name); + + std::string getClassifiedName(); + + void setDescription(const std::string& desc); + + std::string getDescription(); + + void setClassifiedLocation(const std::string& location); + + void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; } + + LLVector3d& getPosGlobal() { return mPosGlobal; } + + void setParcelId(const LLUUID& id) { mParcelId = id; } + + LLUUID getParcelId() { return mParcelId; } + + bool getInfoLoaded() { return mInfoLoaded; } + + void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; } + + void setExitCallback(const commit_callback_t& cb); + + void setEditClassifiedCallback(const commit_callback_t& cb); + +protected: + + LLPanelClassifiedInfo(); + + virtual void resetData(); + + virtual void resetControls(); + + static std::string createLocationText( + const std::string& original_name, + const std::string& sim_name, + const LLVector3d& pos_global); + + void onMapClick(); + void onTeleportClick(); + void onExit(); + +private: + + LLUUID mAvatarId; + LLUUID mClassifiedId; + LLVector3d mPosGlobal; + LLUUID mParcelId; + bool mInfoLoaded; +}; + +class LLPanelClassifiedEdit : public LLPanelClassifiedInfo +{ +public: + + static LLPanelClassifiedEdit* create(); + + virtual ~LLPanelClassifiedEdit(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void onOpen(const LLSD& key); + + /*virtual*/ void processProperties(void* data, EAvatarProcessorType type); + + /*virtual*/ BOOL isDirty() const; + + /*virtual*/ void resetDirty(); + + void setSaveCallback(const commit_callback_t& cb); + + void setCancelCallback(const commit_callback_t& cb); + + /*virtual*/ void resetControls(); + + bool isNew() { return mIsNew; } + +protected: + + LLPanelClassifiedEdit(); + + void sendUpdate(); + + U32 getCategory(); + + void enableVerbs(bool enable); + + void enableEditing(bool enable); + + std::string makeClassifiedName(); + + S32 getPriceForListing(); + + U8 getFlags(); + + std::string getLocationNotice(); + + void onSetLocationClick(); + void onChange(); + void onSaveClick(); + + void onTexturePickerMouseEnter(LLUICtrl* ctrl); + void onTexturePickerMouseLeave(LLUICtrl* ctrl); + +private: + bool mIsNew; +}; #endif // LL_LLPANELCLASSIFIED_H diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 1c2875bf467ee3314012f381a928054e5157353c..a1d54367c983910b595b521e01d07eb98bae4208 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -213,6 +213,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group) } mFounderName = panel_group->getChild<LLNameBox>("founder_name"); mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); + mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII ); } // static diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 88aad4923d67bced285108a9020c3b15cde5aab8..7b5b232ad23e18ed911ece5b825ddbbae31afab3 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -2383,12 +2383,8 @@ BOOL LLPanelGroupActionsSubTab::postBuildSubTab(LLView* root) void LLPanelGroupActionsSubTab::activate() { LLPanelGroupSubTab::activate(); - lldebugs << "LLPanelGroupActionsSubTab::activate()" << llendl; - mActionList->deselectAllItems(); - mActionMembers->deleteAllItems(); - mActionRoles->deleteAllItems(); - mActionDescription->clear(); + update(GC_ALL); } void LLPanelGroupActionsSubTab::deactivate() diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index c9168670d5cd80c73f5e41e5e2aedb63fece6dcf..40319d949dbbfae12508d9e4b980133919366ad7 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -43,6 +43,8 @@ #include "llparticipantlist.h" #include "llimview.h" #include "llvoicechannel.h" +#include "llsidetray.h" +#include "lltrans.h" void LLPanelChatControlPanel::onCallButtonClicked() { @@ -86,14 +88,20 @@ void LLPanelChatControlPanel::draw() bool session_initialized = session->mSessionInitialized; bool callback_enabled = session->mCallBackEnabled; - LLViewerRegion* region = gAgent.getRegion(); - BOOL enable_connect = (region && region->getCapability("ChatSessionRequest") != "") - && session_initialized + BOOL enable_connect = session_initialized && voice_enabled && callback_enabled; childSetEnabled("call_btn", enable_connect); + // send a signal when the floater is fully initialized + // this lets LLAvatarActions::startAdhocCall() start the call + if (enable_connect && !mInitialized) + { + LLIMModel::sendSessionInitialized(mSessionId); + mInitialized = true; + } + LLPanel::draw(); } @@ -152,7 +160,13 @@ void LLPanelIMControlPanel::onAddFriendButtonClicked() void LLPanelIMControlPanel::onShareButtonClicked() { - // *TODO: Implement + LLSD key; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + + if (gIMMgr->hasSession(getSessionId())) + { + LLIMModel::getInstance()->addMessage(getSessionId(), SYSTEM_FROM, LLUUID::null, LLTrans::getString("share_alert"), false); + } } void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) @@ -168,14 +182,26 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID); - // Fetch the currect name - gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); - - // Disable profile button if participant is not realy SL avatar + // Disable most profile buttons if the participant is + // not really an SL avatar (e.g., an Avaline caller). LLIMModel::LLIMSession* im_session = im_model.findIMSession(session_id); if( im_session && !im_session->mOtherParticipantIsAvatar ) + { childSetEnabled("view_profile_btn", FALSE); + childSetEnabled("add_friend_btn", FALSE); + + childSetEnabled("share_btn", FALSE); + childSetEnabled("teleport_btn", FALSE); + childSetEnabled("pay_btn", FALSE); + + getChild<LLTextBox>("avatar_name")->setValue(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)); + } } void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) @@ -190,7 +216,8 @@ void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::str } } -LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id) +LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id): +mParticipantList(NULL) { mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id); } @@ -199,9 +226,6 @@ BOOL LLPanelGroupControlPanel::postBuild() { childSetAction("group_info_btn", boost::bind(&LLPanelGroupControlPanel::onGroupInfoButtonClicked, this)); - mAvatarList = getChild<LLAvatarList>("speakers_list"); - mParticipantList = new LLParticipantList(mSpeakerManager, mAvatarList); - return LLPanelChatControlPanel::postBuild(); } @@ -214,6 +238,8 @@ LLPanelGroupControlPanel::~LLPanelGroupControlPanel() // virtual void LLPanelGroupControlPanel::draw() { + //Remove event does not raised until speakerp->mActivityTimer.hasExpired() is false, see LLSpeakerManager::update() + //so we need update it to raise needed event mSpeakerManager->update(true); LLPanelChatControlPanel::draw(); } @@ -241,7 +267,7 @@ void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata) void LLPanelGroupControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) { LLPanelChatControlPanel::onVoiceChannelStateChanged(old_state, new_state); - mAvatarList->setSpeakingIndicatorsVisible(new_state >= LLVoiceChannel::STATE_CALL_STARTED); + mParticipantList->setSpeakingIndicatorsVisible(new_state >= LLVoiceChannel::STATE_CALL_STARTED); } void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id) @@ -249,6 +275,9 @@ void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id) LLPanelChatControlPanel::setSessionId(session_id); mGroupID = LLIMModel::getInstance()->getOtherParticipantID(session_id); + + if(!mParticipantList) + mParticipantList = new LLParticipantList(mSpeakerManager, getChild<LLAvatarList>("speakers_list")); } @@ -258,9 +287,7 @@ LLPanelAdHocControlPanel::LLPanelAdHocControlPanel(const LLUUID& session_id):LLP BOOL LLPanelAdHocControlPanel::postBuild() { - mAvatarList = getChild<LLAvatarList>("speakers_list"); - mParticipantList = new LLParticipantList(mSpeakerManager, mAvatarList); - + //We don't need LLPanelGroupControlPanel::postBuild() to be executed as there is no group_info_btn at AdHoc chat return LLPanelChatControlPanel::postBuild(); } diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index ac5d86345e834909b145e83991d63e32f989cd4b..7bfc432ef2feee098849674baae2b3401c9ac3da 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -43,7 +43,9 @@ class LLParticipantList; class LLPanelChatControlPanel : public LLPanel { public: - LLPanelChatControlPanel() {}; + LLPanelChatControlPanel() : + mSessionId(LLUUID()), + mInitialized(false) {}; ~LLPanelChatControlPanel() {}; virtual BOOL postBuild(); @@ -56,9 +58,11 @@ class LLPanelChatControlPanel : public LLPanel virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state); virtual void setSessionId(const LLUUID& session_id); + const LLUUID& getSessionId() { return mSessionId; } private: LLUUID mSessionId; + bool mInitialized; }; @@ -100,7 +104,7 @@ class LLPanelGroupControlPanel : public LLPanelChatControlPanel protected: LLUUID mGroupID; LLSpeakerMgr* mSpeakerManager; - LLAvatarList* mAvatarList; + LLParticipantList* mParticipantList; private: diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 49856638339e6f513261c0b422ba4cca14768a75..5de7c3f851e375018981c7a3fdf53ba346bcaff1 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -35,6 +35,7 @@ #include "llpanellandmarkinfo.h" #include "llcombobox.h" +#include "lliconctrl.h" #include "lllineeditor.h" #include "lltextbox.h" #include "lltexteditor.h" @@ -58,6 +59,11 @@ static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats); static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info"); +// Statics for textures filenames +static std::string icon_pg; +static std::string icon_m; +static std::string icon_r; + LLPanelLandmarkInfo::LLPanelLandmarkInfo() : LLPanelPlaceInfo() {} @@ -79,6 +85,10 @@ BOOL LLPanelLandmarkInfo::postBuild() mNotesEditor = getChild<LLTextEditor>("notes_editor"); mFolderCombo = getChild<LLComboBox>("folder_combo"); + icon_pg = getString("icon_PG"); + icon_m = getString("icon_M"); + icon_r = getString("icon_R"); + return TRUE; } @@ -101,9 +111,8 @@ void LLPanelLandmarkInfo::setInfoType(INFO_TYPE type) LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel"); bool is_info_type_create_landmark = type == CREATE_LANDMARK; - bool is_info_type_landmark = type == LANDMARK; - landmark_info_panel->setVisible(is_info_type_landmark); + landmark_info_panel->setVisible(type == LANDMARK); getChild<LLTextBox>("folder_label")->setVisible(is_info_type_create_landmark); mFolderCombo->setVisible(is_info_type_create_landmark); @@ -136,6 +145,24 @@ void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data) { LLPanelPlaceInfo::processParcelInfo(parcel_data); + // HACK: Flag 0x2 == adult region, + // Flag 0x1 == mature region, otherwise assume PG + if (parcel_data.flags & 0x2) + { + mMaturityRatingIcon->setValue(icon_r); + mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_ADULT)); + } + else if (parcel_data.flags & 0x1) + { + mMaturityRatingIcon->setValue(icon_m); + mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_MATURE)); + } + else + { + mMaturityRatingIcon->setValue(icon_pg); + mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG)); + } + S32 region_x; S32 region_y; S32 region_z; @@ -325,6 +352,8 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id) } LLStringUtil::replaceChar(desc, '\n', ' '); + LLViewerInventoryItem::insertDefaultSortField(name); + // If no folder chosen use the "Landmarks" folder. LLLandmarkActions::createLandmarkHere(name, desc, folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK)); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index ce1a7f98df946dde8dd902ac451a6b775594daff..e24fa14e1e94f3662e82870071ce1d28d4d36a86 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -67,6 +67,27 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn"; // helper functions static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string); +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLLandmarksPanelObserver +// +// Bridge to support knowing when the inventory has changed to update +// landmarks accordions visibility. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLLandmarksPanelObserver : public LLInventoryObserver +{ +public: + LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {} + virtual ~LLLandmarksPanelObserver() {} + /*virtual*/ void changed(U32 mask); + +private: + LLLandmarksPanel* mLP; +}; + +void LLLandmarksPanelObserver::changed(U32 mask) +{ + mLP->updateFilteredAccordions(); +} LLLandmarksPanel::LLLandmarksPanel() : LLPanelPlacesTab() @@ -80,11 +101,16 @@ LLLandmarksPanel::LLLandmarksPanel() , mGearLandmarkMenu(NULL) , mDirtyFilter(false) { + mInventoryObserver = new LLLandmarksPanelObserver(this); + gInventory.addObserver(mInventoryObserver); + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml"); } LLLandmarksPanel::~LLLandmarksPanel() { + if (gInventory.containsObserver(mInventoryObserver)) + gInventory.removeObserver(mInventoryObserver); } BOOL LLLandmarksPanel::postBuild() @@ -97,10 +123,10 @@ BOOL LLLandmarksPanel::postBuild() U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER); mSortByDate = sort_order & LLInventoryFilter::SO_DATE; - initFavoritesInventroyPanel(); - initLandmarksInventroyPanel(); - initMyInventroyPanel(); - initLibraryInventroyPanel(); + initFavoritesInventoryPanel(); + initLandmarksInventoryPanel(); + initMyInventoryPanel(); + initLibraryInventoryPanel(); getChild<LLAccordionCtrlTab>("tab_favorites")->setDisplayChildren(true); getChild<LLAccordionCtrlTab>("tab_landmarks")->setDisplayChildren(true); @@ -135,8 +161,14 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string) LLAccordionCtrlTab* tab = *iter; tab->setVisible(true); - // expand accordion to see matched items in all ones. See EXT-2014. + // expand accordion to see matched items in each one. See EXT-2014. tab->changeOpenClose(false); + + // refresh all accordions to display their contents in case of less restrictive filter + LLInventorySubTreePanel* inventory_list = dynamic_cast<LLInventorySubTreePanel*>(tab->getAccordionView()); + if (NULL == inventory_list) continue; + LLFolderView* fv = inventory_list->getRootFolder(); + fv->refresh(); } } @@ -148,20 +180,13 @@ void LLLandmarksPanel::onShowOnMap() llwarns << "There are no selected list. No actions are performed." << llendl; return; } - LLLandmark* landmark = getCurSelectedLandmark(); - if (!landmark) - return; - LLVector3d landmark_global_pos; - if (!landmark->getGlobalPos(landmark_global_pos)) - return; - - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - if (!landmark_global_pos.isExactlyZero() && worldmap_instance) - { - worldmap_instance->trackLocation(landmark_global_pos); - LLFloaterReg::showInstance("world_map", "center"); - } + // Disable the "Map" button because loading landmark can take some time. + // During this time the button is useless. It will be enabled on callback finish + // or upon switching to other item. + mShowOnMapBtn->setEnabled(FALSE); + + doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1)); } // virtual @@ -230,6 +255,31 @@ void LLLandmarksPanel::onSelectorButtonClicked() } } +void LLLandmarksPanel::updateFilteredAccordions() +{ + LLInventoryPanel* inventory_list = NULL; + LLAccordionCtrlTab* accordion_tab = NULL; + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + accordion_tab = *iter; + inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView()); + if (NULL == inventory_list) continue; + LLFolderView* fv = inventory_list->getRootFolder(); + + bool has_descendants = fv->hasFilteredDescendants(); + + accordion_tab->setVisible(has_descendants); + } + + // we have to arrange accordion tabs for cases when filter string is less restrictive but + // all items are still filtered. + static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); + accordion->arrange(); + + // now filter state is applied to accordion tabs + mDirtyFilter = false; +} + ////////////////////////////////////////////////////////////////////////// // PROTECTED METHODS ////////////////////////////////////////////////////////////////////////// @@ -256,15 +306,18 @@ bool LLLandmarksPanel::isReceivedFolderSelected() const return false; } -LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const -{ +void LLLandmarksPanel::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb) +{ LLFolderViewItem* cur_item = getCurSelectedItem(); if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) { - return LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID()); + LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID(), cb); + if (landmark) + { + cb(landmark); + } } - return NULL; } LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const @@ -294,45 +347,11 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data) // We have to make request to sever to get parcel_id and snaption_id. if(isLandmarkSelected()) { - LLLandmark* landmark = getCurSelectedLandmark(); LLFolderViewItem* cur_item = getCurSelectedItem(); LLUUID id = cur_item->getListener()->getUUID(); - LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id); - if(landmark) - { - LLPanelPickEdit* panel_pick = LLPanelPickEdit::create(); - LLVector3d landmark_global_pos; - landmark->getGlobalPos(landmark_global_pos); - - // let's toggle pick panel into panel places - LLPanel* panel_places = LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places - panel_places->addChild(panel_pick); - LLRect paren_rect(panel_places->getRect()); - panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE); - panel_pick->setRect(paren_rect); - panel_pick->onOpen(LLSD()); - - LLPickData data; - data.pos_global = landmark_global_pos; - data.name = cur_item->getName(); - data.desc = inv_item->getDescription(); - data.snapshot_id = parcel_data.snapshot_id; - data.parcel_id = parcel_data.parcel_id; - panel_pick->setPickData(&data); - - LLSD params; - params["parcel_id"] =parcel_data.parcel_id; - /* set exit callback to get back onto panel places - in callback we will make cleaning up( delete pick_panel instance, - remove landmark panel from observer list - */ - panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, - panel_pick, panel_places,params)); - panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, - panel_pick, panel_places,params)); - panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, - panel_pick, panel_places,params)); - } + LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id); + doActionOnCurSelectedLandmark(boost::bind( + &LLLandmarksPanel::doProcessParcelInfo, this, _1, cur_item, inv_item, parcel_data)); } } @@ -357,7 +376,7 @@ void LLLandmarksPanel::setErrorStatus(U32 status, const std::string& reason) // PRIVATE METHODS ////////////////////////////////////////////////////////////////////////// -void LLLandmarksPanel::initFavoritesInventroyPanel() +void LLLandmarksPanel::initFavoritesInventoryPanel() { mFavoritesInventoryPanel = getChild<LLInventorySubTreePanel>("favorites_list"); @@ -366,7 +385,7 @@ void LLLandmarksPanel::initFavoritesInventroyPanel() initAccordion("tab_favorites", mFavoritesInventoryPanel); } -void LLLandmarksPanel::initLandmarksInventroyPanel() +void LLLandmarksPanel::initLandmarksInventoryPanel() { mLandmarksInventoryPanel = getChild<LLInventorySubTreePanel>("landmarks_list"); @@ -380,7 +399,7 @@ void LLLandmarksPanel::initLandmarksInventroyPanel() initAccordion("tab_landmarks", mLandmarksInventoryPanel); } -void LLLandmarksPanel::initMyInventroyPanel() +void LLLandmarksPanel::initMyInventoryPanel() { mMyInventoryPanel= getChild<LLInventorySubTreePanel>("my_inventory_list"); @@ -389,7 +408,7 @@ void LLLandmarksPanel::initMyInventroyPanel() initAccordion("tab_inventory", mMyInventoryPanel); } -void LLLandmarksPanel::initLibraryInventroyPanel() +void LLLandmarksPanel::initLibraryInventoryPanel() { mLibraryInventoryPanel = getChild<LLInventorySubTreePanel>("library_list"); @@ -747,42 +766,7 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata) } else if ("create_pick" == command_name) { - LLLandmark* landmark = getCurSelectedLandmark(); - if(!landmark) return; - - LLViewerRegion* region = gAgent.getRegion(); - if (!region) return; - - LLGlobalVec pos_global; - LLUUID region_id; - landmark->getGlobalPos(pos_global); - landmark->getRegionID(region_id); - LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), - (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), - (F32)pos_global.mdV[VZ]); - - LLSD body; - std::string url = region->getCapability("RemoteParcelRequest"); - if (!url.empty()) - { - body["location"] = ll_sd_from_vector3(region_pos); - if (!region_id.isNull()) - { - body["region_id"] = region_id; - } - if (!pos_global.isExactlyZero()) - { - U64 region_handle = to_region_handle(pos_global); - body["region_handle"] = ll_sd_from_U64(region_handle); - } - LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); - } - else - { - llwarns << "Can't create pick for landmark for region" << region_id - << ". Region: " << region->getName() - << " does not support RemoteParcelRequest" << llendl; - } + doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1)); } } @@ -906,31 +890,97 @@ void LLLandmarksPanel::doIdle(void* landmarks_panel) } -void LLLandmarksPanel::updateFilteredAccordions() +void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark) { - LLInventoryPanel* inventory_list = NULL; - LLAccordionCtrlTab* accordion_tab = NULL; - for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) - { - accordion_tab = *iter; - inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView()); - if (NULL == inventory_list) continue; - LLFolderView* fv = inventory_list->getRootFolder(); - - bool has_visible_children = fv->hasVisibleChildren(); + LLVector3d landmark_global_pos; + if (!landmark->getGlobalPos(landmark_global_pos)) + return; - accordion_tab->setVisible(has_visible_children); + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + if (!landmark_global_pos.isExactlyZero() && worldmap_instance) + { + worldmap_instance->trackLocation(landmark_global_pos); + LLFloaterReg::showInstance("world_map", "center"); } - // we have to arrange accordion tabs for cases when filter string is less restrictive but - // all items are still filtered. - static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); - accordion->arrange(); + mShowOnMapBtn->setEnabled(TRUE); +} - // now filter state is applied to accordion tabs - mDirtyFilter = false; +void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark, + LLFolderViewItem* cur_item, + LLInventoryItem* inv_item, + const LLParcelData& parcel_data) +{ + LLPanelPickEdit* panel_pick = LLPanelPickEdit::create(); + LLVector3d landmark_global_pos; + landmark->getGlobalPos(landmark_global_pos); + + // let's toggle pick panel into panel places + LLPanel* panel_places = LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places + panel_places->addChild(panel_pick); + LLRect paren_rect(panel_places->getRect()); + panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE); + panel_pick->setRect(paren_rect); + panel_pick->onOpen(LLSD()); + + LLPickData data; + data.pos_global = landmark_global_pos; + data.name = cur_item->getName(); + data.desc = inv_item->getDescription(); + data.snapshot_id = parcel_data.snapshot_id; + data.parcel_id = parcel_data.parcel_id; + panel_pick->setPickData(&data); + + LLSD params; + params["parcel_id"] = parcel_data.parcel_id; + /* set exit callback to get back onto panel places + in callback we will make cleaning up( delete pick_panel instance, + remove landmark panel from observer list + */ + panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, + panel_pick, panel_places,params)); + panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, + panel_pick, panel_places,params)); + panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, + panel_pick, panel_places,params)); } +void LLLandmarksPanel::doCreatePick(LLLandmark* landmark) +{ + LLViewerRegion* region = gAgent.getRegion(); + if (!region) return; + + LLGlobalVec pos_global; + LLUUID region_id; + landmark->getGlobalPos(pos_global); + landmark->getRegionID(region_id); + LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), + (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), + (F32)pos_global.mdV[VZ]); + + LLSD body; + std::string url = region->getCapability("RemoteParcelRequest"); + if (!url.empty()) + { + body["location"] = ll_sd_from_vector3(region_pos); + if (!region_id.isNull()) + { + body["region_id"] = region_id; + } + if (!pos_global.isExactlyZero()) + { + U64 region_handle = to_region_handle(pos_global); + body["region_handle"] = ll_sd_from_U64(region_handle); + } + LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); + } + else + { + llwarns << "Can't create pick for landmark for region" << region_id + << ". Region: " << region->getName() + << " does not support RemoteParcelRequest" << llendl; + } +} ////////////////////////////////////////////////////////////////////////// // HELPER FUNCTIONS diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 745f9364c225327ec55cc738a53f242655127d51..c65abc178b80cb8666b37652c9f9e4b4753e8644 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -37,6 +37,7 @@ // newview #include "llinventorymodel.h" +#include "lllandmarklist.h" #include "llpanelplacestab.h" #include "llpanelpick.h" #include "llremoteparcelrequest.h" @@ -45,6 +46,7 @@ class LLAccordionCtrlTab; class LLFolderViewItem; class LLMenuGL; class LLInventoryPanel; +class LLInventoryObserver; class LLInventorySubTreePanel; class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver @@ -61,14 +63,21 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver void onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action); void onSelectorButtonClicked(); - + + /** + * Updates accordions according to filtered items in lists. + * + * It hides accordion for empty lists + */ + void updateFilteredAccordions(); + protected: /** * @return true - if current selected panel is not null and selected item is a landmark */ bool isLandmarkSelected() const; bool isReceivedFolderSelected() const; - LLLandmark* getCurSelectedLandmark() const; + void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb); LLFolderViewItem* getCurSelectedItem() const; void updateSortOrder(LLInventoryPanel* panel, bool byDate); @@ -78,10 +87,10 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver /*virtual*/ void setErrorStatus(U32 status, const std::string& reason); private: - void initFavoritesInventroyPanel(); - void initLandmarksInventroyPanel(); - void initMyInventroyPanel(); - void initLibraryInventroyPanel(); + void initFavoritesInventoryPanel(); + void initLandmarksInventoryPanel(); + void initMyInventoryPanel(); + void initLibraryInventoryPanel(); void initLandmarksPanel(LLInventorySubTreePanel* inventory_list); void initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list); void onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list); @@ -121,11 +130,14 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver static void doIdle(void* landmarks_panel); /** - * Updates accordions according to filtered items in lists. - * - * It hides accordion for empty lists + * Landmark actions callbacks. Fire when a landmark is loaded from the list. */ - void updateFilteredAccordions(); + void doShowOnMap(LLLandmark* landmark); + void doProcessParcelInfo(LLLandmark* landmark, + LLFolderViewItem* cur_item, + LLInventoryItem* inv_item, + const LLParcelData& parcel_data); + void doCreatePick(LLLandmark* landmark); private: LLInventorySubTreePanel* mFavoritesInventoryPanel; @@ -136,6 +148,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver LLMenuGL* mGearFolderMenu; LLMenuGL* mMenuAdd; LLInventorySubTreePanel* mCurrentSelectedList; + LLInventoryObserver* mInventoryObserver; LLPanel* mListCommands; bool mSortByDate; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 5d826f0a561c895cc1c0e99ff12915c46db17266..ec0f8e303c455a9f4ae0517bdc8c23558688031f 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -210,8 +210,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, } #if !USE_VIEWER_AUTH - childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace); - childSetPrevalidate("last_name_edit", LLLineEditor::prevalidatePrintableNoSpace); + childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); + childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); childSetCommitCallback("password_edit", mungePassword, this); getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); @@ -310,7 +310,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, void LLPanelLogin::reshapeBrowser() { LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); - LLRect rect = gViewerWindow->getVirtualWindowRect(); + LLRect rect = gViewerWindow->getWindowRectScaled(); LLRect html_rect; #if USE_VIEWER_AUTH html_rect.setCenterAndSize( @@ -391,6 +391,10 @@ LLPanelLogin::~LLPanelLogin() //// We know we're done with the image, so be rid of it. //gTextureList.deleteImage( mLogoImage ); + + // Controls having keyboard focus by default + // must reset it on destroy. (EXT-2748) + gFocusMgr.setDefaultKeyboardFocus(NULL); } // virtual @@ -682,8 +686,6 @@ void LLPanelLogin::closePanel() if (sInstance) { gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); - - gFocusMgr.setDefaultKeyboardFocus(NULL); delete sInstance; sInstance = NULL; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 15a75cb93063e3a06186a6b83430d3ecfe2e0757..74c1420cf37323dfca11d5659d2c6a1eecc3a92a 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1,1025 +1,1022 @@ -/** - * @file llsidepanelmaininventory.cpp - * @brief Implementation of llsidepanelmaininventory. - * - * $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 "llpanelmaininventory.h" - -#include "lldndbutton.h" -#include "llfilepicker.h" -#include "llfloaterinventory.h" -#include "llinventorybridge.h" -#include "llinventoryfunctions.h" -#include "llinventorypanel.h" -#include "llfiltereditor.h" -#include "llfloaterreg.h" -#include "llpreviewtexture.h" -#include "llscrollcontainer.h" -#include "llsdserialize.h" -#include "llspinctrl.h" -#include "lltooldraganddrop.h" -#include "llviewermenu.h" -#include "llviewertexturelist.h" - -static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor? - -void on_file_loaded_for_save(BOOL success, - LLViewerFetchedTexture *src_vi, - LLImageRaw* src, - LLImageRaw* aux_src, - S32 discard_level, - BOOL final, - void* userdata); - -///---------------------------------------------------------------------------- -/// LLFloaterInventoryFinder -///---------------------------------------------------------------------------- - -class LLFloaterInventoryFinder : public LLFloater -{ -public: - LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view); - virtual void draw(); - /*virtual*/ BOOL postBuild(); - void changeFilter(LLInventoryFilter* filter); - void updateElementsFromFilter(); - BOOL getCheckShowEmpty(); - BOOL getCheckSinceLogoff(); - - static void onTimeAgo(LLUICtrl*, void *); - static void onCheckSinceLogoff(LLUICtrl*, void *); - static void onCloseBtn(void* user_data); - static void selectAllTypes(void* user_data); - static void selectNoTypes(void* user_data); -private: - LLPanelMainInventory* mPanelMainInventory; - LLSpinCtrl* mSpinSinceDays; - LLSpinCtrl* mSpinSinceHours; - LLInventoryFilter* mFilter; -}; - -///---------------------------------------------------------------------------- -/// LLPanelMainInventory -///---------------------------------------------------------------------------- - -LLPanelMainInventory::LLPanelMainInventory() - : LLPanel(), - mActivePanel(NULL), - mSavedFolderState(NULL), - mFilterText(""), - mMenuGearDefault(NULL), - mMenuAdd(NULL) -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT); - // Menu Callbacks (non contex menus) - mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); - mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2)); - mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); - 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)); - - // Controls - // *TODO: Just use persistant settings for each of these - U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); - 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 ); - - gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE); - - mSavedFolderState = new LLSaveFolderState(); - mSavedFolderState->setApply(FALSE); -} - -BOOL LLPanelMainInventory::postBuild() -{ - gInventory.addObserver(this); - - mFilterTabs = getChild<LLTabContainer>("inventory filter tabs"); - mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this)); - - //panel->getFilter()->markDefault(); - - // Set up the default inv. panel/filter settings. - mActivePanel = getChild<LLInventoryPanel>("All Items"); - if (mActivePanel) - { - // "All Items" is the previous only view, so it gets the InventorySortOrder - mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); - mActivePanel->getFilter()->markDefault(); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2)); - } - LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); - if (recent_items_panel) - { - recent_items_panel->setSinceLogoff(TRUE); - recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE); - recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - recent_items_panel->getFilter()->markDefault(); - recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2)); - } - - // Now load the stored settings from disk, if available. - std::ostringstream filterSaveName; - filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); - llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl; - llifstream file(filterSaveName.str()); - LLSD savedFilterState; - if (file.is_open()) - { - LLSDSerialize::fromXML(savedFilterState, file); - file.close(); - - // Load the persistent "Recent Items" settings. - // Note that the "All Items" settings do not persist. - if(recent_items_panel) - { - if(savedFilterState.has(recent_items_panel->getFilter()->getName())) - { - LLSD recent_items = savedFilterState.get( - recent_items_panel->getFilter()->getName()); - recent_items_panel->getFilter()->fromLLSD(recent_items); - } - } - - } - - mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); - if (mFilterEditor) - { - mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2)); - } - - // *TODO:Get the cost info from the server - const std::string upload_cost("10"); - childSetLabelArg("Upload Image", "[COST]", upload_cost); - childSetLabelArg("Upload Sound", "[COST]", upload_cost); - childSetLabelArg("Upload Animation", "[COST]", upload_cost); - childSetLabelArg("Bulk Upload", "[COST]", upload_cost); - - initListCommandsHandlers(); - return TRUE; -} - -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)); - /* - mListCommands->getChild<LLButton>("add_btn")->setHeldDownCallback(boost::bind(&LLPanelMainInventory::onAddButtonHeldDown, this)); - static const LLSD add_landmark_command("add_landmark"); - mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddAction, this, add_landmark_command)); - */ - - LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); - trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this - , _4 // BOOL drop - , _5 // EDragAndDropType cargo_type - , _7 // EAcceptance* accept - )); - - mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2)); - mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2)); - mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - -} - -// Destroys the object -LLPanelMainInventory::~LLPanelMainInventory( void ) -{ - // Save the filters state. - LLSD filterRoot; - LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items"); - if (all_items_panel) - { - LLInventoryFilter* filter = all_items_panel->getFilter(); - if (filter) - { - LLSD filterState; - filter->toLLSD(filterState); - filterRoot[filter->getName()] = filterState; - } - } - - LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); - if (recent_items_panel) - { - LLInventoryFilter* filter = recent_items_panel->getFilter(); - if (filter) - { - LLSD filterState; - filter->toLLSD(filterState); - filterRoot[filter->getName()] = filterState; - } - } - - std::ostringstream filterSaveName; - filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); - llofstream filtersFile(filterSaveName.str()); - if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile)) - { - llwarns << "Could not write to filters save file " << filterSaveName << llendl; - } - else - filtersFile.close(); - - gInventory.removeObserver(this); - delete mSavedFolderState; -} - -void LLPanelMainInventory::startSearch() -{ - // this forces focus to line editor portion of search editor - if (mFilterEditor) - { - mFilterEditor->focusFirstItem(TRUE); - } -} - -BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask) -{ - LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; - if (root_folder) - { - // first check for user accepting current search results - if (mFilterEditor - && mFilterEditor->hasFocus() - && (key == KEY_RETURN - || key == KEY_DOWN) - && mask == MASK_NONE) - { - // move focus to inventory proper - mActivePanel->setFocus(TRUE); - root_folder->scrollToShowSelection(); - return TRUE; - } - - if (mActivePanel->hasFocus() && key == KEY_UP) - { - startSearch(); - } - } - - return LLPanel::handleKeyHere(key, mask); - -} - -//---------------------------------------------------------------------------- -// menu callbacks - -void LLPanelMainInventory::doToSelected(const LLSD& userdata) -{ - getPanel()->getRootFolder()->doToSelected(&gInventory, userdata); -} - -void LLPanelMainInventory::closeAllFolders() -{ - getPanel()->getRootFolder()->closeAllFolders(); -} - -void LLPanelMainInventory::newWindow() -{ - LLFloaterInventory::showAgentInventory(); -} - -void LLPanelMainInventory::doCreate(const LLSD& userdata) -{ - menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata); -} - -void LLPanelMainInventory::resetFilters() -{ - LLFloaterInventoryFinder *finder = getFinder(); - getActivePanel()->getFilter()->resetDefault(); - if (finder) - { - finder->updateElementsFromFilter(); - } - - setFilterTextFromFilter(); -} - -void LLPanelMainInventory::setSortBy(const LLSD& userdata) -{ - std::string sort_field = userdata.asString(); - if (sort_field == "name") - { - U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); - - gSavedSettings.setBOOL("Inventory.SortByName", TRUE ); - gSavedSettings.setBOOL("Inventory.SortByDate", FALSE ); - } - else if (sort_field == "date") - { - U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE ); - - gSavedSettings.setBOOL("Inventory.SortByName", FALSE ); - gSavedSettings.setBOOL("Inventory.SortByDate", TRUE ); - } - else if (sort_field == "foldersalwaysbyname") - { - U32 order = getActivePanel()->getSortOrder(); - if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME ) - { - order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME; - - gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE ); - } - else - { - order |= LLInventoryFilter::SO_FOLDERS_BY_NAME; - - gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE ); - } - getActivePanel()->setSortOrder( order ); - } - else if (sort_field == "systemfolderstotop") - { - U32 order = getActivePanel()->getSortOrder(); - if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ) - { - order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; - - gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE ); - } - else - { - order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; - - gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); - } - getActivePanel()->setSortOrder( order ); - } -} - -// static -BOOL LLPanelMainInventory::filtersVisible(void* user_data) -{ - LLPanelMainInventory* self = (LLPanelMainInventory*)user_data; - if(!self) return FALSE; - - return self->getFinder() != NULL; -} - -void LLPanelMainInventory::onClearSearch() -{ - LLFloater *finder = getFinder(); - if (mActivePanel) - { - mActivePanel->setFilterSubString(LLStringUtil::null); - mActivePanel->setFilterTypes(0xffffffff); - } - - if (finder) - { - LLFloaterInventoryFinder::selectAllTypes(finder); - } - - // re-open folders that were initially open - if (mActivePanel) - { - mSavedFolderState->setApply(TRUE); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - LLOpenFoldersWithSelection opener; - mActivePanel->getRootFolder()->applyFunctorRecursively(opener); - mActivePanel->getRootFolder()->scrollToShowSelection(); - } -} - -void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) -{ - if (search_string == "") - { - onClearSearch(); - } - if (!mActivePanel) - { - return; - } - - gInventory.startBackgroundFetch(); - - std::string uppercase_search_string = search_string; - LLStringUtil::toUpper(uppercase_search_string); - if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty()) - { - // current filter and new filter empty, do nothing - return; - } - - // save current folder open state if no filter currently applied - if (!mActivePanel->getRootFolder()->isFilterModified()) - { - mSavedFolderState->setApply(FALSE); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - } - - // set new filter string - mActivePanel->setFilterSubString(uppercase_search_string); -} - - - //static - BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) - { - LLPanelMainInventory* active_view = NULL; - - 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) - { - LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter); - if (iv) - { - if (gFocusMgr.childHasKeyboardFocus(iv)) - { - active_view = iv; - break; - } - } - } - - if (!active_view) - { - return FALSE; - } - - std::string search_string(find_text); - - if (search_string.empty()) - { - return FALSE; - } - - if (active_view->getPanel() && - active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward)) - { - return TRUE; - } - - return FALSE; - } - -void LLPanelMainInventory::onFilterSelected() -{ - // Find my index - mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs"); - - if (!mActivePanel) - { - return; - } - LLInventoryFilter* filter = mActivePanel->getFilter(); - LLFloaterInventoryFinder *finder = getFinder(); - if (finder) - { - finder->changeFilter(filter); - } - 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(); - } - setFilterTextFromFilter(); -} - -const std::string LLPanelMainInventory::getFilterSubString() -{ - return mActivePanel->getFilterSubString(); -} - -void LLPanelMainInventory::setFilterSubString(const std::string& string) -{ - mActivePanel->setFilterSubString(string); -} - -BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - // Check to see if we are auto scrolling from the last frame - LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel(); - BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y); - if(mFilterTabs) - { - if(needsToScroll) - { - mFilterTabs->startDragAndDropDelayTimer(); - } - } - - BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - - return handled; -} - -void LLPanelMainInventory::changed(U32 mask) -{ -} - - -void LLPanelMainInventory::setFilterTextFromFilter() -{ - mFilterText = mActivePanel->getFilter()->getFilterText(); -} - -void LLPanelMainInventory::toggleFindOptions() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE); - LLFloater *floater = getFinder(); - if (!floater) - { - LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this); - mFinderHandle = finder->getHandle(); - finder->openFloater(); - - LLFloater* parent_floater = gFloaterView->getParentFloater(this); - if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel - parent_floater->addDependentFloater(mFinderHandle); - // start background fetch of folders - gInventory.startBackgroundFetch(); - } - else - { - floater->closeFloater(); - } -} - -void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb) -{ - getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb); - getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb); -} - -void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action) -{ - updateListCommands(); - panel->onSelectionChange(items, user_action); -} - -///---------------------------------------------------------------------------- -/// LLFloaterInventoryFinder -///---------------------------------------------------------------------------- - -LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() -{ - return (LLFloaterInventoryFinder*)mFinderHandle.get(); -} - - -LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) : - LLFloater(LLSD()), - mPanelMainInventory(inventory_view), - mFilter(inventory_view->getPanel()->getFilter()) -{ - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL); - updateElementsFromFilter(); -} - - -void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff= self->childGetValue("check_since_logoff"); - - if (!since_logoff && - !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) - { - self->mSpinSinceHours->set(1.0f); - } -} -BOOL LLFloaterInventoryFinder::postBuild() -{ - const LLRect& viewrect = mPanelMainInventory->getRect(); - setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight())); - - childSetAction("All", selectAllTypes, this); - childSetAction("None", selectNoTypes, this); - - mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago"); - childSetCommitCallback("spin_hours_ago", onTimeAgo, this); - - mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); - childSetCommitCallback("spin_days_ago", onTimeAgo, this); - - // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); - childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); - - childSetAction("Close", onCloseBtn, this); - - updateElementsFromFilter(); - return TRUE; -} -void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff=true; - if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) - { - since_logoff = false; - } - self->childSetValue("check_since_logoff", since_logoff); -} - -void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) -{ - mFilter = filter; - updateElementsFromFilter(); -} - -void LLFloaterInventoryFinder::updateElementsFromFilter() -{ - if (!mFilter) - return; - - // Get data needed for filter display - U32 filter_types = mFilter->getFilterTypes(); - std::string filter_string = mFilter->getFilterSubString(); - LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState(); - U32 hours = mFilter->getHoursAgo(); - - // update the ui elements - setTitle(mFilter->getName()); - - childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); - - childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); - childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); - childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); - childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); - childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); - childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); - childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); - childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); - childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); - childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); - childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); - childSetValue("check_since_logoff", mFilter->isSinceLogoff()); - mSpinSinceHours->set((F32)(hours % 24)); - mSpinSinceDays->set((F32)(hours / 24)); -} - -void LLFloaterInventoryFinder::draw() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW); - U32 filter = 0xffffffff; - BOOL filtered_by_all_types = TRUE; - - if (!childGetValue("check_animation")) - { - filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); - filtered_by_all_types = FALSE; - } - - - if (!childGetValue("check_calling_card")) - { - filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_clothing")) - { - filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_gesture")) - { - filter &= ~(0x1 << LLInventoryType::IT_GESTURE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_landmark")) - - - { - filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_notecard")) - { - filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_object")) - { - filter &= ~(0x1 << LLInventoryType::IT_OBJECT); - filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_script")) - { - filter &= ~(0x1 << LLInventoryType::IT_LSL); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_sound")) - { - filter &= ~(0x1 << LLInventoryType::IT_SOUND); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_texture")) - { - filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_snapshot")) - { - filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); - filtered_by_all_types = FALSE; - } - - if (!filtered_by_all_types) - { - // don't include folders in filter, unless I've selected everything - filter &= ~(0x1 << LLInventoryType::IT_CATEGORY); - } - - // update the panel, panel will update the filter - mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ? - LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mPanelMainInventory->getPanel()->setFilterTypes(filter); - if (getCheckSinceLogoff()) - { - mSpinSinceDays->set(0); - mSpinSinceHours->set(0); - } - U32 days = (U32)mSpinSinceDays->get(); - U32 hours = (U32)mSpinSinceHours->get(); - if (hours > 24) - { - days += hours / 24; - hours = (U32)hours % 24; - mSpinSinceDays->set((F32)days); - mSpinSinceHours->set((F32)hours); - } - hours += days * 24; - mPanelMainInventory->getPanel()->setHoursAgo(hours); - mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff()); - mPanelMainInventory->setFilterTextFromFilter(); - - LLPanel::draw(); -} - -BOOL LLFloaterInventoryFinder::getCheckShowEmpty() -{ - return childGetValue("check_show_empty"); -} - -BOOL LLFloaterInventoryFinder::getCheckSinceLogoff() -{ - return childGetValue("check_since_logoff"); -} - -void LLFloaterInventoryFinder::onCloseBtn(void* user_data) -{ - LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data; - finderp->closeFloater(); -} - -// static -void LLFloaterInventoryFinder::selectAllTypes(void* user_data) -{ - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - self->childSetValue("check_animation", TRUE); - self->childSetValue("check_calling_card", TRUE); - self->childSetValue("check_clothing", TRUE); - self->childSetValue("check_gesture", TRUE); - self->childSetValue("check_landmark", TRUE); - self->childSetValue("check_notecard", TRUE); - self->childSetValue("check_object", TRUE); - self->childSetValue("check_script", TRUE); - self->childSetValue("check_sound", TRUE); - self->childSetValue("check_texture", TRUE); - self->childSetValue("check_snapshot", TRUE); -} - -//static -void LLFloaterInventoryFinder::selectNoTypes(void* user_data) -{ - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - self->childSetValue("check_animation", FALSE); - self->childSetValue("check_calling_card", FALSE); - self->childSetValue("check_clothing", FALSE); - self->childSetValue("check_gesture", FALSE); - self->childSetValue("check_landmark", FALSE); - self->childSetValue("check_notecard", FALSE); - self->childSetValue("check_object", FALSE); - self->childSetValue("check_script", FALSE); - self->childSetValue("check_sound", FALSE); - self->childSetValue("check_texture", FALSE); - self->childSetValue("check_snapshot", FALSE); -} - - - - - -void LLPanelMainInventory::updateListCommands() -{ - bool trash_enabled = isActionEnabled("delete"); - - mListCommands->childSetEnabled("trash_btn", trash_enabled); -} - -void LLPanelMainInventory::onGearButtonClick() -{ - showActionMenu(mMenuGearDefault,"options_gear_btn"); -} - -void LLPanelMainInventory::onAddButtonClick() -{ - showActionMenu(mMenuAdd,"add_btn"); -} - -void LLPanelMainInventory::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); - } -} - -void LLPanelMainInventory::onTrashButtonClick() -{ - onClipboardAction("delete"); -} - -void LLPanelMainInventory::onClipboardAction(const LLSD& userdata) -{ - std::string command_name = userdata.asString(); - getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); -} - -void LLPanelMainInventory::onCustomAction(const LLSD& userdata) -{ - if (!isActionEnabled(userdata)) - return; - - const std::string command_name = userdata.asString(); - if (command_name == "new_window") - { - newWindow(); - } - if (command_name == "sort_by_name") - { - const LLSD arg = "name"; - setSortBy(arg); - } - if (command_name == "sort_by_recent") - { - const LLSD arg = "date"; - setSortBy(arg); - } - if (command_name == "show_filters") - { - toggleFindOptions(); - } - if (command_name == "reset_filters") - { - resetFilters(); - } - if (command_name == "close_folders") - { - closeAllFolders(); - } - if (command_name == "empty_trash") - { - const std::string notification = "ConfirmEmptyTrash"; - gInventory.emptyFolderType(notification, LLFolderType::FT_TRASH); - } - if (command_name == "empty_lostnfound") - { - const std::string notification = "ConfirmEmptyLostAndFound"; - gInventory.emptyFolderType(notification, LLFolderType::FT_LOST_AND_FOUND); - } - if (command_name == "save_texture") - { - LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return; - } - - const LLUUID& item_id = current_item->getListener()->getUUID(); - LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES); - if (preview_texture) - { - preview_texture->openToSave(); - } - } -} - -BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) -{ - const std::string command_name = userdata.asString(); - if (command_name == "delete") - { - BOOL can_delete = FALSE; - LLFolderView *folder = getActivePanel()->getRootFolder(); - if (folder) - { - can_delete = TRUE; - std::set<LLUUID> selection_set; - folder->getSelectionList(selection_set); - 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); - can_delete &= item->getListener()->isItemRemovable(); - } - return can_delete; - } - return FALSE; - } - if (command_name == "save_texture") - { - LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (current_item) - { - return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE); - } - return FALSE; - } - return TRUE; -} - -bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) -{ - *accept = ACCEPT_NO; - - const bool is_enabled = isActionEnabled("delete"); - if (is_enabled) *accept = ACCEPT_YES_MULTI; - - if (is_enabled && drop) - { - onClipboardAction("delete"); - } - return true; -} +/** + * @file llsidepanelmaininventory.cpp + * @brief Implementation of llsidepanelmaininventory. + * + * $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 "llpanelmaininventory.h" + +#include "lldndbutton.h" +#include "llfilepicker.h" +#include "llfloaterinventory.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventorypanel.h" +#include "llfiltereditor.h" +#include "llfloaterreg.h" +#include "llpreviewtexture.h" +#include "llscrollcontainer.h" +#include "llsdserialize.h" +#include "llspinctrl.h" +#include "lltooldraganddrop.h" +#include "llviewermenu.h" +#include "llviewertexturelist.h" + +static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); + +void on_file_loaded_for_save(BOOL success, + LLViewerFetchedTexture *src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata); + +///---------------------------------------------------------------------------- +/// LLFloaterInventoryFinder +///---------------------------------------------------------------------------- + +class LLFloaterInventoryFinder : public LLFloater +{ +public: + LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view); + virtual void draw(); + /*virtual*/ BOOL postBuild(); + void changeFilter(LLInventoryFilter* filter); + void updateElementsFromFilter(); + BOOL getCheckShowEmpty(); + BOOL getCheckSinceLogoff(); + + static void onTimeAgo(LLUICtrl*, void *); + static void onCheckSinceLogoff(LLUICtrl*, void *); + static void onCloseBtn(void* user_data); + static void selectAllTypes(void* user_data); + static void selectNoTypes(void* user_data); +private: + LLPanelMainInventory* mPanelMainInventory; + LLSpinCtrl* mSpinSinceDays; + LLSpinCtrl* mSpinSinceHours; + LLInventoryFilter* mFilter; +}; + +///---------------------------------------------------------------------------- +/// LLPanelMainInventory +///---------------------------------------------------------------------------- + +LLPanelMainInventory::LLPanelMainInventory() + : LLPanel(), + mActivePanel(NULL), + mSavedFolderState(NULL), + mFilterText(""), + mMenuGearDefault(NULL), + mMenuAdd(NULL) +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT); + // Menu Callbacks (non contex menus) + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2)); + mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); + 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)); + + // Controls + // *TODO: Just use persistant settings for each of these + U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); + 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 ); + + gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE); + + mSavedFolderState = new LLSaveFolderState(); + mSavedFolderState->setApply(FALSE); +} + +BOOL LLPanelMainInventory::postBuild() +{ + gInventory.addObserver(this); + + mFilterTabs = getChild<LLTabContainer>("inventory filter tabs"); + mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this)); + + //panel->getFilter()->markDefault(); + + // Set up the default inv. panel/filter settings. + mActivePanel = getChild<LLInventoryPanel>("All Items"); + if (mActivePanel) + { + // "All Items" is the previous only view, so it gets the InventorySortOrder + mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); + mActivePanel->getFilter()->markDefault(); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2)); + } + LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); + if (recent_items_panel) + { + recent_items_panel->setSinceLogoff(TRUE); + recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE); + recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + recent_items_panel->getFilter()->markDefault(); + recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2)); + } + + // Now load the stored settings from disk, if available. + std::ostringstream filterSaveName; + filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); + llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl; + llifstream file(filterSaveName.str()); + LLSD savedFilterState; + if (file.is_open()) + { + LLSDSerialize::fromXML(savedFilterState, file); + file.close(); + + // Load the persistent "Recent Items" settings. + // Note that the "All Items" settings do not persist. + if(recent_items_panel) + { + if(savedFilterState.has(recent_items_panel->getFilter()->getName())) + { + LLSD recent_items = savedFilterState.get( + recent_items_panel->getFilter()->getName()); + recent_items_panel->getFilter()->fromLLSD(recent_items); + } + } + + } + + mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); + if (mFilterEditor) + { + mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2)); + } + + // *TODO:Get the cost info from the server + const std::string upload_cost("10"); + childSetLabelArg("Upload Image", "[COST]", upload_cost); + childSetLabelArg("Upload Sound", "[COST]", upload_cost); + childSetLabelArg("Upload Animation", "[COST]", upload_cost); + childSetLabelArg("Bulk Upload", "[COST]", upload_cost); + + initListCommandsHandlers(); + return TRUE; +} + +// Destroys the object +LLPanelMainInventory::~LLPanelMainInventory( void ) +{ + // Save the filters state. + LLSD filterRoot; + LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items"); + if (all_items_panel) + { + LLInventoryFilter* filter = all_items_panel->getFilter(); + if (filter) + { + LLSD filterState; + filter->toLLSD(filterState); + filterRoot[filter->getName()] = filterState; + } + } + + LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); + if (recent_items_panel) + { + LLInventoryFilter* filter = recent_items_panel->getFilter(); + if (filter) + { + LLSD filterState; + filter->toLLSD(filterState); + filterRoot[filter->getName()] = filterState; + } + } + + std::ostringstream filterSaveName; + filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); + llofstream filtersFile(filterSaveName.str()); + if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile)) + { + llwarns << "Could not write to filters save file " << filterSaveName << llendl; + } + else + filtersFile.close(); + + gInventory.removeObserver(this); + delete mSavedFolderState; +} + +void LLPanelMainInventory::startSearch() +{ + // this forces focus to line editor portion of search editor + if (mFilterEditor) + { + mFilterEditor->focusFirstItem(TRUE); + } +} + +BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask) +{ + LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; + if (root_folder) + { + // first check for user accepting current search results + if (mFilterEditor + && mFilterEditor->hasFocus() + && (key == KEY_RETURN + || key == KEY_DOWN) + && mask == MASK_NONE) + { + // move focus to inventory proper + mActivePanel->setFocus(TRUE); + root_folder->scrollToShowSelection(); + return TRUE; + } + + if (mActivePanel->hasFocus() && key == KEY_UP) + { + startSearch(); + } + } + + return LLPanel::handleKeyHere(key, mask); + +} + +//---------------------------------------------------------------------------- +// menu callbacks + +void LLPanelMainInventory::doToSelected(const LLSD& userdata) +{ + getPanel()->getRootFolder()->doToSelected(&gInventory, userdata); +} + +void LLPanelMainInventory::closeAllFolders() +{ + getPanel()->getRootFolder()->closeAllFolders(); +} + +void LLPanelMainInventory::newWindow() +{ + LLFloaterInventory::showAgentInventory(); +} + +void LLPanelMainInventory::doCreate(const LLSD& userdata) +{ + menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata); +} + +void LLPanelMainInventory::resetFilters() +{ + LLFloaterInventoryFinder *finder = getFinder(); + getActivePanel()->getFilter()->resetDefault(); + if (finder) + { + finder->updateElementsFromFilter(); + } + + setFilterTextFromFilter(); +} + +void LLPanelMainInventory::setSortBy(const LLSD& userdata) +{ + std::string sort_field = userdata.asString(); + if (sort_field == "name") + { + U32 order = getActivePanel()->getSortOrder(); + getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); + + gSavedSettings.setBOOL("Inventory.SortByName", TRUE ); + gSavedSettings.setBOOL("Inventory.SortByDate", FALSE ); + } + else if (sort_field == "date") + { + U32 order = getActivePanel()->getSortOrder(); + getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE ); + + gSavedSettings.setBOOL("Inventory.SortByName", FALSE ); + gSavedSettings.setBOOL("Inventory.SortByDate", TRUE ); + } + else if (sort_field == "foldersalwaysbyname") + { + U32 order = getActivePanel()->getSortOrder(); + if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME ) + { + order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME; + + gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE ); + } + else + { + order |= LLInventoryFilter::SO_FOLDERS_BY_NAME; + + gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE ); + } + getActivePanel()->setSortOrder( order ); + } + else if (sort_field == "systemfolderstotop") + { + U32 order = getActivePanel()->getSortOrder(); + if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ) + { + order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; + + gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE ); + } + else + { + order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; + + gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); + } + getActivePanel()->setSortOrder( order ); + } +} + +// static +BOOL LLPanelMainInventory::filtersVisible(void* user_data) +{ + LLPanelMainInventory* self = (LLPanelMainInventory*)user_data; + if(!self) return FALSE; + + return self->getFinder() != NULL; +} + +void LLPanelMainInventory::onClearSearch() +{ + LLFloater *finder = getFinder(); + if (mActivePanel) + { + mActivePanel->setFilterSubString(LLStringUtil::null); + mActivePanel->setFilterTypes(0xffffffff); + } + + if (finder) + { + LLFloaterInventoryFinder::selectAllTypes(finder); + } + + // re-open folders that were initially open + if (mActivePanel) + { + mSavedFolderState->setApply(TRUE); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + LLOpenFoldersWithSelection opener; + mActivePanel->getRootFolder()->applyFunctorRecursively(opener); + mActivePanel->getRootFolder()->scrollToShowSelection(); + } +} + +void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) +{ + if (search_string == "") + { + onClearSearch(); + } + if (!mActivePanel) + { + return; + } + + gInventory.startBackgroundFetch(); + + std::string uppercase_search_string = search_string; + LLStringUtil::toUpper(uppercase_search_string); + if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty()) + { + // current filter and new filter empty, do nothing + return; + } + + // save current folder open state if no filter currently applied + if (!mActivePanel->getRootFolder()->isFilterModified()) + { + mSavedFolderState->setApply(FALSE); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + } + + // set new filter string + mActivePanel->setFilterSubString(uppercase_search_string); +} + + + //static + BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) + { + LLPanelMainInventory* active_view = NULL; + + 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) + { + LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter); + if (iv) + { + if (gFocusMgr.childHasKeyboardFocus(iv)) + { + active_view = iv; + break; + } + } + } + + if (!active_view) + { + return FALSE; + } + + std::string search_string(find_text); + + if (search_string.empty()) + { + return FALSE; + } + + if (active_view->getPanel() && + active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward)) + { + return TRUE; + } + + return FALSE; + } + +void LLPanelMainInventory::onFilterSelected() +{ + // Find my index + mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs"); + + if (!mActivePanel) + { + return; + } + LLInventoryFilter* filter = mActivePanel->getFilter(); + LLFloaterInventoryFinder *finder = getFinder(); + if (finder) + { + finder->changeFilter(filter); + } + 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(); + } + setFilterTextFromFilter(); +} + +const std::string LLPanelMainInventory::getFilterSubString() +{ + return mActivePanel->getFilterSubString(); +} + +void LLPanelMainInventory::setFilterSubString(const std::string& string) +{ + mActivePanel->setFilterSubString(string); +} + +BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + // Check to see if we are auto scrolling from the last frame + LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel(); + BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y); + if(mFilterTabs) + { + if(needsToScroll) + { + mFilterTabs->startDragAndDropDelayTimer(); + } + } + + BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + + return handled; +} + +void LLPanelMainInventory::changed(U32 mask) +{ +} + + +void LLPanelMainInventory::setFilterTextFromFilter() +{ + mFilterText = mActivePanel->getFilter()->getFilterText(); +} + +void LLPanelMainInventory::toggleFindOptions() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE); + LLFloater *floater = getFinder(); + if (!floater) + { + LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this); + mFinderHandle = finder->getHandle(); + finder->openFloater(); + + LLFloater* parent_floater = gFloaterView->getParentFloater(this); + if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel + parent_floater->addDependentFloater(mFinderHandle); + // start background fetch of folders + gInventory.startBackgroundFetch(); + } + else + { + floater->closeFloater(); + } +} + +void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb) +{ + getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb); + getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb); +} + +void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action) +{ + updateListCommands(); + panel->onSelectionChange(items, user_action); +} + +///---------------------------------------------------------------------------- +/// LLFloaterInventoryFinder +///---------------------------------------------------------------------------- + +LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() +{ + return (LLFloaterInventoryFinder*)mFinderHandle.get(); +} + + +LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) : + LLFloater(LLSD()), + mPanelMainInventory(inventory_view), + mFilter(inventory_view->getPanel()->getFilter()) +{ + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL); + updateElementsFromFilter(); +} + + +void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) +{ + LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; + if (!self) return; + + bool since_logoff= self->childGetValue("check_since_logoff"); + + if (!since_logoff && + !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) + { + self->mSpinSinceHours->set(1.0f); + } +} +BOOL LLFloaterInventoryFinder::postBuild() +{ + const LLRect& viewrect = mPanelMainInventory->getRect(); + setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight())); + + childSetAction("All", selectAllTypes, this); + childSetAction("None", selectNoTypes, this); + + mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago"); + childSetCommitCallback("spin_hours_ago", onTimeAgo, this); + + mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); + childSetCommitCallback("spin_days_ago", onTimeAgo, this); + + // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); + childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); + + childSetAction("Close", onCloseBtn, this); + + updateElementsFromFilter(); + return TRUE; +} +void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) +{ + LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; + if (!self) return; + + bool since_logoff=true; + if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) + { + since_logoff = false; + } + self->childSetValue("check_since_logoff", since_logoff); +} + +void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) +{ + mFilter = filter; + updateElementsFromFilter(); +} + +void LLFloaterInventoryFinder::updateElementsFromFilter() +{ + if (!mFilter) + return; + + // Get data needed for filter display + U32 filter_types = mFilter->getFilterTypes(); + std::string filter_string = mFilter->getFilterSubString(); + LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState(); + U32 hours = mFilter->getHoursAgo(); + + // update the ui elements + setTitle(mFilter->getName()); + + childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); + + childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); + childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); + childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); + childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); + childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); + childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); + childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); + childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); + childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); + childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); + childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); + childSetValue("check_since_logoff", mFilter->isSinceLogoff()); + mSpinSinceHours->set((F32)(hours % 24)); + mSpinSinceDays->set((F32)(hours / 24)); +} + +void LLFloaterInventoryFinder::draw() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW); + U32 filter = 0xffffffff; + BOOL filtered_by_all_types = TRUE; + + if (!childGetValue("check_animation")) + { + filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); + filtered_by_all_types = FALSE; + } + + + if (!childGetValue("check_calling_card")) + { + filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_clothing")) + { + filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_gesture")) + { + filter &= ~(0x1 << LLInventoryType::IT_GESTURE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_landmark")) + + + { + filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_notecard")) + { + filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_object")) + { + filter &= ~(0x1 << LLInventoryType::IT_OBJECT); + filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_script")) + { + filter &= ~(0x1 << LLInventoryType::IT_LSL); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_sound")) + { + filter &= ~(0x1 << LLInventoryType::IT_SOUND); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_texture")) + { + filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_snapshot")) + { + filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); + filtered_by_all_types = FALSE; + } + + if (!filtered_by_all_types) + { + // don't include folders in filter, unless I've selected everything + filter &= ~(0x1 << LLInventoryType::IT_CATEGORY); + } + + // update the panel, panel will update the filter + mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ? + LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mPanelMainInventory->getPanel()->setFilterTypes(filter); + if (getCheckSinceLogoff()) + { + mSpinSinceDays->set(0); + mSpinSinceHours->set(0); + } + U32 days = (U32)mSpinSinceDays->get(); + U32 hours = (U32)mSpinSinceHours->get(); + if (hours > 24) + { + days += hours / 24; + hours = (U32)hours % 24; + mSpinSinceDays->set((F32)days); + mSpinSinceHours->set((F32)hours); + } + hours += days * 24; + mPanelMainInventory->getPanel()->setHoursAgo(hours); + mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff()); + mPanelMainInventory->setFilterTextFromFilter(); + + LLPanel::draw(); +} + +BOOL LLFloaterInventoryFinder::getCheckShowEmpty() +{ + return childGetValue("check_show_empty"); +} + +BOOL LLFloaterInventoryFinder::getCheckSinceLogoff() +{ + return childGetValue("check_since_logoff"); +} + +void LLFloaterInventoryFinder::onCloseBtn(void* user_data) +{ + LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data; + finderp->closeFloater(); +} + +// static +void LLFloaterInventoryFinder::selectAllTypes(void* user_data) +{ + LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; + if(!self) return; + + self->childSetValue("check_animation", TRUE); + self->childSetValue("check_calling_card", TRUE); + self->childSetValue("check_clothing", TRUE); + self->childSetValue("check_gesture", TRUE); + self->childSetValue("check_landmark", TRUE); + self->childSetValue("check_notecard", TRUE); + self->childSetValue("check_object", TRUE); + self->childSetValue("check_script", TRUE); + self->childSetValue("check_sound", TRUE); + self->childSetValue("check_texture", TRUE); + self->childSetValue("check_snapshot", TRUE); +} + +//static +void LLFloaterInventoryFinder::selectNoTypes(void* user_data) +{ + LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; + if(!self) return; + + self->childSetValue("check_animation", FALSE); + self->childSetValue("check_calling_card", FALSE); + self->childSetValue("check_clothing", FALSE); + self->childSetValue("check_gesture", FALSE); + self->childSetValue("check_landmark", FALSE); + self->childSetValue("check_notecard", FALSE); + self->childSetValue("check_object", FALSE); + self->childSetValue("check_script", FALSE); + self->childSetValue("check_sound", FALSE); + self->childSetValue("check_texture", FALSE); + self->childSetValue("check_snapshot", FALSE); +} + +////////////////////////////////////////////////////////////////////////////////// +// List Commands // + +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)); + + LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); + trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this + , _4 // BOOL drop + , _5 // EDragAndDropType cargo_type + , _7 // EAcceptance* accept + )); + + mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2)); + mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2)); + mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + +} + +void LLPanelMainInventory::updateListCommands() +{ + bool trash_enabled = isActionEnabled("delete"); + + mListCommands->childSetEnabled("trash_btn", trash_enabled); +} + +void LLPanelMainInventory::onGearButtonClick() +{ + showActionMenu(mMenuGearDefault,"options_gear_btn"); +} + +void LLPanelMainInventory::onAddButtonClick() +{ + showActionMenu(mMenuAdd,"add_btn"); +} + +void LLPanelMainInventory::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); + } +} + +void LLPanelMainInventory::onTrashButtonClick() +{ + onClipboardAction("delete"); +} + +void LLPanelMainInventory::onClipboardAction(const LLSD& userdata) +{ + std::string command_name = userdata.asString(); + getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); +} + +void LLPanelMainInventory::onCustomAction(const LLSD& userdata) +{ + if (!isActionEnabled(userdata)) + return; + + const std::string command_name = userdata.asString(); + if (command_name == "new_window") + { + newWindow(); + } + if (command_name == "sort_by_name") + { + const LLSD arg = "name"; + setSortBy(arg); + } + if (command_name == "sort_by_recent") + { + const LLSD arg = "date"; + setSortBy(arg); + } + if (command_name == "show_filters") + { + toggleFindOptions(); + } + if (command_name == "reset_filters") + { + resetFilters(); + } + if (command_name == "close_folders") + { + closeAllFolders(); + } + if (command_name == "empty_trash") + { + const std::string notification = "ConfirmEmptyTrash"; + gInventory.emptyFolderType(notification, LLFolderType::FT_TRASH); + } + if (command_name == "empty_lostnfound") + { + const std::string notification = "ConfirmEmptyLostAndFound"; + gInventory.emptyFolderType(notification, LLFolderType::FT_LOST_AND_FOUND); + } + if (command_name == "save_texture") + { + LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + + const LLUUID& item_id = current_item->getListener()->getUUID(); + LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES); + if (preview_texture) + { + preview_texture->openToSave(); + } + } +} + +BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) +{ + const std::string command_name = userdata.asString(); + if (command_name == "delete") + { + BOOL can_delete = FALSE; + LLFolderView *folder = getActivePanel()->getRootFolder(); + if (folder) + { + can_delete = TRUE; + std::set<LLUUID> selection_set; + folder->getSelectionList(selection_set); + 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); + can_delete &= item->getListener()->isItemRemovable(); + } + return can_delete; + } + return FALSE; + } + if (command_name == "save_texture") + { + LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (current_item) + { + return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE); + } + return FALSE; + } + return TRUE; +} + +bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) +{ + *accept = ACCEPT_NO; + + const bool is_enabled = isActionEnabled("delete"); + if (is_enabled) *accept = ACCEPT_YES_MULTI; + + if (is_enabled && drop) + { + onClipboardAction("delete"); + } + return true; +} + +// List Commands // +//////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 29e9baa6cf2391a655aa29303287ccac625c15da..ae78d3bec82b0d1195c957b142fe4594596f8377 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -1,145 +1,149 @@ -/** - * @file llpanelmaininventory.h - * @brief llpanelmaininventory.h - * 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_LLPANELMAININVENTORY_H -#define LL_LLPANELMAININVENTORY_H - -#include "llpanel.h" -#include "llinventorymodel.h" -#include "llfolderview.h" - -class LLFolderViewItem; -class LLInventoryPanel; -class LLSaveFolderState; -class LLFilterEditor; -class LLTabContainer; -class LLFloaterInventoryFinder; -class LLMenuGL; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLPanelMainInventory -// -// This is a panel used to view and control an agent's inventory, -// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters). -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLPanelMainInventory : public LLPanel, LLInventoryObserver -{ -public: - friend class LLFloaterInventoryFinder; - - LLPanelMainInventory(); - ~LLPanelMainInventory(); - - BOOL postBuild(); - - virtual BOOL handleKeyHere(KEY key, MASK mask); - - // Inherited functionality - /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg); - /*virtual*/ void changed(U32 mask); - - LLInventoryPanel* getPanel() { return mActivePanel; } - LLInventoryPanel* getActivePanel() { return mActivePanel; } - const LLInventoryPanel* getActivePanel() const { return mActivePanel; } - - const std::string& getFilterText() const { return mFilterText; } - - void setSelectCallback(const LLFolderView::signal_t::slot_type& cb); - -protected: - // - // Misc functions - // - void setFilterTextFromFilter(); - void startSearch(); - - void toggleFindOptions(); - void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action); - - static BOOL filtersVisible(void* user_data); - 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(); - - const std::string getFilterSubString(); - void setFilterSubString(const std::string& string); - - // menu callbacks - void doToSelected(const LLSD& userdata); - void closeAllFolders(); - void newWindow(); - void doCreate(const LLSD& userdata); - void resetFilters(); - void setSortBy(const LLSD& userdata); - - // List Commands Handlers - void initListCommandsHandlers(); - void updateListCommands(); - void onGearButtonClick(); - void onAddButtonClick(); - void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); - 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); - - -private: - LLFloaterInventoryFinder* getFinder(); - - LLFilterEditor* mFilterEditor; - LLTabContainer* mFilterTabs; - LLHandle<LLFloater> mFinderHandle; - LLInventoryPanel* mActivePanel; - LLSaveFolderState* mSavedFolderState; - - LLPanel* mListCommands; - LLMenuGL* mMenuGearDefault; - LLMenuGL* mMenuAdd; - - std::string mFilterText; -}; - -#endif // LL_LLPANELMAININVENTORY_H - - - +/** + * @file llpanelmaininventory.h + * @brief llpanelmaininventory.h + * 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_LLPANELMAININVENTORY_H +#define LL_LLPANELMAININVENTORY_H + +#include "llpanel.h" +#include "llinventoryobserver.h" + +#include "llfolderview.h" + +class LLFolderViewItem; +class LLInventoryPanel; +class LLSaveFolderState; +class LLFilterEditor; +class LLTabContainer; +class LLFloaterInventoryFinder; +class LLMenuGL; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLPanelMainInventory +// +// This is a panel used to view and control an agent's inventory, +// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters). +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLPanelMainInventory : public LLPanel, LLInventoryObserver +{ +public: + friend class LLFloaterInventoryFinder; + + LLPanelMainInventory(); + ~LLPanelMainInventory(); + + BOOL postBuild(); + + virtual BOOL handleKeyHere(KEY key, MASK mask); + + // Inherited functionality + /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg); + /*virtual*/ void changed(U32 mask); + + LLInventoryPanel* getPanel() { return mActivePanel; } + LLInventoryPanel* getActivePanel() { return mActivePanel; } + const LLInventoryPanel* getActivePanel() const { return mActivePanel; } + + const std::string& getFilterText() const { return mFilterText; } + + void setSelectCallback(const LLFolderView::signal_t::slot_type& cb); + +protected: + // + // Misc functions + // + void setFilterTextFromFilter(); + void startSearch(); + + void toggleFindOptions(); + void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action); + + static BOOL filtersVisible(void* user_data); + 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(); + + const std::string getFilterSubString(); + void setFilterSubString(const std::string& string); + + // menu callbacks + void doToSelected(const LLSD& userdata); + void closeAllFolders(); + void newWindow(); + void doCreate(const LLSD& userdata); + void resetFilters(); + void setSortBy(const LLSD& userdata); + +private: + LLFloaterInventoryFinder* getFinder(); + + LLFilterEditor* mFilterEditor; + LLTabContainer* mFilterTabs; + LLHandle<LLFloater> mFinderHandle; + LLInventoryPanel* mActivePanel; + LLSaveFolderState* mSavedFolderState; + std::string mFilterText; + + + ////////////////////////////////////////////////////////////////////////////////// + // List Commands // +protected: + void initListCommandsHandlers(); + void updateListCommands(); + void onGearButtonClick(); + void onAddButtonClick(); + void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); + 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); +private: + LLPanel* mListCommands; + LLMenuGL* mMenuGearDefault; + LLMenuGL* mMenuAdd; + // List Commands // + //////////////////////////////////////////////////////////////////////////////// +}; + +#endif // LL_LLPANELMAININVENTORY_H + + + diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp new file mode 100644 index 0000000000000000000000000000000000000000..046118cf75b2e066de006c6a825a94bf45ba51f3 --- /dev/null +++ b/indra/newview/llpanelme.cpp @@ -0,0 +1,272 @@ +/** + * @file llpanelme.cpp + * @brief Side tray "Me" (My Profile) panel + * + * $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 "llviewerprecompiledheaders.h" + +#include "llpanelprofile.h" +#include "llavatarconstants.h" +#include "llpanelme.h" +#include "llagent.h" +#include "llagentwearables.h" +#include "lliconctrl.h" +#include "llsidetray.h" +#include "lltabcontainer.h" +#include "lltexturectrl.h" + +#define PICKER_SECOND_LIFE "2nd_life_pic" +#define PICKER_FIRST_LIFE "real_world_pic" +#define PANEL_PROFILE "panel_profile" + +static LLRegisterPanelClassWrapper<LLPanelMyProfileEdit> t_panel_me_profile_edit("edit_profile_panel"); +static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me"); + +LLPanelMe::LLPanelMe(void) + : LLPanelProfile() + , mEditPanel(NULL) +{ + setAvatarId(gAgent.getID()); +} + +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; +} + +void LLPanelMe::onOpen(const LLSD& key) +{ + LLPanelProfile::onOpen(key); +} + +void LLPanelMe::notifyChildren(const LLSD& info) +{ + if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state") + { + // Implement task panel tri-state behavior. + // + // When the button of an active open task panel is clicked, side tray + // calls notifyChildren() on the panel, passing task-panel-action=>handle-tri-state as an argument. + // The task panel is supposed to handle this by reverting to the default view, + // i.e. closing any dependent panels like "pick info" or "profile edit". + + bool on_default_view = true; + + const LLRect& task_panel_rect = getRect(); + for (LLView* child = getFirstChild(); child; child = findNextSibling(child)) + { + LLPanel* panel = dynamic_cast<LLPanel*>(child); + if (!panel) + continue; + + // *HACK: implement panel stack instead (e.g. me->pick_info->pick_edit). + if (panel->getRect().getWidth() == task_panel_rect.getWidth() && + panel->getRect().getHeight() == task_panel_rect.getHeight() && + panel->getVisible()) + { + panel->setVisible(FALSE); + on_default_view = false; + } + } + + if (on_default_view) + LLSideTray::getInstance()->collapseSideBar(); + + return; // this notification is only supposed to be handled by task panels + } + + LLPanel::notifyChildren(info); +} + +void LLPanelMe::buildEditPanel() +{ + if (NULL == mEditPanel) + { + mEditPanel = new LLPanelMyProfileEdit(); + mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this); + mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this); + } +} + + +void LLPanelMe::onEditProfileClicked() +{ + buildEditPanel(); + togglePanel(mEditPanel, getAvatarId()); // open +} + +void LLPanelMe::onEditAppearanceClicked() +{ + if (gAgentWearables.areWearablesLoaded()) + { + gAgent.changeCameraToCustomizeAvatar(); + } +} + +void LLPanelMe::onSaveChangesClicked() +{ + LLAvatarData data = LLAvatarData(); + data.avatar_id = gAgent.getID(); + data.image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_SECOND_LIFE)->getImageAssetID(); + data.fl_image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_FIRST_LIFE)->getImageAssetID(); + data.about_text = mEditPanel->childGetValue("sl_description_edit").asString(); + data.fl_about_text = mEditPanel->childGetValue("fl_description_edit").asString(); + data.profile_url = mEditPanel->childGetValue("homepage_edit").asString(); + data.allow_publish = mEditPanel->childGetValue("show_in_search_checkbox"); + + LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data); + togglePanel(mEditPanel); // close + onOpen(getAvatarId()); +} + +void LLPanelMe::onCancelClicked() +{ + togglePanel(mEditPanel); // close +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLPanelMyProfileEdit::LLPanelMyProfileEdit() + : LLPanelMyProfile() +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_edit_profile.xml"); + + setAvatarId(gAgent.getID()); +} + +void LLPanelMyProfileEdit::onOpen(const LLSD& key) +{ + resetData(); + + // Disable editing until data is loaded, or edited fields will be overwritten when data + // is loaded. + enableEditing(false); + LLPanelMyProfile::onOpen(getAvatarId()); +} + +void LLPanelMyProfileEdit::processProperties(void* data, EAvatarProcessorType type) +{ + if(APT_PROPERTIES == type) + { + const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data); + if(avatar_data && getAvatarId() == avatar_data->avatar_id) + { + // *TODO dzaporozhan + // Workaround for ticket EXT-1099, waiting for fix for ticket EXT-1128 + enableEditing(true); + processProfileProperties(avatar_data); + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); + } + } +} + +void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_data) +{ + fillCommonData(avatar_data); + + fillOnlineStatus(avatar_data); + + fillPartnerData(avatar_data); + + fillAccountStatus(avatar_data); + + childSetValue("show_in_search_checkbox", (BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH)); + + std::string first, last; + BOOL found = gCacheName->getName(avatar_data->avatar_id, first, last); + if (found) + { + childSetTextArg("name_text", "[FIRST]", first); + childSetTextArg("name_text", "[LAST]", last); + } +} + +BOOL LLPanelMyProfileEdit::postBuild() +{ + initTexturePickerMouseEvents(); + + childSetTextArg("partner_edit_link", "[URL]", getString("partner_edit_link_url")); + + return LLPanelAvatarProfile::postBuild(); +} +/** + * Inits map with texture picker and appropriate edit icon. + * Sets callbacks of Mouse Enter and Mouse Leave signals of Texture Pickers + */ +void LLPanelMyProfileEdit::initTexturePickerMouseEvents() +{ + LLTextureCtrl* text_pic = getChild<LLTextureCtrl>(PICKER_SECOND_LIFE); + LLIconCtrl* text_icon = getChild<LLIconCtrl>("2nd_life_edit_icon"); + mTextureEditIconMap[text_pic->getName()] = text_icon; + text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1)); + text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1)); + text_icon->setVisible(FALSE); + + text_pic = getChild<LLTextureCtrl>(PICKER_FIRST_LIFE); + text_icon = getChild<LLIconCtrl>("real_world_edit_icon"); + mTextureEditIconMap[text_pic->getName()] = text_icon; + text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1)); + text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1)); + text_icon->setVisible(FALSE); +} + +void LLPanelMyProfileEdit::resetData() +{ + LLPanelMyProfile::resetData(); + + childSetTextArg("name_text", "[FIRST]", LLStringUtil::null); + childSetTextArg("name_text", "[LAST]", LLStringUtil::null); +} + +void LLPanelMyProfileEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl) +{ + mTextureEditIconMap[ctrl->getName()]->setVisible(TRUE); +} +void LLPanelMyProfileEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl) +{ + mTextureEditIconMap[ctrl->getName()]->setVisible(FALSE); +} + +void LLPanelMyProfileEdit::enableEditing(bool enable) +{ + childSetEnabled("2nd_life_pic", enable); + childSetEnabled("real_world_pic", enable); + childSetEnabled("sl_description_edit", enable); + childSetEnabled("fl_description_edit", enable); + childSetEnabled("homepage_edit", enable); + childSetEnabled("show_in_search_checkbox", enable); +} diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h new file mode 100644 index 0000000000000000000000000000000000000000..17d367132edb82b6d7e2f768a4ffb190705cf1ae --- /dev/null +++ b/indra/newview/llpanelme.h @@ -0,0 +1,111 @@ +/** + * @file llpanelme.h + * @brief Side tray "Me" (My Profile) panel + * + * $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_LLPANELMEPROFILE_H +#define LL_LLPANELMEPROFILE_H + +#include "llpanel.h" +#include "llpanelavatar.h" + +class LLPanelMyProfileEdit; +class LLPanelProfile; +class LLIconCtrl; + +/** +* Panel for displaying Agent's profile, it consists of two sub panels - Profile +* and Picks. +* LLPanelMe allows user to edit his profile and picks. +*/ +class LLPanelMe : public LLPanelProfile +{ + LOG_CLASS(LLPanelMe); + +public: + + LLPanelMe(); + + /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void notifyChildren(const LLSD& info); + + /*virtual*/ BOOL postBuild(); + +private: + + void buildEditPanel(); + + void onEditProfileClicked(); + void onEditAppearanceClicked(); + void onSaveChangesClicked(); + void onCancelClicked(); + + LLPanelMyProfileEdit * mEditPanel; + +}; + +class LLPanelMyProfileEdit : public LLPanelMyProfile +{ + LOG_CLASS(LLPanelMyProfileEdit); + +public: + + LLPanelMyProfileEdit(); + + /*virtual*/void processProperties(void* data, EAvatarProcessorType type); + + /*virtual*/BOOL postBuild(); + + /*virtual*/ void onOpen(const LLSD& key); + +protected: + + /*virtual*/void resetData(); + + void processProfileProperties(const LLAvatarData* avatar_data); + +private: + void initTexturePickerMouseEvents(); + void onTexturePickerMouseEnter(LLUICtrl* ctrl); + void onTexturePickerMouseLeave(LLUICtrl* ctrl); + + /** + * Enabled/disables controls to prevent overwriting edited data upon receiving + * current data from server. + */ + void enableEditing(bool enable); + +private: + // map TexturePicker name => Edit Icon pointer should be visible while hovering Texture Picker + typedef std::map<std::string, LLIconCtrl*> texture_edit_icon_map_t; + texture_edit_icon_map_t mTextureEditIconMap; +}; + +#endif // LL_LLPANELMEPROFILE_H diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 2cf56d557117d29d95b611d18c79a22d62be6a6c..ad8a379cc1dd66bd5cd88af833196518db2d285c 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -322,13 +322,19 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview() { if ( mHomeURL->getValue().asString().length() > 0 ) { - mPreviewMedia->navigateTo( mHomeURL->getValue().asString() ); + if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString()) + { + mPreviewMedia->navigateTo( mHomeURL->getValue().asString() ); + } } else // new home URL will be empty if media is deleted so display a // "preview goes here" data url page { - mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL ); + if(mPreviewMedia->getCurrentNavUrl() != CHECKERBOARD_DATA_URL) + { + mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL ); + } }; } diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index bec2494eac9b589d67fe20d5bad5c7060c817069..1a772e4effd45ff74d1252d4ce2130337e4d5619 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -1,345 +1,345 @@ -/** - * @file llpanelmediasettingssecurity.cpp - * @brief LLPanelMediaSettingsSecurity class implementation - * - * $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 "llviewerprecompiledheaders.h" -#include "llfloaterreg.h" -#include "llpanelmediasettingssecurity.h" -#include "llpanelcontents.h" -#include "llcheckboxctrl.h" -#include "llscrolllistctrl.h" -#include "llscrolllistitem.h" -#include "lluictrlfactory.h" -#include "llwindow.h" -#include "llviewerwindow.h" -#include "llsdutil.h" -#include "llselectmgr.h" -#include "llmediaentry.h" -#include "llfloaterwhitelistentry.h" -#include "llfloatermediasettings.h" -//////////////////////////////////////////////////////////////////////////////// -// -LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() : - mParent( NULL ) -{ - mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this)); - mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this)); - // build dialog from XML - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml"); - -} - -//////////////////////////////////////////////////////////////////////////////// -// -BOOL LLPanelMediaSettingsSecurity::postBuild() -{ - mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY ); - mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY ); - - setDefaultBtn("whitelist_add"); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// virtual -LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity() -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::draw() -{ - // housekeeping - LLPanel::draw(); - - // if list is empty, disable DEL button and checkbox to enable use of list - if ( mWhiteListList->isEmpty() ) - { - childSetEnabled( "whitelist_del", false ); - childSetEnabled( LLMediaEntry::WHITELIST_KEY, false ); - childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false ); - } - else - { - childSetEnabled( "whitelist_del", true ); - childSetEnabled( LLMediaEntry::WHITELIST_KEY, true ); - childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true ); - }; - - // if nothing is selected, disable DEL button - if ( mWhiteListList->getSelectedValue().asString().empty() ) - { - childSetEnabled( "whitelist_del", false ); - } - else - { - childSetEnabled( "whitelist_del", true ); - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable) -{ - LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; - - if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo ) - { - if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) - { - self->clearValues(self, editable); - // only show multiple - return; - } - - } - else - { - if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) - { - self->clearValues(self, editable); - // only show multiple - return; - } - - } - std::string base_key( "" ); - std::string tentative_key( "" ); - - struct - { - std::string key_name; - LLUICtrl* ctrl_ptr; - std::string ctrl_type; - - } data_set [] = - { - { LLMediaEntry::WHITELIST_ENABLE_KEY, self->mEnableWhiteList, "LLCheckBoxCtrl" }, - { LLMediaEntry::WHITELIST_KEY, self->mWhiteListList, "LLScrollListCtrl" }, - { "", NULL , "" } - }; - - for( int i = 0; data_set[ i ].key_name.length() > 0; ++i ) - { - base_key = std::string( data_set[ i ].key_name ); - tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ); - - // TODO: CP - I bet there is a better way to do this using Boost - if ( media_settings[ base_key ].isDefined() ) - { - if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" ) - { - static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )-> - setValue( media_settings[ base_key ].asBoolean() ); - } - else - if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" ) - { - // get control - LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr ); - list->deleteAllItems(); - - // points to list of white list URLs - LLSD url_list = media_settings[ base_key ]; - - // iterate over them and add to scroll list - LLSD::array_iterator iter = url_list.beginArray(); - while( iter != url_list.endArray() ) - { - // TODO: is iter guaranteed to be valid here? - std::string url = *iter; - list->addSimpleElement( url ); - ++iter; - }; - }; - data_set[ i ].ctrl_ptr->setEnabled(editable); - data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() ); - }; - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable) -{ - LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; - self->mEnableWhiteList->clear(); - self->mWhiteListList->deleteAllItems(); - self->mEnableWhiteList->setEnabled(editable); - self->mWhiteListList->setEnabled(editable); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::preApply() -{ - // no-op -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) -{ - fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue(); - - // iterate over white list and extract items - std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); - std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); - // *NOTE: need actually set the key to be an emptyArray(), or the merge - // we do with this LLSD will think there's nothing to change. - fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); - while( iter != white_list_items.end() ) - { - std::string white_list_url = (*iter)->getValue().asString(); - fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url ); - ++iter; - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::postApply() -{ - // no-op -} - -/////////////////////////////////////////////////////////////////////////////// -// Try to make a valid URL if a fragment ( -// white list list box widget and build a list to test against. Can also -const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url ) -{ - // use LLURI to determine if we have a valid scheme - LLURI candidate_url( src_url ); - if ( candidate_url.scheme().empty() ) - { - // build a URL comprised of default scheme and the original fragment - const std::string default_scheme( "http://" ); - return default_scheme + src_url; - }; - - // we *could* test the "default scheme" + "original fragment" URL again - // using LLURI to see if it's valid but I think the outcome is the same - // in either case - our only option is to return the original URL - - // we *think* the original url passed in was valid - return src_url; -} - -/////////////////////////////////////////////////////////////////////////////// -// wrapper for testing a URL against the whitelist. We grab entries from -// white list list box widget and build a list to test against. Can also -// optionally pass the URL that you are trying to add to the widget since -// it won't be added until this call returns. -bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url, - const std::string& test_url ) -{ - // the checkUrlAgainstWhitelist(..) function works on a vector - // of strings for the white list entries - in this panel, the white list - // is stored in the widgets themselves so we need to build something compatible. - std::vector< std::string > whitelist_strings; - whitelist_strings.clear(); // may not be required - I forget what the spec says. - - // step through whitelist widget entries and grab them as strings - std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); - std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); - while( iter != white_list_items.end() ) - { - const std::string whitelist_url = (*iter)->getValue().asString(); - whitelist_strings.push_back( whitelist_url ); - - ++iter; - }; - - // add in the URL that might be added to the whitelist so we can test that too - if ( added_url.length() ) - whitelist_strings.push_back( added_url ); - - // possible the URL is just a fragment so we validize it - const std::string valid_url = makeValidUrl( test_url ); - - // indicate if the URL passes whitelist - return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings ); -} - -/////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url) -{ - // grab home URL from the general panel (via the parent floater) - std::string home_url( "" ); - if ( mParent ) - home_url = mParent->getHomeUrl(); - - // if the home URL is blank (user hasn't entered it yet) then - // don't bother to check if it passes the white list - if ( home_url.empty() ) - { - mWhiteListList->addSimpleElement( url ); - return; - }; - - // if the URL passes the white list, add it - if ( passesWhiteList( url, home_url ) ) - { - mWhiteListList->addSimpleElement( url ); - } - else - // display a message indicating you can't do that - { - LLNotifications::instance().add("WhiteListInvalidatesHomeUrl"); - }; -} - -/////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata ) -{ - LLFloaterReg::showInstance("whitelist_entry"); -} - -/////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata ) -{ - LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; - - self->mWhiteListList->deleteSelectedItems(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent ) -{ - mParent = parent; -}; - +/** + * @file llpanelmediasettingssecurity.cpp + * @brief LLPanelMediaSettingsSecurity class implementation + * + * $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 "llviewerprecompiledheaders.h" +#include "llfloaterreg.h" +#include "llpanelmediasettingssecurity.h" +#include "llpanelcontents.h" +#include "llcheckboxctrl.h" +#include "llscrolllistctrl.h" +#include "llscrolllistitem.h" +#include "lluictrlfactory.h" +#include "llwindow.h" +#include "llviewerwindow.h" +#include "llsdutil.h" +#include "llselectmgr.h" +#include "llmediaentry.h" +#include "llfloaterwhitelistentry.h" +#include "llfloatermediasettings.h" +//////////////////////////////////////////////////////////////////////////////// +// +LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() : + mParent( NULL ) +{ + mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this)); + mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this)); + // build dialog from XML + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml"); + +} + +//////////////////////////////////////////////////////////////////////////////// +// +BOOL LLPanelMediaSettingsSecurity::postBuild() +{ + mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY ); + mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY ); + + setDefaultBtn("whitelist_add"); + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::draw() +{ + // housekeeping + LLPanel::draw(); + + // if list is empty, disable DEL button and checkbox to enable use of list + if ( mWhiteListList->isEmpty() ) + { + childSetEnabled( "whitelist_del", false ); + childSetEnabled( LLMediaEntry::WHITELIST_KEY, false ); + childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false ); + } + else + { + childSetEnabled( "whitelist_del", true ); + childSetEnabled( LLMediaEntry::WHITELIST_KEY, true ); + childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true ); + }; + + // if nothing is selected, disable DEL button + if ( mWhiteListList->getSelectedValue().asString().empty() ) + { + childSetEnabled( "whitelist_del", false ); + } + else + { + childSetEnabled( "whitelist_del", true ); + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// static +void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable) +{ + LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; + + if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo ) + { + if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) + { + self->clearValues(self, editable); + // only show multiple + return; + } + + } + else + { + if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) + { + self->clearValues(self, editable); + // only show multiple + return; + } + + } + std::string base_key( "" ); + std::string tentative_key( "" ); + + struct + { + std::string key_name; + LLUICtrl* ctrl_ptr; + std::string ctrl_type; + + } data_set [] = + { + { LLMediaEntry::WHITELIST_ENABLE_KEY, self->mEnableWhiteList, "LLCheckBoxCtrl" }, + { LLMediaEntry::WHITELIST_KEY, self->mWhiteListList, "LLScrollListCtrl" }, + { "", NULL , "" } + }; + + for( int i = 0; data_set[ i ].key_name.length() > 0; ++i ) + { + base_key = std::string( data_set[ i ].key_name ); + tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ); + + // TODO: CP - I bet there is a better way to do this using Boost + if ( media_settings[ base_key ].isDefined() ) + { + if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" ) + { + static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )-> + setValue( media_settings[ base_key ].asBoolean() ); + } + else + if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" ) + { + // get control + LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr ); + list->deleteAllItems(); + + // points to list of white list URLs + LLSD url_list = media_settings[ base_key ]; + + // iterate over them and add to scroll list + LLSD::array_iterator iter = url_list.beginArray(); + while( iter != url_list.endArray() ) + { + // TODO: is iter guaranteed to be valid here? + std::string url = *iter; + list->addSimpleElement( url ); + ++iter; + }; + }; + data_set[ i ].ctrl_ptr->setEnabled(editable); + data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() ); + }; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// static +void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable) +{ + LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; + self->mEnableWhiteList->clear(); + self->mWhiteListList->deleteAllItems(); + self->mEnableWhiteList->setEnabled(editable); + self->mWhiteListList->setEnabled(editable); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::preApply() +{ + // no-op +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) +{ + fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue(); + + // iterate over white list and extract items + std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); + std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); + // *NOTE: need actually set the key to be an emptyArray(), or the merge + // we do with this LLSD will think there's nothing to change. + fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); + while( iter != white_list_items.end() ) + { + std::string white_list_url = (*iter)->getValue().asString(); + fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url ); + ++iter; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::postApply() +{ + // no-op +} + +/////////////////////////////////////////////////////////////////////////////// +// Try to make a valid URL if a fragment ( +// white list list box widget and build a list to test against. Can also +const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url ) +{ + // use LLURI to determine if we have a valid scheme + LLURI candidate_url( src_url ); + if ( candidate_url.scheme().empty() ) + { + // build a URL comprised of default scheme and the original fragment + const std::string default_scheme( "http://" ); + return default_scheme + src_url; + }; + + // we *could* test the "default scheme" + "original fragment" URL again + // using LLURI to see if it's valid but I think the outcome is the same + // in either case - our only option is to return the original URL + + // we *think* the original url passed in was valid + return src_url; +} + +/////////////////////////////////////////////////////////////////////////////// +// wrapper for testing a URL against the whitelist. We grab entries from +// white list list box widget and build a list to test against. Can also +// optionally pass the URL that you are trying to add to the widget since +// it won't be added until this call returns. +bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url, + const std::string& test_url ) +{ + // the checkUrlAgainstWhitelist(..) function works on a vector + // of strings for the white list entries - in this panel, the white list + // is stored in the widgets themselves so we need to build something compatible. + std::vector< std::string > whitelist_strings; + whitelist_strings.clear(); // may not be required - I forget what the spec says. + + // step through whitelist widget entries and grab them as strings + std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); + std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); + while( iter != white_list_items.end() ) + { + const std::string whitelist_url = (*iter)->getValue().asString(); + whitelist_strings.push_back( whitelist_url ); + + ++iter; + }; + + // add in the URL that might be added to the whitelist so we can test that too + if ( added_url.length() ) + whitelist_strings.push_back( added_url ); + + // possible the URL is just a fragment so we validize it + const std::string valid_url = makeValidUrl( test_url ); + + // indicate if the URL passes whitelist + return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings ); +} + +/////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url) +{ + // grab home URL from the general panel (via the parent floater) + std::string home_url( "" ); + if ( mParent ) + home_url = mParent->getHomeUrl(); + + // if the home URL is blank (user hasn't entered it yet) then + // don't bother to check if it passes the white list + if ( home_url.empty() ) + { + mWhiteListList->addSimpleElement( url ); + return; + }; + + // if the URL passes the white list, add it + if ( passesWhiteList( url, home_url ) ) + { + mWhiteListList->addSimpleElement( url ); + } + else + // display a message indicating you can't do that + { + LLNotifications::instance().add("WhiteListInvalidatesHomeUrl"); + }; +} + +/////////////////////////////////////////////////////////////////////////////// +// static +void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata ) +{ + LLFloaterReg::showInstance("whitelist_entry"); +} + +/////////////////////////////////////////////////////////////////////////////// +// static +void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata ) +{ + LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; + + self->mWhiteListList->deleteSelectedItems(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent ) +{ + mParent = parent; +}; + diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index a5e9407a41f05b9cfcf81f9820ed5bbdd7811c70..4237681c800f61d88791882045ad3e6da319a066 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -41,6 +41,7 @@ #include "llpanelobjectinventory.h" +#include "llmenugl.h" #include "roles_constants.h" #include "llagent.h" @@ -1158,10 +1159,17 @@ void LLTaskLSLBridge::openItem() { return; } - LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES); - if (preview && (object->permModify() || gAgent.isGodlike())) + if (object->permModify() || gAgent.isGodlike()) { - preview->setObjectID(mPanel->getTaskUUID()); + LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES); + if (preview) + { + preview->setObjectID(mPanel->getTaskUUID()); + } + } + else + { + LLNotifications::instance().add("CannotOpenScriptObjectNoMod"); } } @@ -1570,6 +1578,7 @@ void LLPanelObjectInventory::reset() p.name = "task inventory"; p.task_id = getTaskUUID(); p.parent_panel = this; + p.tool_tip= p.name; mFolders = LLUICtrlFactory::create<LLFolderView>(p); // this ensures that we never say "searching..." or "no items found" mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); @@ -1711,6 +1720,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); p.root = mFolders; p.listener = bridge; + p.tool_tip = p.name; new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p); new_folder->addToFolder(mFolders, mFolders); new_folder->toggleOpen(); @@ -1751,6 +1761,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); p.root = mFolders; p.listener = bridge; + p.tool_tip = p.name; view = LLUICtrlFactory::create<LLFolderViewFolder>(p); child_categories.put(new obj_folder_pair(obj, (LLFolderViewFolder*)view)); @@ -1764,6 +1775,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento params.root(mFolders); params.listener(bridge); params.rect(LLRect()); + params.tool_tip = params.name; view = LLUICtrlFactory::create<LLFolderViewItem> (params); } view->addToFolder(folder, mFolders); diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5ad9bf056e090fa85a69b5c681f697a8dbe87bde --- /dev/null +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -0,0 +1,347 @@ +/** + * @file llpaneloutfitsinventory.cpp + * @brief Outfits inventory panel + * + * $LicenseInfo:firstyear=2009&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 "llpaneloutfitsinventory.h" + +#include "llagent.h" +#include "llagentwearables.h" + +#include "llbutton.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "llfloaterinventory.h" +#include "llfoldervieweventlistener.h" +#include "llinventoryfunctions.h" +#include "llinventorypanel.h" +#include "lllandmark.h" +#include "llsidepanelappearance.h" +#include "llsidetray.h" +#include "lltabcontainer.h" +#include "llviewerfoldertype.h" +#include "llviewerjointattachment.h" +#include "llvoavatarself.h" + +// List Commands +#include "lldndbutton.h" +#include "llmenugl.h" +#include "llviewermenu.h" + +static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory"); + +LLPanelOutfitsInventory::LLPanelOutfitsInventory() : + mInventoryPanel(NULL), + mParent(NULL) +{ + mSavedFolderState = new LLSaveFolderState(); + mSavedFolderState->setApply(FALSE); +} + +LLPanelOutfitsInventory::~LLPanelOutfitsInventory() +{ + delete mSavedFolderState; +} + +// virtual +BOOL LLPanelOutfitsInventory::postBuild() +{ + mInventoryPanel = getChild<LLInventoryPanel>("outfits_list"); + mInventoryPanel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, TRUE); + mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_MY_OUTFITS); + mInventoryPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2)); + + initListCommandsHandlers(); + return TRUE; +} + +void LLPanelOutfitsInventory::updateParent() +{ + if (mParent) + { + mParent->updateVerbs(); + } +} + +void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent) +{ + mParent = parent; +} + +// virtual +void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) +{ + if (string == "") + { + mInventoryPanel->setFilterSubString(LLStringUtil::null); + + // re-open folders that were initially open + mSavedFolderState->setApply(TRUE); + getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + LLOpenFoldersWithSelection opener; + getRootFolder()->applyFunctorRecursively(opener); + getRootFolder()->scrollToShowSelection(); + } + + gInventory.startBackgroundFetch(); + + if (mInventoryPanel->getFilterSubString().empty() && string.empty()) + { + // current filter and new filter empty, do nothing + return; + } + + // save current folder open state if no filter currently applied + if (getRootFolder()->getFilterSubString().empty()) + { + mSavedFolderState->setApply(FALSE); + getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + } + + // set new filter string + mInventoryPanel->setFilterSubString(string); +} + +void LLPanelOutfitsInventory::onWear() +{ + LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); + if (listenerp) + { + listenerp->performAction(NULL, NULL,"replaceoutfit"); + } +} + +void LLPanelOutfitsInventory::onEdit() +{ +} + +void LLPanelOutfitsInventory::onNew() +{ + const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT); + LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); + getRootFolder()->setSelectionByID(outfit_folder, TRUE); + getRootFolder()->setNeedsAutoRename(TRUE); +} + +void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) +{ + updateParent(); +} + +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() +{ + LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); + if (!current_item) + return NULL; + + LLFolderViewEventListener* listenerp = current_item->getListener(); + if (getIsCorrectType(listenerp)) + { + return listenerp; + } + return NULL; +} + +bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const +{ + if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY) + { + LLViewerInventoryCategory *cat = gInventory.getCategory(listenerp->getUUID()); + if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return true; + } + } + return false; +} + +LLFolderView *LLPanelOutfitsInventory::getRootFolder() +{ + return mInventoryPanel->getRootFolder(); +} + +////////////////////////////////////////////////////////////////////////////////// +// List Commands // + +void LLPanelOutfitsInventory::initListCommandsHandlers() +{ + mListCommands = getChild<LLPanel>("bottom_panel"); + + mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this)); + mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); + mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this)); + + LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); + trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this + , _4 // BOOL drop + , _5 // EDragAndDropType cargo_type + , _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()); +} + +void LLPanelOutfitsInventory::updateListCommands() +{ + bool trash_enabled = isActionEnabled("delete"); + + mListCommands->childSetEnabled("trash_btn", trash_enabled); +} + +void LLPanelOutfitsInventory::onGearButtonClick() +{ + showActionMenu(mMenuGearDefault,"options_gear_btn"); +} + +void LLPanelOutfitsInventory::onAddButtonClick() +{ + onNew(); +} + +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); + } +} + +void LLPanelOutfitsInventory::onTrashButtonClick() +{ + onClipboardAction("delete"); +} + +void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata) +{ + std::string command_name = userdata.asString(); + getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); +} + +void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata) +{ + if (!isActionEnabled(userdata)) + return; + + const std::string command_name = userdata.asString(); + if (command_name == "new") + { + onNew(); + } + if (command_name == "edit") + { + onEdit(); + } + if (command_name == "wear") + { + onWear(); + } + if (command_name == "delete") + { + onClipboardAction("delete"); + } +} + +BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) +{ + const std::string command_name = userdata.asString(); + if (command_name == "delete") + { + BOOL can_delete = FALSE; + LLFolderView *folder = getActivePanel()->getRootFolder(); + if (folder) + { + can_delete = TRUE; + std::set<LLUUID> selection_set; + folder->getSelectionList(selection_set); + 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); + can_delete &= item->getListener()->isItemRemovable(); + } + return can_delete; + } + return FALSE; + } + if (command_name == "edit" || + command_name == "wear") + { + return (getCorrectListenerForAction() != NULL); + } + return TRUE; +} + +bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) +{ + *accept = ACCEPT_NO; + + const bool is_enabled = isActionEnabled("delete"); + if (is_enabled) *accept = ACCEPT_YES_MULTI; + + if (is_enabled && drop) + { + onClipboardAction("delete"); + } + return true; +} + +// List Commands // +//////////////////////////////////////////////////////////////////////////////// + diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h new file mode 100644 index 0000000000000000000000000000000000000000..4d903a389bc396124139d4f1e3784f571955f462 --- /dev/null +++ b/indra/newview/llpaneloutfitsinventory.h @@ -0,0 +1,102 @@ +/** + * @file llpaneloutfitsinventory.h + * @brief Outfits inventory panel + * class definition + * + * $LicenseInfo:firstyear=2009&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_LLPANELOUTFITSINVENTORY_H +#define LL_LLPANELOUTFITSINVENTORY_H + +#include "llpanel.h" +#include "llinventoryobserver.h" + +class LLFolderView; +class LLFolderViewItem; +class LLFolderViewEventListener; +class LLInventoryPanel; +class LLSaveFolderState; +class LLButton; +class LLMenuGL; +class LLSidepanelAppearance; + +class LLPanelOutfitsInventory : public LLPanel +{ +public: + LLPanelOutfitsInventory(); + virtual ~LLPanelOutfitsInventory(); + + /*virtual*/ BOOL postBuild(); + + void onSearchEdit(const std::string& string); + void onWear(); + void onEdit(); + void onNew(); + + void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); + void onSelectorButtonClicked(); + + LLInventoryPanel* getActivePanel() { return mInventoryPanel; } + + // If a compatible listener type is selected, then return a pointer to that. + // Otherwise, return NULL. + LLFolderViewEventListener* getCorrectListenerForAction(); + void setParent(LLSidepanelAppearance *parent); +protected: + void updateParent(); + bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; + LLFolderView* getRootFolder(); + +private: + LLSidepanelAppearance* mParent; + LLInventoryPanel* mInventoryPanel; + LLSaveFolderState* mSavedFolderState; + + + ////////////////////////////////////////////////////////////////////////////////// + // List Commands // +protected: + void initListCommandsHandlers(); + void updateListCommands(); + void onGearButtonClick(); + void onAddButtonClick(); + void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); + 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); +private: + LLPanel* mListCommands; + LLMenuGL* mMenuGearDefault; + LLMenuGL* mMenuAdd; + // // + //////////////////////////////////////////////////////////////////////////////// +}; + +#endif //LL_LLPANELOUTFITSINVENTORY_H diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index a6083a5755f8e82a00407c298020fe7a3810b367..f9e6e5507ce6a2004bc8865e0825c3287cfb718d 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -54,12 +54,16 @@ #include "llfriendcard.h" #include "llgroupactions.h" #include "llgrouplist.h" +#include "llinventoryobserver.h" #include "llpanelpeoplemenus.h" +#include "llsidetray.h" +#include "llsidetraypanelcontainer.h" #include "llrecentpeople.h" #include "llviewercontrol.h" // for gSavedSettings #include "llviewermenu.h" // for gMenuHolder #include "llvoiceclient.h" #include "llworld.h" +#include "llspeakers.h" #define FRIEND_LIST_UPDATE_TIMEOUT 0.5 #define NEARBY_LIST_UPDATE_INTERVAL 1 @@ -119,8 +123,84 @@ class LLAvatarItemStatusComparator : public LLAvatarItemComparator } }; +/** Compares avatar items by distance between you and them */ +class LLAvatarItemDistanceComparator : public LLAvatarItemComparator +{ +public: + typedef std::map < LLUUID, LLVector3d > id_to_pos_map_t; + LLAvatarItemDistanceComparator() {}; + + void updateAvatarsPositions(std::vector<LLVector3d>& positions, std::vector<LLUUID>& uuids) + { + std::vector<LLVector3d>::const_iterator + pos_it = positions.begin(), + pos_end = positions.end(); + + std::vector<LLUUID>::const_iterator + id_it = uuids.begin(), + id_end = uuids.end(); + + LLAvatarItemDistanceComparator::id_to_pos_map_t pos_map; + + mAvatarsPositions.clear(); + + for (;pos_it != pos_end && id_it != id_end; ++pos_it, ++id_it ) + { + mAvatarsPositions[*id_it] = *pos_it; + } + }; + +protected: + virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const + { + const LLVector3d& me_pos = gAgent.getPositionGlobal(); + const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second; + const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second; + F32 dist1 = dist_vec(item1_pos, me_pos); + F32 dist2 = dist_vec(item2_pos, me_pos); + return dist1 < dist2; + } +private: + id_to_pos_map_t mAvatarsPositions; +}; + +/** Comparator for comparing nearby avatar items by last spoken time */ +class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator +{ +public: + LLAvatarItemRecentSpeakerComparator() {}; + virtual ~LLAvatarItemRecentSpeakerComparator() {}; + +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()); + if ( lhs.notNull() && rhs.notNull() ) + { + // Compare by last speaking time + if( lhs->mLastSpokeTime != rhs->mLastSpokeTime ) + return ( lhs->mLastSpokeTime > rhs->mLastSpokeTime ); + } + else if ( lhs.notNull() ) + { + // True if only item1 speaker info available + return true; + } + else if ( rhs.notNull() ) + { + // False if only item2 speaker info available + return false; + } + // By default compare by name. + return LLAvatarItemNameComparator::doCompare(item1, item2); + } +}; + static const LLAvatarItemRecentComparator RECENT_COMPARATOR; static const LLAvatarItemStatusComparator STATUS_COMPARATOR; +static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR; +static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR; static LLRegisterPanelClassWrapper<LLPanelPeople> t_people("panel_people"); @@ -370,6 +450,7 @@ LLPanelPeople::LLPanelPeople() mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this)); mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this)); mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList, this)); + mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this)); } LLPanelPeople::~LLPanelPeople() @@ -404,7 +485,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva BOOL LLPanelPeople::postBuild() { - mVisibleSignal.connect(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2)); + setVisibleCallback(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2)); mFilterEditor = getChild<LLFilterEditor>("filter_input"); mFilterEditor->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); @@ -432,14 +513,16 @@ BOOL LLPanelPeople::postBuild() mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); + mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); + mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); setSortOrder(mRecentList, (ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"), false); setSortOrder(mAllFriendList, (ESortOrder)gSavedSettings.getU32("FriendsSortOrder"), false); + setSortOrder(mNearbyList, (ESortOrder)gSavedSettings.getU32("NearbyPeopleSortOrder"), false); LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME); groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked, this)); groups_panel->childSetAction("plus_btn", boost::bind(&LLPanelPeople::onGroupPlusButtonClicked, this)); - groups_panel->childSetAction("minus_btn", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this)); LLPanel* friends_panel = getChild<LLPanel>(FRIENDS_TAB_NAME); friends_panel->childSetAction("add_btn", boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked, this)); @@ -455,8 +538,15 @@ BOOL LLPanelPeople::postBuild() mNearbyList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mNearbyList)); mRecentList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mRecentList)); + // Set openning IM as default on return action for avatar lists + mOnlineFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this)); + mAllFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this)); + mNearbyList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this)); + mRecentList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this)); + mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this)); mGroupList->setCommitCallback(boost::bind(&LLPanelPeople::updateButtons, this)); + mGroupList->setReturnCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this)); LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all"); accordion_tab->setDropDownStateChangedCallback( @@ -467,7 +557,6 @@ BOOL LLPanelPeople::postBuild() boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList)); buttonSetAction("view_profile_btn", boost::bind(&LLPanelPeople::onViewProfileButtonClicked, this)); - buttonSetAction("add_friend_btn", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this)); buttonSetAction("group_info_btn", boost::bind(&LLPanelPeople::onGroupInfoButtonClicked, this)); buttonSetAction("chat_btn", boost::bind(&LLPanelPeople::onChatButtonClicked, this)); buttonSetAction("im_btn", boost::bind(&LLPanelPeople::onImButtonClicked, this)); @@ -488,6 +577,7 @@ BOOL LLPanelPeople::postBuild() LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; registrar.add("People.Group.Plus.Action", boost::bind(&LLPanelPeople::onGroupPlusMenuItemClicked, this, _2)); + registrar.add("People.Group.Minus.Action", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this)); registrar.add("People.Friends.ViewSort.Action", boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemClicked, this, _2)); registrar.add("People.Nearby.ViewSort.Action", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemClicked, this, _2)); registrar.add("People.Groups.ViewSort.Action", boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked, this, _2)); @@ -495,7 +585,8 @@ BOOL LLPanelPeople::postBuild() enable_registrar.add("People.Friends.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemCheck, this, _2)); enable_registrar.add("People.Recent.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck, this, _2)); - + enable_registrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2)); + LLMenuGL* plus_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mGroupPlusMenuHandle = plus_menu->getHandle(); @@ -574,8 +665,13 @@ void LLPanelPeople::updateNearbyList() if (!mNearbyList) return; - LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange")); + std::vector<LLVector3d> positions; + + LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange")); mNearbyList->setDirty(); + + DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs()); + LLLocalSpeakerMgr::instance().update(TRUE); } void LLPanelPeople::updateRecentList() @@ -608,13 +704,19 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si button->setClickedCallback(cb); } +bool LLPanelPeople::isFriendOnline(const LLUUID& id) +{ + LLAvatarList::uuid_vector_t ids = mOnlineFriendList->getIDs(); + return std::find(ids.begin(), ids.end(), id) != ids.end(); +} + void LLPanelPeople::updateButtons() { std::string cur_tab = getActiveTabName(); bool nearby_tab_active = (cur_tab == NEARBY_TAB_NAME); bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME); bool group_tab_active = (cur_tab == GROUP_TAB_NAME); - bool recent_tab_active = (cur_tab == RECENT_TAB_NAME); + //bool recent_tab_active = (cur_tab == RECENT_TAB_NAME); LLUUID selected_id; std::vector<LLUUID> selected_uuids; @@ -624,7 +726,6 @@ void LLPanelPeople::updateButtons() buttonSetVisible("group_info_btn", group_tab_active); buttonSetVisible("chat_btn", group_tab_active); - buttonSetVisible("add_friend_btn", nearby_tab_active || recent_tab_active); buttonSetVisible("view_profile_btn", !group_tab_active); buttonSetVisible("im_btn", !group_tab_active); buttonSetVisible("call_btn", !group_tab_active); @@ -657,13 +758,15 @@ void LLPanelPeople::updateButtons() is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL; } - childSetEnabled("add_friend_btn", !is_friend); + LLPanel* cur_panel = mTabContainer->getCurrentPanel(); + if (cur_panel) + cur_panel->childSetEnabled("add_friend_btn", !is_friend); } - buttonSetEnabled("teleport_btn", friends_tab_active && item_selected); + buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front())); buttonSetEnabled("view_profile_btn", item_selected); buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection - buttonSetEnabled("call_btn", item_selected); + buttonSetEnabled("call_btn", multiple_selected); buttonSetEnabled("share_btn", item_selected && false); // not implemented yet bool none_group_selected = item_selected && selected_id.isNull(); @@ -758,6 +861,14 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save list->setComparator(&RECENT_COMPARATOR); list->sort(); break; + case E_SORT_BY_RECENT_SPEAKERS: + list->setComparator(&RECENT_SPEAKER_COMPARATOR); + list->sort(); + break; + case E_SORT_BY_DISTANCE: + list->setComparator(&DISTANCE_COMPARATOR); + list->sort(); + break; default: llwarns << "Unrecognized people sort order for " << list->getName() << llendl; return; @@ -772,7 +883,7 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save else if (list == mRecentList) setting = "RecentPeopleSortOrder"; else if (list == mNearbyList) - setting = "NearbyPeopleSortOrder"; // *TODO: unused by current implementation + setting = "NearbyPeopleSortOrder"; if (!setting.empty()) gSavedSettings.setU32(setting, order); @@ -915,7 +1026,7 @@ void LLPanelPeople::onChatButtonClicked() { LLUUID group_id = getCurrentItemID(); if (group_id.notNull()) - LLGroupActions::startChat(group_id); + LLGroupActions::startIM(group_id); } void LLPanelPeople::onImButtonClicked() @@ -1008,12 +1119,13 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata) { std::string chosen_item = userdata.asString(); - if (chosen_item == "sort_recent") + if (chosen_item == "sort_by_recent_speakers") { + setSortOrder(mNearbyList, E_SORT_BY_RECENT_SPEAKERS); } else if (chosen_item == "sort_name") { - mNearbyList->sortByName(); + setSortOrder(mNearbyList, E_SORT_BY_NAME); } else if (chosen_item == "view_icons") { @@ -1021,8 +1133,25 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata) } else if (chosen_item == "sort_distance") { + setSortOrder(mNearbyList, E_SORT_BY_DISTANCE); } } + +bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata) +{ + std::string item = userdata.asString(); + U32 sort_order = gSavedSettings.getU32("NearbyPeopleSortOrder"); + + if (item == "sort_by_recent_speakers") + return sort_order == E_SORT_BY_RECENT_SPEAKERS; + if (item == "sort_name") + return sort_order == E_SORT_BY_NAME; + if (item == "sort_distance") + return sort_order == E_SORT_BY_DISTANCE; + + return false; +} + void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata) { std::string chosen_item = userdata.asString(); @@ -1079,7 +1208,8 @@ void LLPanelPeople::onCallButtonClicked() } else if (selected_uuids.size() > 1) { - // *NOTE: ad-hoc voice chat not implemented yet + // initiate an ad-hoc voice chat with multiple users + LLAvatarActions::startAdhocCall(selected_uuids); } } @@ -1142,6 +1272,31 @@ void LLPanelPeople::onOpen(const LLSD& key) reSelectedCurrentTab(); } +void LLPanelPeople::notifyChildren(const LLSD& info) +{ + if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state") + { + LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); + if (!container) + { + llwarns << "Cannot find People panel container" << llendl; + return; + } + + if (container->getCurrentPanelIndex() > 0) + { + // if not on the default panel, switch to it + container->onOpen(LLSD().insert(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName())); + } + else + LLSideTray::getInstance()->collapseSideBar(); + + return; // this notification is only supposed to be handled by task panels + } + + LLPanel::notifyChildren(info); +} + void LLPanelPeople::showAccordion(const std::string name, bool show) { if(name.empty()) diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 9bf9befe906bee1623a9c4c0c513536689d0be71..d9dd76f3acd9645e341dc26c61a6ec454bbb3a28 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -50,8 +50,8 @@ class LLPanelPeople : public LLPanel virtual ~LLPanelPeople(); /*virtual*/ BOOL postBuild(); - - virtual void onOpen(const LLSD& key); + /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void notifyChildren(const LLSD& info); // internals class Updater; @@ -62,6 +62,8 @@ class LLPanelPeople : public LLPanel E_SORT_BY_NAME = 0, E_SORT_BY_STATUS = 1, E_SORT_BY_MOST_RECENT = 2, + E_SORT_BY_DISTANCE = 3, + E_SORT_BY_RECENT_SPEAKERS = 4, } ESortOrder; // methods indirectly called by the updaters @@ -69,6 +71,8 @@ class LLPanelPeople : public LLPanel void updateNearbyList(); void updateRecentList(); + bool isFriendOnline(const LLUUID& id); + void updateButtons(); std::string getActiveTabName() const; LLUUID getCurrentItemID() const; @@ -115,6 +119,7 @@ class LLPanelPeople : public LLPanel bool onFriendsViewSortMenuItemCheck(const LLSD& userdata); bool onRecentViewSortMenuItemCheck(const LLSD& userdata); + bool onNearbyViewSortMenuItemCheck(const LLSD& userdata); // misc callbacks static void onAvatarPicked( diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 2d3f901370902ea391951619c30d359ade06398c..d8e0d91d885dc05f20d1d8723202ac10c549ddad 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -66,6 +66,65 @@ #include "roles_constants.h" #include "llgroupactions.h" + +U8 string_value_to_click_action(std::string p_value); +std::string click_action_to_string_value( U8 action); + +U8 string_value_to_click_action(std::string p_value) +{ + if(p_value == "Touch") + { + return CLICK_ACTION_TOUCH; + } + if(p_value == "Sit") + { + return CLICK_ACTION_SIT; + } + if(p_value == "Buy") + { + return CLICK_ACTION_BUY; + } + if(p_value == "Pay") + { + return CLICK_ACTION_PAY; + } + if(p_value == "Open") + { + return CLICK_ACTION_OPEN; + } + if(p_value == "Zoom") + { + return CLICK_ACTION_ZOOM; + } + return CLICK_ACTION_TOUCH; +} + +std::string click_action_to_string_value( U8 action) +{ + switch (action) + { + case CLICK_ACTION_TOUCH: + default: + return "Touch"; + break; + case CLICK_ACTION_SIT: + return "Sit"; + break; + case CLICK_ACTION_BUY: + return "Buy"; + break; + case CLICK_ACTION_PAY: + return "Pay"; + break; + case CLICK_ACTION_OPEN: + return "Open"; + break; + case CLICK_ACTION_ZOOM: + return "Zoom"; + break; + } +} + ///---------------------------------------------------------------------------- /// Class llpanelpermissions ///---------------------------------------------------------------------------- @@ -80,9 +139,9 @@ LLPanelPermissions::LLPanelPermissions() : BOOL LLPanelPermissions::postBuild() { childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this); - childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe); childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this); - childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe); getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this)); @@ -774,7 +833,8 @@ void LLPanelPermissions::refresh() LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction"); if(ComboClickAction) { - ComboClickAction->setCurrentByIndex((S32)click_action); + std::string combo_value = click_action_to_string_value(click_action); + ComboClickAction->setValue(LLSD(combo_value)); } } childSetEnabled("label click action",is_perm_modify && all_volume); @@ -970,19 +1030,32 @@ void LLPanelPermissions::setAllSaleInfo() if (price < 0) sale_type = LLSaleInfo::FS_NOT; - LLSaleInfo sale_info(sale_type, price); - LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(sale_info); + LLSaleInfo old_sale_info; + LLSelectMgr::getInstance()->selectGetSaleInfo(old_sale_info); + + LLSaleInfo new_sale_info(sale_type, price); + LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info); - // If turned off for-sale, make sure click-action buy is turned - // off as well - if (sale_type == LLSaleInfo::FS_NOT) + U8 old_click_action = 0; + LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action); + + if (old_sale_info.isForSale() + && !new_sale_info.isForSale() + && old_click_action == CLICK_ACTION_BUY) { - U8 click_action = 0; - LLSelectMgr::getInstance()->selectionGetClickAction(&click_action); - if (click_action == CLICK_ACTION_BUY) - { - LLSelectMgr::getInstance()->selectionSetClickAction(CLICK_ACTION_TOUCH); - } + // If turned off for-sale, make sure click-action buy is turned + // off as well + LLSelectMgr::getInstance()-> + selectionSetClickAction(CLICK_ACTION_TOUCH); + } + else if (new_sale_info.isForSale() + && !old_sale_info.isForSale() + && old_click_action == CLICK_ACTION_TOUCH) + { + // If just turning on for-sale, preemptively turn on one-click buy + // unless user have a different click action set + LLSelectMgr::getInstance()-> + selectionSetClickAction(CLICK_ACTION_BUY); } } @@ -1002,8 +1075,9 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*) { LLComboBox* box = (LLComboBox*)ctrl; if (!box) return; - - U8 click_action = (U8)box->getCurrentIndex(); + std::string value = box->getValue().asString(); + U8 click_action = string_value_to_click_action(value); + if (click_action == CLICK_ACTION_BUY) { LLSaleInfo sale_info; @@ -1015,8 +1089,8 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*) // Set click action back to its old value U8 click_action = 0; LLSelectMgr::getInstance()->selectionGetClickAction(&click_action); - box->setCurrentByIndex((S32)click_action); - + std::string item_value = click_action_to_string_value(click_action); + box->setValue(LLSD(item_value)); return; } } diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index f5c4f89702b88bbf16e808820c0a2e895e6cefdd..da0c8d5020a8e67bf0eea8cd7ed2bdabc31396fc 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -440,7 +440,8 @@ void LLPanelPickEdit::resetDirty() BOOL LLPanelPickEdit::isDirty() const { - if( LLPanelPickInfo::isDirty() + if( mNewPick + || LLPanelPickInfo::isDirty() || mLocationChanged || mSnapshotCtrl->isDirty() || getChild<LLLineEditor>("pick_name")->isDirty() diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 2bf04f96814233a6507466fcefd0487b8a52081d..10b90b08d76b7b4eec62e2d207423ea14e8e7802 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -45,11 +45,14 @@ #include "llviewermenu.h" #include "llregistry.h" +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" #include "llpanelpicks.h" #include "llavatarpropertiesprocessor.h" #include "llpanelavatar.h" #include "llpanelprofile.h" #include "llpanelpick.h" +#include "llpanelclassified.h" static const std::string XML_BTN_NEW = "new_btn"; static const std::string XML_BTN_DELETE = "trash_btn"; @@ -62,9 +65,40 @@ static const std::string PICK_ID("pick_id"); static const std::string PICK_CREATOR_ID("pick_creator_id"); static const std::string PICK_NAME("pick_name"); +static const std::string CLASSIFIED_ID("classified_id"); +static const std::string CLASSIFIED_NAME("classified_name"); + static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks"); +////////////////////////////////////////////////////////////////////////// + +/** + * 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 //----------------------------------------------------------------------------- @@ -74,10 +108,19 @@ LLPanelPicks::LLPanelPicks() mProfilePanel(NULL), mPickPanel(NULL), mPicksList(NULL), + mClassifiedsList(NULL), mPanelPickInfo(NULL), mPanelPickEdit(NULL), - mOverflowMenu(NULL) + mOverflowMenu(NULL), + mPlusMenu(NULL), + mPicksAccTab(NULL), + mClassifiedsAccTab(NULL), + mPanelClassifiedInfo(NULL), + mPanelClassifiedEdit(NULL), + mClickThroughDisp(NULL) { + mClickThroughDisp = new LLClassifiedClickThrough(); + gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp); } LLPanelPicks::~LLPanelPicks() @@ -86,6 +129,8 @@ LLPanelPicks::~LLPanelPicks() { LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } + + delete mClickThroughDisp; } void* LLPanelPicks::create(void* data /* = NULL */) @@ -100,6 +145,9 @@ void LLPanelPicks::updateData() { mPicksList->clear(); LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId()); + + mClassifiedsList->clear(); + LLAvatarPropertiesProcessor::getInstance()->sendAvatarClassifiedsRequest(getAvatarId()); } } @@ -138,16 +186,52 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type) mPicksList->addItem(picture, pick_value); - picture->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickItem, this, _1)); + picture->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickPickItem, this, _1)); picture->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4)); picture->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this)); } + showAccordion("tab_picks", mPicksList->size()); + + resetDirty(); + updateButtons(); + } + } + else if(APT_CLASSIFIEDS == type) + { + LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data); + if(c_info && getAvatarId() == c_info->target_id) + { + mClassifiedsList->clear(); + + LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin(); + for(; c_info->classifieds_list.end() != it; ++it) + { + LLAvatarClassifieds::classified_data c_data = *it; + + LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), c_data.classified_id); + c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this)); + c_item->setClassifiedName(c_data.name); + + LLSD pick_value = LLSD(); + pick_value.insert(CLASSIFIED_ID, c_data.classified_id); + pick_value.insert(CLASSIFIED_NAME, c_data.name); + + mClassifiedsList->addItem(c_item, pick_value); + + c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1)); + c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4)); + c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this)); + } + + showAccordion("tab_classifieds", mClassifiedsList->size()); + resetDirty(); - LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); updateButtons(); } } + if(!mPicksList->size() && !mClassifiedsList->size()) + childSetVisible("empty_picks_panel_text", true); } LLPickItem* LLPanelPicks::getSelectedPickItem() @@ -158,16 +242,44 @@ LLPickItem* LLPanelPicks::getSelectedPickItem() return dynamic_cast<LLPickItem*>(selected_item); } +LLClassifiedItem* LLPanelPicks::getSelectedClassifiedItem() +{ + LLPanel* selected_item = mClassifiedsList->getSelectedItem(); + if (!selected_item) + { + return NULL; + } + return dynamic_cast<LLClassifiedItem*>(selected_item); +} + BOOL LLPanelPicks::postBuild() { mPicksList = getChild<LLFlatListView>("picks_list"); + mClassifiedsList = getChild<LLFlatListView>("classifieds_list"); + + mPicksList->setCommitOnSelectionChange(true); + mClassifiedsList->setCommitOnSelectionChange(true); + + mPicksList->setCommitCallback(boost::bind(&LLPanelPicks::onListCommit, this, mPicksList)); + mClassifiedsList->setCommitCallback(boost::bind(&LLPanelPicks::onListCommit, this, mClassifiedsList)); + + mPicksList->setNoItemsCommentText(getString("no_picks")); + mClassifiedsList->setNoItemsCommentText(getString("no_classifieds")); - childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickNew, this)); + childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickPlusBtn, this)); childSetAction(XML_BTN_DELETE, boost::bind(&LLPanelPicks::onClickDelete, this)); childSetAction(XML_BTN_TELEPORT, boost::bind(&LLPanelPicks::onClickTeleport, this)); childSetAction(XML_BTN_SHOW_ON_MAP, boost::bind(&LLPanelPicks::onClickMap, this)); childSetAction(XML_BTN_INFO, boost::bind(&LLPanelPicks::onClickInfo, this)); childSetAction(XML_BTN_OVERFLOW, boost::bind(&LLPanelPicks::onOverflowButtonClicked, this)); + + mPicksAccTab = getChild<LLAccordionCtrlTab>("tab_picks"); + mPicksAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelPicks::onAccordionStateChanged, this, mPicksAccTab)); + mPicksAccTab->setDisplayChildren(true); + + mClassifiedsAccTab = getChild<LLAccordionCtrlTab>("tab_classifieds"); + mClassifiedsAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelPicks::onAccordionStateChanged, this, mClassifiedsAccTab)); + mClassifiedsAccTab->setDisplayChildren(false); LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar; registar.add("Pick.Info", boost::bind(&LLPanelPicks::onClickInfo, this)); @@ -180,6 +292,10 @@ BOOL LLPanelPicks::postBuild() LLUICtrl::CommitCallbackRegistry::ScopedRegistrar overflow_registar; overflow_registar.add("PicksList.Overflow", boost::bind(&LLPanelPicks::onOverflowMenuItemClicked, this, _2)); mOverflowMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar; + plus_registar.add("Picks.Plus.Action", boost::bind(&LLPanelPicks::onPlusMenuItemClicked, this, _2)); + mPlusMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); return TRUE; } @@ -202,13 +318,48 @@ void LLPanelPicks::onOverflowMenuItemClicked(const LLSD& param) } } +void LLPanelPicks::onPlusMenuItemClicked(const LLSD& param) +{ + std::string value = param.asString(); + + if("new_pick" == value) + { + createNewPick(); + } + else if("new_classified" == value) + { + createNewClassified(); + } +} + +void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab) +{ + if(!mPicksAccTab->getDisplayChildren()) + { + mPicksList->resetSelection(true); + } + if(!mClassifiedsAccTab->getDisplayChildren()) + { + mClassifiedsList->resetSelection(true); + } + + updateButtons(); +} + void LLPanelPicks::onOverflowButtonClicked() { - LLRect rect; - childGetRect(XML_BTN_OVERFLOW, rect); + if (!mOverflowMenu->toggleVisibility()) + return; + LLView* btn = getChild<LLView>(XML_BTN_OVERFLOW); + + if (mOverflowMenu->getButtonRect().isEmpty()) + { + mOverflowMenu->setButtonRect(btn); + } mOverflowMenu->updateParent(LLMenuGL::sMenuContainer); - mOverflowMenu->setButtonRect(rect, this); + + LLRect rect = btn->getRect(); LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop); } @@ -242,6 +393,9 @@ void LLPanelPicks::onOpen(const LLSD& key) if(getAvatarId() != id) { + showAccordion("tab_picks", false); + showAccordion("tab_classifieds", false); + mPicksList->goToTop(); // Set dummy value to make panel dirty and make it reload picks setValue(LLSD()); @@ -250,21 +404,50 @@ void LLPanelPicks::onOpen(const LLSD& key) LLPanelProfileTab::onOpen(key); } +void LLPanelPicks::onListCommit(const LLFlatListView* f_list) +{ + // Make sure only one of the lists has selection. + if(f_list == mPicksList) + { + mClassifiedsList->resetSelection(true); + } + else if(f_list == mClassifiedsList) + { + mPicksList->resetSelection(true); + } + else + { + llwarns << "Unknown list" << llendl; + } + + updateButtons(); +} + //static void LLPanelPicks::onClickDelete() { - LLSD pick_value = mPicksList->getSelectedValue(); - if (pick_value.isUndefined()) return; + LLSD value = mPicksList->getSelectedValue(); + if (value.isDefined()) + { + LLSD args; + args["PICK"] = value[PICK_NAME]; + LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeletePick, this, _1, _2)); + return; + } - LLSD args; - args["PICK"] = pick_value[PICK_NAME]; - LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDelete, this, _1, _2)); + value = mClassifiedsList->getSelectedValue(); + if(value.isDefined()) + { + LLSD args; + args["NAME"] = value[CLASSIFIED_NAME]; + LLNotifications::instance().add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeleteClassified, this, _1, _2)); + return; + } } -bool LLPanelPicks::callbackDelete(const LLSD& notification, const LLSD& response) +bool LLPanelPicks::callbackDeletePick(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); - LLSD pick_value = mPicksList->getSelectedValue(); if (0 == option) @@ -276,6 +459,20 @@ bool LLPanelPicks::callbackDelete(const LLSD& notification, const LLSD& response return false; } +bool LLPanelPicks::callbackDeleteClassified(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + LLSD value = mClassifiedsList->getSelectedValue(); + + if (0 == option) + { + LLAvatarPropertiesProcessor::instance().sendClassifiedDelete(value[CLASSIFIED_ID]); + mClassifiedsList->removeItemByValue(value); + } + updateButtons(); + return false; +} + bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& response ) { S32 option = LLNotification::getSelectedOption(notification, response); @@ -291,9 +488,14 @@ bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& respo void LLPanelPicks::onClickTeleport() { LLPickItem* pick_item = getSelectedPickItem(); - if (!pick_item) return; + LLClassifiedItem* c_item = getSelectedClassifiedItem(); + + LLVector3d pos; + if(pick_item) + pos = pick_item->getPosGlobal(); + else if(c_item) + pos = c_item->getPosGlobal(); - LLVector3d pos = pick_item->getPosGlobal(); if (!pos.isExactlyZero()) { gAgent.teleportViaLocation(pos); @@ -305,9 +507,15 @@ void LLPanelPicks::onClickTeleport() void LLPanelPicks::onClickMap() { LLPickItem* pick_item = getSelectedPickItem(); - if (!pick_item) return; + LLClassifiedItem* c_item = getSelectedClassifiedItem(); + + LLVector3d pos; + if (pick_item) + pos = pick_item->getPosGlobal(); + else if(c_item) + pos = c_item->getPosGlobal(); - LLFloaterWorldMap::getInstance()->trackLocation(pick_item->getPosGlobal()); + LLFloaterWorldMap::getInstance()->trackLocation(pos); LLFloaterReg::showInstance("world_map", "center"); } @@ -325,7 +533,7 @@ void LLPanelPicks::onRightMouseUpItem(LLUICtrl* item, S32 x, S32 y, MASK mask) } } -void LLPanelPicks::onDoubleClickItem(LLUICtrl* item) +void LLPanelPicks::onDoubleClickPickItem(LLUICtrl* item) { LLSD pick_value = mPicksList->getSelectedValue(); if (pick_value.isUndefined()) return; @@ -335,9 +543,19 @@ void LLPanelPicks::onDoubleClickItem(LLUICtrl* item) LLNotifications::instance().add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); } +void LLPanelPicks::onDoubleClickClassifiedItem(LLUICtrl* item) +{ + LLSD value = mClassifiedsList->getSelectedValue(); + if (value.isUndefined()) return; + + LLSD args; + args["CLASSIFIED"] = value[CLASSIFIED_NAME]; + LLNotifications::instance().add("TeleportToClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); +} + void LLPanelPicks::updateButtons() { - bool has_selected = mPicksList->numSelected(); + bool has_selected = mPicksList->numSelected() > 0 || mClassifiedsList->numSelected() > 0; if (getAvatarId() == gAgentID) { @@ -366,14 +584,43 @@ void LLPanelPicks::buildPickPanel() // } } -void LLPanelPicks::onClickNew() +void LLPanelPicks::onClickPlusBtn() +{ + LLRect rect; + childGetRect(XML_BTN_NEW, rect); + + mPlusMenu->updateParent(LLMenuGL::sMenuContainer); + mPlusMenu->setButtonRect(rect, this); + LLMenuGL::showPopup(this, mPlusMenu, rect.mLeft, rect.mTop); +} + +void LLPanelPicks::createNewPick() { createPickEditPanel(); getProfilePanel()->openPanel(mPanelPickEdit, LLSD()); } +void LLPanelPicks::createNewClassified() +{ + createClassifiedEditPanel(); + + getProfilePanel()->openPanel(mPanelClassifiedEdit, LLSD()); +} + void LLPanelPicks::onClickInfo() +{ + if(mPicksList->numSelected() > 0) + { + openPickInfo(); + } + else if(mClassifiedsList->numSelected() > 0) + { + openClassifiedInfo(); + } +} + +void LLPanelPicks::openPickInfo() { LLSD selected_value = mPicksList->getSelectedValue(); if (selected_value.isUndefined()) return; @@ -392,6 +639,33 @@ void LLPanelPicks::onClickInfo() getProfilePanel()->openPanel(mPanelPickInfo, params); } +void LLPanelPicks::openClassifiedInfo() +{ + LLSD selected_value = mClassifiedsList->getSelectedValue(); + if (selected_value.isUndefined()) return; + + LLClassifiedItem* c_item = getSelectedClassifiedItem(); + + createClassifiedInfoPanel(); + + LLSD params; + params["classified_id"] = c_item->getClassifiedId(); + params["avatar_id"] = c_item->getAvatarId(); + params["snapshot_id"] = c_item->getSnapshotId(); + params["name"] = c_item->getClassifiedName(); + params["desc"] = c_item->getDescription(); + + getProfilePanel()->openPanel(mPanelClassifiedInfo, params); +} + +void LLPanelPicks::showAccordion(const std::string& name, bool show) +{ + LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name); + tab->setVisible(show); + LLAccordionCtrl* acc = getChild<LLAccordionCtrl>("accordion"); + acc->arrange(); +} + void LLPanelPicks::onPanelPickClose(LLPanel* panel) { panel->setVisible(FALSE); @@ -403,6 +677,65 @@ void LLPanelPicks::onPanelPickSave(LLPanel* panel) updateButtons(); } +void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel) +{ + if(panel->isNew()) + { + LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), panel->getClassifiedId()); + + c_item->setClassifiedName(panel->getClassifiedName()); + c_item->setDescription(panel->getDescription()); + c_item->setSnapshotId(panel->getSnapshotId()); + + LLSD c_value; + c_value.insert(CLASSIFIED_ID, c_item->getClassifiedId()); + c_value.insert(CLASSIFIED_NAME, c_item->getClassifiedName()); + mClassifiedsList->addItem(c_item, c_value, ADD_TOP); + + c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1)); + c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4)); + c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this)); + c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this)); + + // order does matter, showAccordion will invoke arrange for accordions. + mClassifiedsAccTab->changeOpenClose(false); + showAccordion("tab_classifieds", true); + } + else + { + onPanelClassifiedClose(panel); + return; + } + + onPanelPickClose(panel); + updateButtons(); +} + +void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel) +{ + if(panel->getInfoLoaded() && !panel->isDirty()) + { + std::vector<LLSD> values; + mClassifiedsList->getValues(values); + for(size_t n = 0; n < values.size(); ++n) + { + LLUUID c_id = values[n][CLASSIFIED_ID].asUUID(); + if(panel->getClassifiedId() == c_id) + { + 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()); + } + } + } + + onPanelPickClose(panel); + updateButtons(); +} + void LLPanelPicks::createPickInfoPanel() { if(!mPanelPickInfo) @@ -414,6 +747,29 @@ void LLPanelPicks::createPickInfoPanel() } } +void LLPanelPicks::createClassifiedInfoPanel() +{ + if(!mPanelClassifiedInfo) + { + mPanelClassifiedInfo = LLPanelClassifiedInfo::create(); + mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo)); + mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this)); + mPanelClassifiedInfo->setVisible(FALSE); + } +} + +void LLPanelPicks::createClassifiedEditPanel() +{ + if(!mPanelClassifiedEdit) + { + 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); + } +} + void LLPanelPicks::createPickEditPanel() { if(!mPanelPickEdit) @@ -473,9 +829,38 @@ void LLPanelPicks::onPanelPickEdit() getProfilePanel()->openPanel(mPanelPickEdit, params); } +void LLPanelPicks::onPanelClassifiedEdit() +{ + LLSD selected_value = mClassifiedsList->getSelectedValue(); + if (selected_value.isUndefined()) + { + return; + } + + LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem()); + + createClassifiedEditPanel(); + + LLSD params; + params["classified_id"] = c_item->getClassifiedId(); + params["avatar_id"] = c_item->getAvatarId(); + params["snapshot_id"] = c_item->getSnapshotId(); + params["name"] = c_item->getClassifiedName(); + params["desc"] = c_item->getDescription(); + + getProfilePanel()->openPanel(mPanelClassifiedEdit, params); +} + void LLPanelPicks::onClickMenuEdit() { - onPanelPickEdit(); + if(getSelectedPickItem()) + { + onPanelPickEdit(); + } + else if(getSelectedClassifiedItem()) + { + onPanelClassifiedEdit(); + } } inline LLPanelProfile* LLPanelPicks::getProfilePanel() @@ -610,3 +995,80 @@ void LLPickItem::setValue(const LLSD& value) if (!value.has("selected")) return; childSetVisible("selected_icon", value["selected"]); } + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLClassifiedItem::LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classified_id) + : LLPanel() + , mAvatarId(avatar_id) + , mClassifiedId(classified_id) +{ + LLUICtrlFactory::getInstance()->buildPanel(this,"panel_classifieds_list_item.xml"); + + LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this); + LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId()); +} + +LLClassifiedItem::~LLClassifiedItem() +{ + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this); +} + +void LLClassifiedItem::processProperties(void* data, EAvatarProcessorType type) +{ + if(APT_CLASSIFIED_INFO != type) + { + return; + } + + LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data); + if( !c_info || c_info->classified_id != getClassifiedId() ) + { + return; + } + + setClassifiedName(c_info->name); + setDescription(c_info->description); + setSnapshotId(c_info->snapshot_id); + setPosGlobal(c_info->pos_global); + + LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this); +} + +BOOL LLClassifiedItem::postBuild() +{ + setMouseEnterCallback(boost::bind(&LLPanelPickInfo::childSetVisible, this, "hovered_icon", true)); + setMouseLeaveCallback(boost::bind(&LLPanelPickInfo::childSetVisible, this, "hovered_icon", false)); + return TRUE; +} + +void LLClassifiedItem::setValue(const LLSD& value) +{ + if (!value.isMap()) return;; + if (!value.has("selected")) return; + childSetVisible("selected_icon", value["selected"]); +} + +void LLClassifiedItem::setClassifiedName(const std::string& name) +{ + childSetValue("name", name); +} + +void LLClassifiedItem::setDescription(const std::string& desc) +{ + childSetValue("description", desc); +} + +void LLClassifiedItem::setSnapshotId(const LLUUID& snapshot_id) +{ + childSetValue("picture", snapshot_id); +} + +LLUUID LLClassifiedItem::getSnapshotId() +{ + return childGetValue("picture"); +} + +//EOF diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 5a2754ad106fd7b8767f6dfea28f9a4273e50a83..b17b6d6fe94d3a12fb286f23dde7314f70edb696 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -40,6 +40,7 @@ #include "llpanelavatar.h" #include "llregistry.h" +class LLAccordionCtrlTab; class LLPanelProfile; class LLMessageSystem; class LLVector3d; @@ -47,10 +48,18 @@ class LLPanelProfileTab; class LLAgent; class LLMenuGL; class LLPickItem; +class LLClassifiedItem; class LLFlatListView; class LLPanelPickInfo; class LLPanelPickEdit; class LLToggleableMenu; +class LLPanelClassifiedInfo; +class LLPanelClassifiedEdit; +class LLClassifiedClickThrough; + +// *TODO +// Panel Picks has been consolidated with Classifieds (EXT-2095), give LLPanelPicks +// and corresponding files (cpp, h, xml) a new name. (new name is TBD at the moment) class LLPanelPicks : public LLPanelProfileTab @@ -71,9 +80,10 @@ class LLPanelPicks // returns the selected pick item LLPickItem* getSelectedPickItem(); + LLClassifiedItem* getSelectedClassifiedItem(); //*NOTE top down approch when panel toggling is done only by - // parent panels failed to work (picks related code was in me profile panel) + // parent panels failed to work (picks related code was in my profile panel) void setProfilePanel(LLPanelProfile* profile_panel); private: @@ -83,41 +93,67 @@ class LLPanelPicks void onOverflowMenuItemClicked(const LLSD& param); void onOverflowButtonClicked(); + void onPlusMenuItemClicked(const LLSD& param); + + void onListCommit(const LLFlatListView* f_list); + void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab); //------------------------------------------------ // Callbacks which require panel toggling //------------------------------------------------ - void onClickNew(); + void onClickPlusBtn(); void onClickInfo(); void onPanelPickClose(LLPanel* panel); void onPanelPickSave(LLPanel* panel); + void onPanelClassifiedSave(LLPanelClassifiedEdit* panel); + void onPanelClassifiedClose(LLPanelClassifiedInfo* panel); void onPanelPickEdit(); + void onPanelClassifiedEdit(); void onClickMenuEdit(); + void createNewPick(); + void createNewClassified(); + + void openPickInfo(); + void openClassifiedInfo(); + + void showAccordion(const std::string& name, bool show); + void buildPickPanel(); - bool callbackDelete(const LLSD& notification, const LLSD& response); + bool callbackDeletePick(const LLSD& notification, const LLSD& response); + bool callbackDeleteClassified(const LLSD& notification, const LLSD& response); bool callbackTeleport(const LLSD& notification, const LLSD& response); void updateButtons(); - virtual void onDoubleClickItem(LLUICtrl* item); + virtual void onDoubleClickPickItem(LLUICtrl* item); + virtual void onDoubleClickClassifiedItem(LLUICtrl* item); virtual void onRightMouseUpItem(LLUICtrl* item, S32 x, S32 y, MASK mask); LLPanelProfile* getProfilePanel(); void createPickInfoPanel(); void createPickEditPanel(); -// void openPickEditPanel(LLPickItem* pick); -// void openPickInfoPanel(LLPickItem* pick); + void createClassifiedInfoPanel(); + void createClassifiedEditPanel(); LLMenuGL* mPopupMenu; LLPanelProfile* mProfilePanel; LLPanelPickInfo* mPickPanel; LLFlatListView* mPicksList; + LLFlatListView* mClassifiedsList; LLPanelPickInfo* mPanelPickInfo; + LLPanelClassifiedInfo* mPanelClassifiedInfo; + LLPanelClassifiedEdit* mPanelClassifiedEdit; LLPanelPickEdit* mPanelPickEdit; LLToggleableMenu* mOverflowMenu; + LLToggleableMenu* mPlusMenu; + + LLAccordionCtrlTab* mPicksAccTab; + LLAccordionCtrlTab* mClassifiedsAccTab; + + LLClassifiedClickThrough* mClickThroughDisp; }; class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver @@ -189,4 +225,48 @@ class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver std::string mSimName; }; +class LLClassifiedItem : public LLPanel, public LLAvatarPropertiesObserver +{ +public: + + LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classified_id); + + virtual ~LLClassifiedItem(); + + /*virtual*/ void processProperties(void* data, EAvatarProcessorType type); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void setValue(const LLSD& value); + + LLUUID getAvatarId() {return mAvatarId;} + + void setAvatarId(const LLUUID& avatar_id) {mAvatarId = avatar_id;} + + LLUUID getClassifiedId() {return mClassifiedId;} + + void setClassifiedId(const LLUUID& classified_id) {mClassifiedId = classified_id;} + + void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; } + + const LLVector3d& getPosGlobal() { return mPosGlobal; } + + void setClassifiedName (const std::string& name); + + std::string getClassifiedName() { return childGetValue("name").asString(); } + + void setDescription(const std::string& desc); + + std::string getDescription() { return childGetValue("description").asString(); } + + void setSnapshotId(const LLUUID& snapshot_id); + + LLUUID getSnapshotId(); + +private: + LLUUID mAvatarId; + LLUUID mClassifiedId; + LLVector3d mPosGlobal; +}; + #endif // LL_LLPANELPICKS_H diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index c60065101581e1c1a4053fcba49d2b1bf5a2f341..6ba3790fe226272b968670ad681ae8634dcba3c0 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -40,7 +40,7 @@ #include "llsdutil_math.h" -#include "llscrollcontainer.h" +#include "lliconctrl.h" #include "lltextbox.h" #include "llagent.h" @@ -58,7 +58,10 @@ LLPanelPlaceInfo::LLPanelPlaceInfo() mParcelID(), mRequestedID(), mPosRegion(), - mMinHeight(0) + mScrollingPanelMinHeight(0), + mScrollingPanelWidth(0), + mScrollingPanel(NULL), + mScrollContainer(NULL) {} //virtual @@ -81,11 +84,14 @@ BOOL LLPanelPlaceInfo::postBuild() mParcelName = getChild<LLTextBox>("parcel_title"); mDescEditor = getChild<LLExpandableTextBox>("description"); + mMaturityRatingIcon = getChild<LLIconCtrl>("maturity_icon"); mMaturityRatingText = getChild<LLTextBox>("maturity_value"); - LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll"); - scroll_container->setBorderVisible(FALSE); - mMinHeight = scroll_container->getScrolledViewRect().getHeight(); + mScrollingPanel = getChild<LLPanel>("scrolling_panel"); + mScrollContainer = getChild<LLScrollContainer>("place_scroll"); + + mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight(); + mScrollingPanelWidth = mScrollingPanel->getRect().getWidth(); return TRUE; } @@ -98,6 +104,7 @@ void LLPanelPlaceInfo::resetLocation() mPosRegion.clearVec(); std::string not_available = getString("not_available"); + mMaturityRatingIcon->setValue(not_available); mMaturityRatingText->setValue(not_available); mRegionName->setText(not_available); mParcelName->setText(not_available); @@ -204,20 +211,6 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) mDescEditor->setText(parcel_data.desc); } - // HACK: Flag 0x2 == adult region, - // Flag 0x1 == mature region, otherwise assume PG - std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); - if (parcel_data.flags & 0x2) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); - } - else if (parcel_data.flags & 0x1) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); - } - - mMaturityRatingText->setValue(rating); - S32 region_x; S32 region_y; S32 region_z; @@ -247,6 +240,27 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) } } +// virtual +void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + 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); + } +} + // virtual void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility) { diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h index ec30397cff5388a53bcae89c8c807ef10a40acd7..b9bf92b534c975c60695c287f4e6f80ba0db351f 100644 --- a/indra/newview/llpanelplaceinfo.h +++ b/indra/newview/llpanelplaceinfo.h @@ -41,9 +41,11 @@ #include "llremoteparcelrequest.h" class LLExpandableTextBox; +class LLIconCtrl; class LLInventoryItem; class LLPanelPickEdit; class LLParcel; +class LLScrollContainer; class LLTextBox; class LLTextureCtrl; class LLViewerRegion; @@ -91,6 +93,7 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); /*virtual*/ void handleVisibilityChange (BOOL new_visibility); // Create a pick for the location specified @@ -109,14 +112,18 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver LLUUID mRequestedID; LLVector3 mPosRegion; std::string mCurrentTitle; - S32 mMinHeight; + S32 mScrollingPanelMinHeight; + S32 mScrollingPanelWidth; INFO_TYPE mInfoType; + LLScrollContainer* mScrollContainer; + LLPanel* mScrollingPanel; LLTextBox* mTitle; LLTextureCtrl* mSnapshotCtrl; LLTextBox* mRegionName; LLTextBox* mParcelName; LLExpandableTextBox* mDescEditor; + LLIconCtrl* mMaturityRatingIcon; LLTextBox* mMaturityRatingText; }; diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 2a9ba4697d6b62edf513f4ebc573b9f5ac06ebec..0c7cc9af3857370f289fbae71f94280020b227d9 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -97,7 +97,6 @@ BOOL LLPanelPlaceProfile::postBuild() setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this)); mParcelOwner = getChild<LLTextBox>("owner_value"); - mLastVisited = getChild<LLTextBox>("last_visited_value"); mParcelRatingIcon = getChild<LLIconCtrl>("rating_icon"); mParcelRatingText = getChild<LLTextBox>("rating_value"); @@ -165,7 +164,6 @@ void LLPanelPlaceProfile::resetLocation() std::string not_available = getString("not_available"); mParcelOwner->setValue(not_available); - mLastVisited->setValue(not_available); mParcelRatingIcon->setValue(not_available); mParcelRatingText->setText(not_available); @@ -209,17 +207,13 @@ void LLPanelPlaceProfile::resetLocation() void LLPanelPlaceProfile::setInfoType(INFO_TYPE type) { bool is_info_type_agent = type == AGENT; - bool is_info_type_teleport_history = type == TELEPORT_HISTORY; - getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent); + mMaturityRatingIcon->setVisible(!is_info_type_agent); mMaturityRatingText->setVisible(!is_info_type_agent); getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent); mParcelOwner->setVisible(is_info_type_agent); - getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history); - mLastVisited->setVisible(is_info_type_teleport_history); - getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); switch(type) @@ -238,6 +232,30 @@ void LLPanelPlaceProfile::setInfoType(INFO_TYPE type) LLPanelPlaceInfo::setInfoType(type); } +// virtual +void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data) +{ + LLPanelPlaceInfo::processParcelInfo(parcel_data); + + // HACK: Flag 0x2 == adult region, + // Flag 0x1 == mature region, otherwise assume PG + if (parcel_data.flags & 0x2) + { + mMaturityRatingIcon->setValue(icon_r); + mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_ADULT)); + } + else if (parcel_data.flags & 0x1) + { + mMaturityRatingIcon->setValue(icon_m); + mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_MATURE)); + } + else + { + mMaturityRatingIcon->setValue(icon_pg); + mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG)); + } +} + void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, LLViewerRegion* region, const LLVector3d& pos_global, @@ -521,35 +539,19 @@ void LLPanelPlaceProfile::updateCovenantText(const std::string &text) mCovenantText->setText(text); } -void LLPanelPlaceProfile::updateLastVisitedText(const LLDate &date) -{ - if (date.isNull()) - { - mLastVisited->setText(getString("unknown")); - } - else - { - std::string timeStr = getString("acquired_date"); - LLSD substitution; - substitution["datetime"] = (S32) date.secondsSinceEpoch(); - LLStringUtil::format (timeStr, substitution); - mLastVisited->setText(timeStr); - } -} - void LLPanelPlaceProfile::onForSaleBannerClick() { LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); - LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); + LLParcel* parcel = mgr->getFloatingParcelSelection()->getParcel(); LLViewerRegion* selected_region = mgr->getSelectionRegion(); - if(!hParcel.isNull() && selected_region) + if(parcel && selected_region) { - if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && + if(parcel->getLocalID() == mSelectedParcelID && mLastSelectedRegionID ==selected_region->getRegionID()) { - if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) + if(parcel->getSalePrice() - gStatusBar->getBalance() > 0) { - LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); + LLFloaterBuyCurrency::buyCurrency("Buying selected land ", parcel->getSalePrice()); } else { diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h index b3ef4acf511f065969792bdf4e8f10bf270ba204..8c30ca92fb84ac530271643eb80d872b3be04723 100644 --- a/indra/newview/llpanelplaceprofile.h +++ b/indra/newview/llpanelplaceprofile.h @@ -50,6 +50,8 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo /*virtual*/ void setInfoType(INFO_TYPE type); + /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + // Displays information about the currently selected parcel // without sending a request to the server. // If is_current_parcel true shows "You Are Here" banner. @@ -61,7 +63,6 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo void updateEstateName(const std::string& name); void updateEstateOwnerName(const std::string& name); void updateCovenantText(const std::string &text); - void updateLastVisitedText(const LLDate &date); private: void onForSaleBannerClick(); @@ -78,7 +79,6 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo LLPanel* mYouAreHerePanel; LLTextBox* mParcelOwner; - LLTextBox* mLastVisited; LLIconCtrl* mParcelRatingIcon; LLTextBox* mParcelRatingText; diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 8d117afcfe0cffaddb6ea8c7e5890de9fef9fdfa..257a21ca1510e47217c5ee52fdbbe0aea0992010 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -80,7 +80,6 @@ static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; // Helper functions static bool is_agent_in_selected_parcel(LLParcel* parcel); static void onSLURLBuilt(std::string& slurl); -static void setAllChildrenVisible(LLView* view, BOOL visible); //Observer classes class LLPlacesParcelObserver : public LLParcelObserver @@ -223,7 +222,7 @@ BOOL LLPanelPlaces::postBuild() notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); - folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); + folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); return TRUE; } @@ -293,7 +292,6 @@ void LLPanelPlaces::onOpen(const LLSD& key) mPosGlobal = hist_items[index].mGlobalPos; mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); - mPlaceProfile->updateLastVisitedText(hist_items[index].mDate); mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); } @@ -602,9 +600,12 @@ void LLPanelPlaces::onOverflowButtonClicked() if (!menu->toggleVisibility()) return; + if (menu->getButtonRect().isEmpty()) + { + menu->setButtonRect(mOverflowBtn); + } menu->updateParent(LLMenuGL::sMenuContainer); LLRect rect = mOverflowBtn->getRect(); - menu->setButtonRect(rect, this); LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop); } @@ -698,8 +699,6 @@ void LLPanelPlaces::onBackButtonClicked() void LLPanelPlaces::togglePickPanel(BOOL visible) { - setAllChildrenVisible(this, !visible); - if (mPickPanel) mPickPanel->setVisible(visible); } @@ -909,16 +908,3 @@ static void onSLURLBuilt(std::string& slurl) LLNotifications::instance().add("CopySLURL", args); } - -static void setAllChildrenVisible(LLView* view, BOOL visible) -{ - const LLView::child_list_t* children = view->getChildList(); - for (LLView::child_list_const_iter_t child_it = children->begin(); child_it != children->end(); ++child_it) - { - LLView* child = *child_it; - if (child->getParent() == view) - { - child->setVisible(visible); - } - } -} diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index d33fcc55123b36ba18d658d38f42a9ff8025db02..529912929d6274699058686226d411b07c0d4a8e 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -44,6 +44,7 @@ #include "llbutton.h" #include "llface.h" #include "llcombobox.h" +#include "lllayoutstack.h" #include "llslider.h" #include "llhudview.h" #include "lliconctrl.h" @@ -53,6 +54,7 @@ #include "llpanelprimmediacontrols.h" #include "llpluginclassmedia.h" #include "llprogressbar.h" +#include "llstring.h" #include "llviewercontrol.h" #include "llviewerparcelmgr.h" #include "llviewermedia.h" @@ -84,14 +86,14 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() : mUpdateSlider(true), mClearFaceOnFade(false), mCurrentRate(0.0), - mMovieDuration(0.0), - mUpdatePercent(0) + mMovieDuration(0.0) { mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this)); mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this)); mCommitCallbackRegistrar.add("MediaCtrl.Forward", boost::bind(&LLPanelPrimMediaControls::onClickForward, this)); mCommitCallbackRegistrar.add("MediaCtrl.Home", boost::bind(&LLPanelPrimMediaControls::onClickHome, this)); mCommitCallbackRegistrar.add("MediaCtrl.Stop", boost::bind(&LLPanelPrimMediaControls::onClickStop, this)); + mCommitCallbackRegistrar.add("MediaCtrl.MediaStop", boost::bind(&LLPanelPrimMediaControls::onClickMediaStop, this)); mCommitCallbackRegistrar.add("MediaCtrl.Reload", boost::bind(&LLPanelPrimMediaControls::onClickReload, this)); mCommitCallbackRegistrar.add("MediaCtrl.Play", boost::bind(&LLPanelPrimMediaControls::onClickPlay, this)); mCommitCallbackRegistrar.add("MediaCtrl.Pause", boost::bind(&LLPanelPrimMediaControls::onClickPause, this)); @@ -102,6 +104,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() : mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this)); mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this)); mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute", boost::bind(&LLPanelPrimMediaControls::onToggleMute, this)); + mCommitCallbackRegistrar.add("MediaCtrl.SkipBack", boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this)); + mCommitCallbackRegistrar.add("MediaCtrl.SkipForward", boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this)); LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml"); mInactivityTimer.reset(); @@ -117,25 +121,72 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls() BOOL LLPanelPrimMediaControls::postBuild() { - LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup"); - scroll_up_ctrl->setClickedCallback(onScrollUp, this); - scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this); - scroll_up_ctrl->setMouseUpCallback(onScrollStop, this); - LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft"); - scroll_left_ctrl->setClickedCallback(onScrollLeft, this); - scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this); - scroll_left_ctrl->setMouseUpCallback(onScrollStop, this); - LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright"); - scroll_right_ctrl->setClickedCallback(onScrollRight, this); - scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this); - scroll_right_ctrl->setMouseUpCallback(onScrollStop, this); - LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown"); - scroll_down_ctrl->setClickedCallback(onScrollDown, this); - scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this); - scroll_down_ctrl->setMouseUpCallback(onScrollStop, this); + mMediaRegion = getChild<LLView>("media_region"); + mBackCtrl = getChild<LLUICtrl>("back"); + mFwdCtrl = getChild<LLUICtrl>("fwd"); + mReloadCtrl = getChild<LLUICtrl>("reload"); + mPlayCtrl = getChild<LLUICtrl>("play"); + mPauseCtrl = getChild<LLUICtrl>("pause"); + mStopCtrl = getChild<LLUICtrl>("stop"); + mMediaStopCtrl = getChild<LLUICtrl>("media_stop"); + mHomeCtrl = getChild<LLUICtrl>("home"); + mUnzoomCtrl = getChild<LLUICtrl>("close"); // This is actually "unzoom" + mOpenCtrl = getChild<LLUICtrl>("new_window"); + mZoomCtrl = getChild<LLUICtrl>("zoom_frame"); + mMediaProgressPanel = getChild<LLPanel>("media_progress_indicator"); + mMediaProgressBar = getChild<LLProgressBar>("media_progress_bar"); + mMediaAddressCtrl = getChild<LLUICtrl>("media_address"); + mMediaAddress = getChild<LLUICtrl>("media_address_url"); + mMediaPlaySliderPanel = getChild<LLUICtrl>("media_play_position"); + mMediaPlaySliderCtrl = getChild<LLUICtrl>("media_play_slider"); + mSkipFwdCtrl = getChild<LLUICtrl>("skip_forward"); + mSkipBackCtrl = getChild<LLUICtrl>("skip_back"); + mVolumeCtrl = getChild<LLUICtrl>("media_volume"); + mVolumeBtn = getChild<LLButton>("media_volume_button"); + mVolumeUpCtrl = getChild<LLUICtrl>("volume_up"); + mVolumeDownCtrl = getChild<LLUICtrl>("volume_down"); + mWhitelistIcon = getChild<LLIconCtrl>("media_whitelist_flag"); + mSecureLockIcon = getChild<LLIconCtrl>("media_secure_lock_flag"); + mMediaControlsStack = getChild<LLLayoutStack>("media_controls"); + mLeftBookend = getChild<LLUICtrl>("left_bookend"); + mRightBookend = getChild<LLUICtrl>("right_bookend"); + mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name")); + LLStringUtil::convertToF32(getString("skip_step"), mSkipStep); + + // These are currently removed...but getChild creates a "dummy" widget. + // This class handles them missing. + mMediaPanelScroll = findChild<LLUICtrl>("media_panel_scroll"); + mScrollUpCtrl = findChild<LLButton>("scrollup"); + mScrollLeftCtrl = findChild<LLButton>("scrollleft"); + mScrollRightCtrl = findChild<LLButton>("scrollright"); + mScrollDownCtrl = findChild<LLButton>("scrolldown"); - LLUICtrl* media_address = getChild<LLUICtrl>("media_address"); - media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this )); + if (mScrollUpCtrl) + { + mScrollUpCtrl->setClickedCallback(onScrollUp, this); + mScrollUpCtrl->setHeldDownCallback(onScrollUpHeld, this); + mScrollUpCtrl->setMouseUpCallback(onScrollStop, this); + } + if (mScrollLeftCtrl) + { + mScrollLeftCtrl->setClickedCallback(onScrollLeft, this); + mScrollLeftCtrl->setHeldDownCallback(onScrollLeftHeld, this); + mScrollLeftCtrl->setMouseUpCallback(onScrollStop, this); + } + if (mScrollRightCtrl) + { + mScrollRightCtrl->setClickedCallback(onScrollRight, this); + mScrollRightCtrl->setHeldDownCallback(onScrollRightHeld, this); + mScrollRightCtrl->setMouseUpCallback(onScrollStop, this); + } + if (mScrollDownCtrl) + { + mScrollDownCtrl->setClickedCallback(onScrollDown, this); + mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this); + mScrollDownCtrl->setMouseUpCallback(onScrollStop, this); + } + + mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this )); mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout"); mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime"); @@ -249,88 +300,69 @@ void LLPanelPrimMediaControls::updateShape() // // Set the state of the buttons // - LLUICtrl* back_ctrl = getChild<LLUICtrl>("back"); - LLUICtrl* fwd_ctrl = getChild<LLUICtrl>("fwd"); - LLUICtrl* reload_ctrl = getChild<LLUICtrl>("reload"); - LLUICtrl* play_ctrl = getChild<LLUICtrl>("play"); - LLUICtrl* pause_ctrl = getChild<LLUICtrl>("pause"); - LLUICtrl* stop_ctrl = getChild<LLUICtrl>("stop"); - LLUICtrl* media_stop_ctrl = getChild<LLUICtrl>("media_stop"); - LLUICtrl* home_ctrl = getChild<LLUICtrl>("home"); - LLUICtrl* unzoom_ctrl = getChild<LLUICtrl>("close"); // This is actually "unzoom" - LLUICtrl* open_ctrl = getChild<LLUICtrl>("new_window"); - LLUICtrl* zoom_ctrl = getChild<LLUICtrl>("zoom_frame"); - LLPanel* media_loading_panel = getChild<LLPanel>("media_progress_indicator"); - LLUICtrl* media_address_ctrl = getChild<LLUICtrl>("media_address"); - LLUICtrl* media_play_slider_panel = getChild<LLUICtrl>("media_play_position"); - LLUICtrl* media_play_slider_ctrl = getChild<LLUICtrl>("media_play_slider"); - LLUICtrl* volume_ctrl = getChild<LLUICtrl>("media_volume"); - LLButton* volume_btn = getChild<LLButton>("media_volume_button"); - LLUICtrl* volume_up_ctrl = getChild<LLUICtrl>("volume_up"); - LLUICtrl* volume_down_ctrl = getChild<LLUICtrl>("volume_down"); - LLIconCtrl* whitelist_icon = getChild<LLIconCtrl>("media_whitelist_flag"); - LLIconCtrl* secure_lock_icon = getChild<LLIconCtrl>("media_secure_lock_flag"); - - LLUICtrl* media_panel_scroll = getChild<LLUICtrl>("media_panel_scroll"); - LLUICtrl* scroll_up_ctrl = getChild<LLUICtrl>("scrollup"); - LLUICtrl* scroll_left_ctrl = getChild<LLUICtrl>("scrollleft"); - LLUICtrl* scroll_right_ctrl = getChild<LLUICtrl>("scrollright"); - LLUICtrl* scroll_down_ctrl = getChild<LLUICtrl>("scrolldown"); // XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in, // and that only the proper controls get made visible/enabled according to that mode. - back_ctrl->setVisible(has_focus); - fwd_ctrl->setVisible(has_focus); - reload_ctrl->setVisible(has_focus); - stop_ctrl->setVisible(false); - home_ctrl->setVisible(has_focus); - zoom_ctrl->setVisible(!is_zoomed); - unzoom_ctrl->setVisible(has_focus && is_zoomed); - open_ctrl->setVisible(true); - media_address_ctrl->setVisible(has_focus && !mini_controls); - media_play_slider_panel->setVisible(has_focus && !mini_controls); - volume_ctrl->setVisible(false); - volume_up_ctrl->setVisible(false); - volume_down_ctrl->setVisible(false); + mBackCtrl->setVisible(has_focus); + mFwdCtrl->setVisible(has_focus); + mReloadCtrl->setVisible(has_focus); + mStopCtrl->setVisible(false); + mHomeCtrl->setVisible(has_focus); + mZoomCtrl->setVisible(!is_zoomed); + mUnzoomCtrl->setVisible(has_focus && is_zoomed); + mOpenCtrl->setVisible(true); + mMediaAddressCtrl->setVisible(has_focus && !mini_controls); + mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); + mVolumeCtrl->setVisible(false); + mVolumeUpCtrl->setVisible(false); + mVolumeDownCtrl->setVisible(false); - whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false); + mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false); // Disable zoom if HUD - zoom_ctrl->setEnabled(!objectp->isHUDAttachment()); - unzoom_ctrl->setEnabled(!objectp->isHUDAttachment()); - secure_lock_icon->setVisible(false); + mZoomCtrl->setEnabled(!objectp->isHUDAttachment()); + mUnzoomCtrl->setEnabled(!objectp->isHUDAttachment()); + mSecureLockIcon->setVisible(false); mCurrentURL = media_impl->getCurrentMediaURL(); - back_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate); - fwd_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate); - stop_ctrl->setEnabled(has_focus && can_navigate); - home_ctrl->setEnabled(has_focus && can_navigate); + mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate); + mFwdCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate); + mStopCtrl->setEnabled(has_focus && can_navigate); + mHomeCtrl->setEnabled(has_focus && can_navigate); LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE; if(media_plugin && media_plugin->pluginSupportsMediaTime()) { - reload_ctrl->setEnabled(FALSE); - reload_ctrl->setVisible(FALSE); - media_stop_ctrl->setVisible(has_focus); - home_ctrl->setVisible(FALSE); - back_ctrl->setEnabled(has_focus); - fwd_ctrl->setEnabled(has_focus); - media_address_ctrl->setVisible(false); - media_address_ctrl->setEnabled(false); - media_play_slider_panel->setVisible(has_focus && !mini_controls); - media_play_slider_panel->setEnabled(has_focus && !mini_controls); + mReloadCtrl->setEnabled(FALSE); + mReloadCtrl->setVisible(FALSE); + mMediaStopCtrl->setVisible(has_focus); + mHomeCtrl->setVisible(FALSE); + // No nav controls + mBackCtrl->setVisible(FALSE); + mFwdCtrl->setEnabled(FALSE); + mMediaAddressCtrl->setVisible(false); + mMediaAddressCtrl->setEnabled(false); + mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); + mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls); + mSkipFwdCtrl->setVisible(has_focus && !mini_controls); + mSkipFwdCtrl->setEnabled(has_focus && !mini_controls); + mSkipBackCtrl->setVisible(has_focus && !mini_controls); + mSkipBackCtrl->setEnabled(has_focus && !mini_controls); - volume_ctrl->setVisible(has_focus); - volume_up_ctrl->setVisible(has_focus); - volume_down_ctrl->setVisible(has_focus); - volume_ctrl->setEnabled(has_focus); - - whitelist_icon->setVisible(false); - secure_lock_icon->setVisible(false); - scroll_up_ctrl->setVisible(false); - scroll_left_ctrl->setVisible(false); - scroll_right_ctrl->setVisible(false); - scroll_down_ctrl->setVisible(false); - media_panel_scroll->setVisible(false); + mVolumeCtrl->setVisible(has_focus); + mVolumeUpCtrl->setVisible(has_focus); + mVolumeDownCtrl->setVisible(has_focus); + mVolumeCtrl->setEnabled(has_focus); + + mWhitelistIcon->setVisible(false); + mSecureLockIcon->setVisible(false); + if (mMediaPanelScroll) + { + mMediaPanelScroll->setVisible(false); + mScrollUpCtrl->setVisible(false); + mScrollDownCtrl->setVisible(false); + mScrollRightCtrl->setVisible(false); + mScrollDownCtrl->setVisible(false); + } F32 volume = media_impl->getVolume(); // movie's url changed @@ -343,8 +375,8 @@ void LLPanelPrimMediaControls::updateShape() if(mMovieDuration == 0) { mMovieDuration = media_plugin->getDuration(); - media_play_slider_ctrl->setValue(0); - media_play_slider_ctrl->setEnabled(false); + mMediaPlaySliderCtrl->setValue(0); + mMediaPlaySliderCtrl->setEnabled(false); } // TODO: What if it's not fully loaded @@ -352,48 +384,48 @@ void LLPanelPrimMediaControls::updateShape() { F64 current_time = media_plugin->getCurrentTime(); F32 percent = current_time / mMovieDuration; - media_play_slider_ctrl->setValue(percent); - media_play_slider_ctrl->setEnabled(true); + mMediaPlaySliderCtrl->setValue(percent); + mMediaPlaySliderCtrl->setEnabled(true); } // video vloume if(volume <= 0.0) { - volume_up_ctrl->setEnabled(TRUE); - volume_down_ctrl->setEnabled(FALSE); + mVolumeUpCtrl->setEnabled(TRUE); + mVolumeDownCtrl->setEnabled(FALSE); media_impl->setVolume(0.0); - volume_btn->setToggleState(true); + mVolumeBtn->setToggleState(true); } else if (volume >= 1.0) { - volume_up_ctrl->setEnabled(FALSE); - volume_down_ctrl->setEnabled(TRUE); + mVolumeUpCtrl->setEnabled(FALSE); + mVolumeDownCtrl->setEnabled(TRUE); media_impl->setVolume(1.0); - volume_btn->setToggleState(false); + mVolumeBtn->setToggleState(false); } else { - volume_up_ctrl->setEnabled(TRUE); - volume_down_ctrl->setEnabled(TRUE); + mVolumeUpCtrl->setEnabled(TRUE); + mVolumeDownCtrl->setEnabled(TRUE); } switch(result) { case LLPluginClassMediaOwner::MEDIA_PLAYING: - play_ctrl->setEnabled(FALSE); - play_ctrl->setVisible(FALSE); - pause_ctrl->setEnabled(TRUE); - pause_ctrl->setVisible(has_focus); - media_stop_ctrl->setEnabled(TRUE); + mPlayCtrl->setEnabled(FALSE); + mPlayCtrl->setVisible(FALSE); + mPauseCtrl->setEnabled(TRUE); + mPauseCtrl->setVisible(has_focus); + mMediaStopCtrl->setEnabled(TRUE); break; case LLPluginClassMediaOwner::MEDIA_PAUSED: default: - pause_ctrl->setEnabled(FALSE); - pause_ctrl->setVisible(FALSE); - play_ctrl->setEnabled(TRUE); - play_ctrl->setVisible(has_focus); - media_stop_ctrl->setEnabled(FALSE); + mPauseCtrl->setEnabled(FALSE); + mPauseCtrl->setVisible(FALSE); + mPlayCtrl->setEnabled(TRUE); + mPlayCtrl->setVisible(has_focus); + mMediaStopCtrl->setEnabled(FALSE); break; } } @@ -408,33 +440,40 @@ void LLPanelPrimMediaControls::updateShape() mCurrentURL.clear(); } - play_ctrl->setVisible(FALSE); - pause_ctrl->setVisible(FALSE); - media_stop_ctrl->setVisible(FALSE); - media_address_ctrl->setVisible(has_focus && !mini_controls); - media_address_ctrl->setEnabled(has_focus && !mini_controls); - media_play_slider_panel->setVisible(FALSE); - media_play_slider_panel->setEnabled(FALSE); - - volume_ctrl->setVisible(FALSE); - volume_up_ctrl->setVisible(FALSE); - volume_down_ctrl->setVisible(FALSE); - volume_ctrl->setEnabled(FALSE); - volume_up_ctrl->setEnabled(FALSE); - volume_down_ctrl->setEnabled(FALSE); + mPlayCtrl->setVisible(FALSE); + mPauseCtrl->setVisible(FALSE); + mMediaStopCtrl->setVisible(FALSE); + mMediaAddressCtrl->setVisible(has_focus && !mini_controls); + mMediaAddressCtrl->setEnabled(has_focus && !mini_controls); + mMediaPlaySliderPanel->setVisible(FALSE); + mMediaPlaySliderPanel->setEnabled(FALSE); + mSkipFwdCtrl->setVisible(FALSE); + mSkipFwdCtrl->setEnabled(FALSE); + mSkipBackCtrl->setVisible(FALSE); + mSkipBackCtrl->setEnabled(FALSE); - scroll_up_ctrl->setVisible(has_focus); - scroll_left_ctrl->setVisible(has_focus); - scroll_right_ctrl->setVisible(has_focus); - scroll_down_ctrl->setVisible(has_focus); - media_panel_scroll->setVisible(has_focus); + mVolumeCtrl->setVisible(FALSE); + mVolumeUpCtrl->setVisible(FALSE); + mVolumeDownCtrl->setVisible(FALSE); + mVolumeCtrl->setEnabled(FALSE); + mVolumeUpCtrl->setEnabled(FALSE); + mVolumeDownCtrl->setEnabled(FALSE); + + if (mMediaPanelScroll) + { + mMediaPanelScroll->setVisible(has_focus); + mScrollUpCtrl->setVisible(has_focus); + mScrollDownCtrl->setVisible(has_focus); + mScrollRightCtrl->setVisible(has_focus); + mScrollDownCtrl->setVisible(has_focus); + } // TODO: get the secure lock bool from media plug in std::string prefix = std::string("https://"); std::string test_prefix = mCurrentURL.substr(0, prefix.length()); LLStringUtil::toLower(test_prefix); if(test_prefix == prefix) { - secure_lock_icon->setVisible(has_focus); + mSecureLockIcon->setVisible(has_focus); } if(mCurrentURL!=mPreviousURL) @@ -445,17 +484,17 @@ void LLPanelPrimMediaControls::updateShape() if(result == LLPluginClassMediaOwner::MEDIA_LOADING) { - reload_ctrl->setEnabled(FALSE); - reload_ctrl->setVisible(FALSE); - stop_ctrl->setEnabled(TRUE); - stop_ctrl->setVisible(has_focus); + mReloadCtrl->setEnabled(FALSE); + mReloadCtrl->setVisible(FALSE); + mStopCtrl->setEnabled(TRUE); + mStopCtrl->setVisible(has_focus); } else { - reload_ctrl->setEnabled(TRUE); - reload_ctrl->setVisible(has_focus); - stop_ctrl->setEnabled(FALSE); - stop_ctrl->setVisible(FALSE); + mReloadCtrl->setEnabled(TRUE); + mReloadCtrl->setVisible(has_focus); + mStopCtrl->setEnabled(FALSE); + mStopCtrl->setVisible(FALSE); } } @@ -465,16 +504,15 @@ void LLPanelPrimMediaControls::updateShape() // // Handle progress bar // - mUpdatePercent = media_plugin->getProgressPercent(); - if(mUpdatePercent<100.0f) - { - media_loading_panel->setVisible(true); - getChild<LLProgressBar>("media_progress_bar")->setPercent(mUpdatePercent); - gFocusMgr.setTopCtrl(media_loading_panel); + if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus()) + { + mMediaProgressPanel->setVisible(true); + mMediaProgressBar->setPercent(media_plugin->getProgressPercent()); + gFocusMgr.setTopCtrl(mMediaProgressPanel); } else { - media_loading_panel->setVisible(false); + mMediaProgressPanel->setVisible(false); gFocusMgr.setTopCtrl(NULL); } } @@ -561,21 +599,20 @@ void LLPanelPrimMediaControls::updateShape() } LLCoordGL screen_min; - screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (min.mV[VX] + 1.f) * 0.5f); - screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (min.mV[VY] + 1.f) * 0.5f); + screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f); + screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f); LLCoordGL screen_max; - screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (max.mV[VX] + 1.f) * 0.5f); - screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (max.mV[VY] + 1.f) * 0.5f); + screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f); + screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f); // grow panel so that screenspace bounding box fits inside "media_region" element of HUD LLRect media_controls_rect; getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect); - LLView* media_region = getChild<LLView>("media_region"); - media_controls_rect.mLeft -= media_region->getRect().mLeft; - media_controls_rect.mBottom -= media_region->getRect().mBottom; - media_controls_rect.mTop += getRect().getHeight() - media_region->getRect().mTop; - media_controls_rect.mRight += getRect().getWidth() - media_region->getRect().mRight; + media_controls_rect.mLeft -= mMediaRegion->getRect().mLeft; + media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom; + media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop; + media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight; LLRect old_hud_rect = media_controls_rect; // keep all parts of HUD on-screen @@ -651,6 +688,20 @@ void LLPanelPrimMediaControls::draw() } } + // Build rect for icon area in coord system of this panel + // Assumes layout_stack is a direct child of this panel + mMediaControlsStack->updateLayout(); + LLRect icon_area = mMediaControlsStack->getRect(); + + // adjust to ignore space from left bookend padding + icon_area.mLeft += mLeftBookend->getRect().getWidth(); + + // ignore space from right bookend padding + icon_area.mRight -= mRightBookend->getRect().getWidth(); + + // get UI image + mBackgroundImage->draw( icon_area, UI_VERTEX_COLOR % alpha); + { LLViewDrawContext context(alpha); LLPanel::draw(); @@ -693,16 +744,12 @@ bool LLPanelPrimMediaControls::isMouseOver() S32 x, y; getWindow()->getCursorPosition(&cursor_pos_window); getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); - - LLView* controls_view = NULL; - controls_view = getChild<LLView>("media_controls"); - - //FIXME: rewrite as LLViewQuery or get hover set from LLViewerWindow? - if(controls_view && controls_view->getVisible()) + + if(mMediaControlsStack->getVisible()) { - controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); + mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); - LLView *hit_child = controls_view->childFromPoint(x, y); + LLView *hit_child = mMediaControlsStack->childFromPoint(x, y); if(hit_child && hit_child->getVisible()) { // This was useful for debugging both coordinate translation and view hieararchy problems... @@ -735,8 +782,8 @@ void LLPanelPrimMediaControls::onClickClose() void LLPanelPrimMediaControls::close() { + resetZoomLevel(true); LLViewerMediaFocus::getInstance()->clearFocus(); - resetZoomLevel(); setVisible(FALSE); } @@ -758,7 +805,7 @@ void LLPanelPrimMediaControls::onClickForward() focusOnTarget(); LLViewerMediaImpl* impl = getTargetMediaImpl(); - + if (impl) { impl->navigateForward(); @@ -829,18 +876,58 @@ void LLPanelPrimMediaControls::onClickStop() LLViewerMediaImpl* impl = getTargetMediaImpl(); + if(impl) + { + impl->navigateStop(); + } +} + +void LLPanelPrimMediaControls::onClickMediaStop() +{ + focusOnTarget(); + + LLViewerMediaImpl* impl = getTargetMediaImpl(); + if(impl) { impl->stop(); } } -void LLPanelPrimMediaControls::onClickZoom() +void LLPanelPrimMediaControls::onClickSkipBack() +{ + focusOnTarget(); + + LLViewerMediaImpl* impl =getTargetMediaImpl(); + + if (impl) + { + impl->skipBack(mSkipStep); + } +} + +void LLPanelPrimMediaControls::onClickSkipForward() { focusOnTarget(); - nextZoomLevel(); + LLViewerMediaImpl* impl = getTargetMediaImpl(); + + if (impl) + { + impl->skipForward(mSkipStep); + } +} + +void LLPanelPrimMediaControls::onClickZoom() +{ + focusOnTarget(); + + if(mCurrentZoom == ZOOM_NONE) + { + nextZoomLevel(); + } } + void LLPanelPrimMediaControls::nextZoomLevel() { int index = 0; @@ -857,12 +944,15 @@ void LLPanelPrimMediaControls::nextZoomLevel() updateZoom(); } -void LLPanelPrimMediaControls::resetZoomLevel() +void LLPanelPrimMediaControls::resetZoomLevel(bool reset_camera) { if(mCurrentZoom != ZOOM_NONE) { mCurrentZoom = ZOOM_NONE; - updateZoom(); + if(reset_camera) + { + updateZoom(); + } } } @@ -984,8 +1074,7 @@ void LLPanelPrimMediaControls::onCommitURL() { focusOnTarget(); - LLUICtrl *media_address_ctrl = getChild<LLUICtrl>("media_address_url"); - std::string url = media_address_ctrl->getValue().asString(); + std::string url = mMediaAddress->getValue().asString(); if(getTargetMediaImpl() && !url.empty()) { getTargetMediaImpl()->navigateTo( url, "", true); @@ -1014,19 +1103,18 @@ void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *user void LLPanelPrimMediaControls::setCurrentURL() { #ifdef USE_COMBO_BOX_FOR_MEDIA_URL - LLComboBox* media_address_combo = getChild<LLComboBox>("media_address_combo"); - // redirects will navigate momentarily to about:blank, don't add to history - if (media_address_combo && mCurrentURL != "about:blank") - { - media_address_combo->remove(mCurrentURL); - media_address_combo->add(mCurrentURL, ADD_SORTED); - media_address_combo->selectByValue(mCurrentURL); - } +// LLComboBox* media_address_combo = getChild<LLComboBox>("media_address_combo"); +// // redirects will navigate momentarily to about:blank, don't add to history +// if (media_address_combo && mCurrentURL != "about:blank") +// { +// media_address_combo->remove(mCurrentURL); +// media_address_combo->add(mCurrentURL, ADD_SORTED); +// media_address_combo->selectByValue(mCurrentURL); +// } #else // USE_COMBO_BOX_FOR_MEDIA_URL - LLLineEditor* media_address_url = getChild<LLLineEditor>("media_address_url"); - if (media_address_url && mCurrentURL != "about:blank") + if (mMediaAddress && mCurrentURL != "about:blank") { - media_address_url->setValue(mCurrentURL); + mMediaAddress->setValue(mCurrentURL); } #endif // USE_COMBO_BOX_FOR_MEDIA_URL } @@ -1035,12 +1123,11 @@ void LLPanelPrimMediaControls::onCommitSlider() { focusOnTarget(); - LLSlider* media_play_slider_ctrl = getChild<LLSlider>("media_play_slider"); LLViewerMediaImpl* media_impl = getTargetMediaImpl(); if (media_impl) { // get slider value - F64 slider_value = media_play_slider_ctrl->getValue().asReal(); + F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal(); if(slider_value <= 0.0) { media_impl->stop(); @@ -1069,7 +1156,7 @@ void LLPanelPrimMediaControls::onCommitVolumeUp() } media_impl->setVolume(volume); - getChild<LLButton>("media_volume")->setToggleState(false); + mVolumeBtn->setToggleState(false); } } @@ -1089,7 +1176,7 @@ void LLPanelPrimMediaControls::onCommitVolumeDown() } media_impl->setVolume(volume); - getChild<LLButton>("media_volume")->setToggleState(false); + mVolumeBtn->setToggleState(false); } } diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 3ec7aa2356c14614ce919050ba8b1b9da5970580..accfb72a0494c5eb45b4875748c2bbd40c4b41e4 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -35,7 +35,11 @@ #include "llpanel.h" #include "llviewermedia.h" +class LLButton; class LLCoordWindow; +class LLIconCtrl; +class LLLayoutStack; +class LLProgressBar; class LLViewerMediaImpl; class LLPanelPrimMediaControls : public LLPanel @@ -54,7 +58,7 @@ class LLPanelPrimMediaControls : public LLPanel void updateShape(); bool isMouseOver(); void nextZoomLevel(); - void resetZoomLevel(); + void resetZoomLevel(bool reset_camera = true); void close(); LLHandle<LLPanelPrimMediaControls> getHandle() const { return mPanelHandle; } @@ -91,6 +95,9 @@ class LLPanelPrimMediaControls : public LLPanel void onClickPause(); void onClickStop(); void onClickZoom(); + void onClickSkipBack(); + void onClickSkipForward(); + void onClickMediaStop(); void onCommitURL(); void updateZoom(); @@ -119,6 +126,47 @@ class LLPanelPrimMediaControls : public LLPanel LLViewerMediaImpl* getTargetMediaImpl(); LLViewerObject* getTargetObject(); LLPluginClassMedia* getTargetMediaPlugin(); + +private: + + LLView *mMediaRegion; + LLUICtrl *mBackCtrl; + LLUICtrl *mFwdCtrl; + LLUICtrl *mReloadCtrl; + LLUICtrl *mPlayCtrl; + LLUICtrl *mPauseCtrl; + LLUICtrl *mStopCtrl; + LLUICtrl *mMediaStopCtrl; + LLUICtrl *mHomeCtrl; + LLUICtrl *mUnzoomCtrl; + LLUICtrl *mOpenCtrl; + LLUICtrl *mSkipBackCtrl; + LLUICtrl *mSkipFwdCtrl; + LLUICtrl *mZoomCtrl; + LLPanel *mMediaProgressPanel; + LLProgressBar *mMediaProgressBar; + LLUICtrl *mMediaAddressCtrl; + LLUICtrl *mMediaAddress; + LLUICtrl *mMediaPlaySliderPanel; + LLUICtrl *mMediaPlaySliderCtrl; + LLUICtrl *mVolumeCtrl; + LLButton *mVolumeBtn; + LLUICtrl *mVolumeUpCtrl; + LLUICtrl *mVolumeDownCtrl; + LLIconCtrl *mWhitelistIcon; + LLIconCtrl *mSecureLockIcon; + LLLayoutStack *mMediaControlsStack; + LLUICtrl *mLeftBookend; + LLUICtrl *mRightBookend; + LLUIImage* mBackgroundImage; + F32 mSkipStep; + + LLUICtrl *mMediaPanelScroll; + LLButton *mScrollUpCtrl; + LLButton *mScrollLeftCtrl; + LLButton *mScrollRightCtrl; + LLButton *mScrollDownCtrl; + bool mPauseFadeout; bool mUpdateSlider; bool mClearFaceOnFade; @@ -137,8 +185,7 @@ class LLPanelPrimMediaControls : public LLPanel std::string mPreviousURL; F64 mCurrentRate; F64 mMovieDuration; - int mUpdatePercent; - + LLUUID mTargetObjectID; S32 mTargetObjectFace; LLUUID mTargetImplID; diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 8147ff17f0fc2bda63efcc067d6aa042c61b764a..4d152a13f306c516214156a1b7bfa22c51340710 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -158,28 +158,14 @@ void LLPanelProfile::onOpen(const LLSD& key) } //*TODO redo panel toggling -void LLPanelProfile::togglePanel(LLPanel* panel) +void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key) { // TRUE - we need to open/expand "panel" bool expand = getChildList()->front() != panel; // mTabCtrl->getVisible(); if (expand) { - if (panel->getParent() != this) - { - addChild(panel); - } - else - { - sendChildToFront(panel); - } - - panel->setVisible(TRUE); - - LLRect new_rect = getRect(); - panel->reshape(new_rect.getWidth(), new_rect.getHeight()); - new_rect.setLeftTopAndSize(0, new_rect.getHeight(), new_rect.getWidth(), new_rect.getHeight()); - panel->setRect(new_rect); + openPanel(panel, key); } else { @@ -243,5 +229,6 @@ void LLPanelProfile::notifyParent(const LLSD& info) onOpen(info); return; } + LLPanel::notifyParent(info); } diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index e0b827c98655ceb2737aad57f301b17c75aa889b..067beb248b9f27054cb8f8a82c3888e8fd181ae1 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -40,7 +40,7 @@ class LLTabContainer; /** -* Base class for Profile View and Me Profile. +* Base class for Profile View and My Profile. */ class LLPanelProfile : public LLPanel { @@ -51,7 +51,7 @@ class LLPanelProfile : public LLPanel /*virtual*/ void onOpen(const LLSD& key); - virtual void togglePanel(LLPanel*); + virtual void togglePanel(LLPanel*, const LLSD& key = LLSD()); virtual void openPanel(LLPanel* panel, const LLSD& params); diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp index d4ab5013f9592dc4a54e667375d53441e7f6e903..7832f63e6a698e9f8f302b6e00fde196043c97df 100644 --- a/indra/newview/llpanelprofileview.cpp +++ b/indra/newview/llpanelprofileview.cpp @@ -190,11 +190,13 @@ void LLPanelProfileView::processOnlineStatus(bool online) void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group) { llassert(getAvatarId() == id); - getChild<LLTextBox>("user_name", FALSE)->setValue(first_name + " " + last_name); + getChild<LLUICtrl>("user_name", FALSE)->setValue(first_name + " " + last_name); } -void LLPanelProfileView::togglePanel(LLPanel* panel) +void LLPanelProfileView::togglePanel(LLPanel* panel, const LLSD& key) { + // *TODO: unused method? + LLPanelProfile::togglePanel(panel); if(FALSE == panel->getVisible()) { diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h index 45c2fc116e7ff4ec0f8f8b2bbb5c12a793f9b114..5dc617d4a04e568b04a3f81114f8e4c2c2f59a6a 100644 --- a/indra/newview/llpanelprofileview.h +++ b/indra/newview/llpanelprofileview.h @@ -64,7 +64,7 @@ class LLPanelProfileView : public LLPanelProfile /*virtual*/ BOOL postBuild(); - /*virtual*/ void togglePanel(LLPanel* panel); + /*virtual*/ void togglePanel(LLPanel* panel, const LLSD& key = LLSD()); BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 057cdde6f055b3a8f6ade4e70eb02afba90f8021..67d0e137863106efe0d0134a574e0bb1dda03ac7 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -262,6 +262,7 @@ BOOL LLTeleportHistoryPanel::postBuild() fl->setCommitOnSelectionChange(true); fl->setDoubleClickCallback(boost::bind(&LLTeleportHistoryPanel::onDoubleClickItem, this)); fl->setCommitCallback(boost::bind(&LLTeleportHistoryPanel::handleItemSelect, this, fl)); + fl->setReturnCallback(boost::bind(&LLTeleportHistoryPanel::onReturnKeyPressed, this)); } } } @@ -636,6 +637,12 @@ void LLTeleportHistoryPanel::handleItemSelect(LLFlatListView* selected) updateVerbs(); } +void LLTeleportHistoryPanel::onReturnKeyPressed() +{ + // Teleport to selected region as default action on return key pressed + onTeleport(); +} + void LLTeleportHistoryPanel::onDoubleClickItem() { // If item got doubleclick, then that item is already selected diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index b34d9e876c7b47c1115bc4a857845ca3bc244da9..a31ff34cb6add0af9d2f1039589d6d840e6d5718 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -80,6 +80,7 @@ class LLTeleportHistoryPanel : public LLPanelPlacesTab private: void onDoubleClickItem(); + void onReturnKeyPressed(); void onAccordionTabRightClick(LLView *view, S32 x, S32 y, MASK mask); void onAccordionTabOpen(LLAccordionCtrlTab *tab); void onAccordionTabClose(LLAccordionCtrlTab *tab); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 2be0781487c66b32067e0fbaa268cae8de47dda3..4ee9cba69cae03fe203bf7bf3fc70014baaf8081 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -36,10 +36,12 @@ #include "lltrans.h" #include "llavataractions.h" #include "llagent.h" +#include "llimview.h" #include "llparticipantlist.h" #include "llavatarlist.h" #include "llspeakers.h" +#include "llviewermenu.h" //LLParticipantList retrieves add, clear and remove events and updates view accordingly #if LL_MSVC @@ -63,6 +65,11 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2)); + // Set onAvatarListDoubleClicked as default on_return action. + mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); + + mParticipantListMenu = new LLParticipantListMenu(*this); + mAvatarList->setContextMenu(mParticipantListMenu); //Lets fill avatarList with existing speakers LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); @@ -83,10 +90,18 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av LLParticipantList::~LLParticipantList() { + delete mParticipantListMenu; + mParticipantListMenu = NULL; } +void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible) +{ + mAvatarList->setSpeakingIndicatorsVisible(visible); +}; + void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) { + // NOTE(EM): Should we check if there is multiple selection and start conference if it is so? LLUUID clicked_id = list->getSelectedUUID(); if (clicked_id.isNull() || clicked_id == gAgent.getID()) @@ -118,6 +133,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param) { name.erase(found, moderator_indicator_len); item->setName(name); + item->reshapeAvatarName(); } } } @@ -139,6 +155,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param) name += " "; name += moderator_indicator; item->setName(name); + item->reshapeAvatarName(); } } } @@ -265,3 +282,139 @@ bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LL { return mParent.onModeratorUpdateEvent(event, userdata); } + +LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu() +{ + // set up the callbacks for all of the avatar menu items + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + + registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2)); + registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2)); + + enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2)); + enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2)); + + // create the context menu from the XUI + return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>( + "menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); +} + +void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata) +{ + const LLUUID speaker_id = mUUIDs.front(); + + std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest"); + LLSD data; + data["method"] = "mute update"; + data["session-id"] = mParent.mSpeakerMgr->getSessionID(); + data["params"] = LLSD::emptyMap(); + data["params"]["agent_id"] = speaker_id; + data["params"]["mute_info"] = LLSD::emptyMap(); + //current value represents ability to type, so invert + data["params"]["mute_info"]["text"] = !mParent.mSpeakerMgr->findSpeaker(speaker_id)->mModeratorMutedText; + + class MuteTextResponder : public LLHTTPClient::Responder + { + public: + MuteTextResponder(const LLUUID& session_id) + { + mSessionID = session_id; + } + + virtual void error(U32 status, const std::string& reason) + { + llwarns << status << ": " << reason << llendl; + + if ( gIMMgr ) + { + //403 == you're not a mod + //should be disabled if you're not a moderator + if ( 403 == status ) + { + gIMMgr->showSessionEventError( + "mute", + "not_a_moderator", + mSessionID); + } + else + { + gIMMgr->showSessionEventError( + "mute", + "generic", + mSessionID); + } + } + } + + private: + LLUUID mSessionID; + }; + + LLHTTPClient::post( + url, + data, + new MuteTextResponder(mParent.mSpeakerMgr->getSessionID())); +} + +void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata) +{ + const LLUUID speaker_id = mUUIDs.front(); + BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagTextChat); + std::string name; + + //fill in name using voice client's copy of name cache + LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(speaker_id); + if (speakerp.isNull()) + { + return; + } + + name = speakerp->mDisplayName; + + LLMute mute(speaker_id, name, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT); + + if (!is_muted) + { + LLMuteList::getInstance()->add(mute, LLMute::flagTextChat); + } + else + { + LLMuteList::getInstance()->remove(mute, LLMute::flagTextChat); + } +} + +bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata) +{ + std::string item = userdata.asString(); + if (item == "can_mute_text") + { + return mUUIDs.front() != gAgentID; + } + else + if (item == "can_allow_text_chat") + { + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mParent.mSpeakerMgr->getSessionID()); + return im_session->mType == IM_SESSION_GROUP_START && mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator; + } + return true; +} + +bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& userdata) +{ + std::string item = userdata.asString(); + const LLUUID& id = mUUIDs.front(); + if (item == "is_muted") + return LLMuteList::getInstance()->isMuted(id, LLMute::flagTextChat); + else + if (item == "is_allowed_text_chat") + { + LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(id); + + if (selected_speakerp.notNull()) + { + return !selected_speakerp->mModeratorMutedText; + } + } + return false; +} diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index fc34dd308bafa627697e6d4fe5ab43cc90886958..5e26c39fc81a6187fe6540b2fd0458d8396825c7 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -32,6 +32,8 @@ #include "llviewerprecompiledheaders.h" #include "llevent.h" +#include "llpanelpeoplemenus.h" +#include "llimview.h" class LLSpeakerMgr; class LLAvatarList; @@ -43,6 +45,7 @@ class LLParticipantList public: LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list); ~LLParticipantList(); + void setSpeakingIndicatorsVisible(BOOL visible); typedef enum e_participant_sort_oder { E_SORT_BY_NAME = 0, @@ -105,6 +108,25 @@ class LLParticipantList SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); }; + + /** + * Menu used in the participant list. + */ + class LLParticipantListMenu : public LLPanelPeopleMenus::ContextMenu + { + public: + LLParticipantListMenu(LLParticipantList& parent):mParent(parent){}; + /*virtual*/ LLContextMenu* createMenu(); + protected: + LLParticipantList& mParent; + private: + bool enableContextMenuItem(const LLSD& userdata); + bool checkContextMenuItem(const LLSD& userdata); + + void toggleAllowTextChat(const LLSD& userdata); + void toggleMuteText(const LLSD& userdata); + + }; private: void onAvatarListDoubleClicked(LLAvatarList* list); @@ -121,5 +143,7 @@ class LLParticipantList LLPointer<SpeakerClearListener> mSpeakerClearListener; LLPointer<SpeakerModeratorUpdateListener> mSpeakerModeratorListener; + LLParticipantListMenu* mParticipantListMenu; + EParticipantSortOrder mSortOrder; }; diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 34e78b5c469abce87d5aef2c54988ce79f6f9f83..c95882931b6a9314a8b28a7f1316368c82fc8ac1 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -454,7 +454,7 @@ LLMultiPreview::LLMultiPreview() { // start with a rect in the top-left corner ; will get resized LLRect rect; - rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeight(), 200, 200); + rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 200); setRect(rect); } setTitle(LLTrans::getString("MultiPreviewTitle")); diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 506c135ca646247e24aa42257b85921b1b05550e..3b9f7f988274a74043eeb17c9606dfc546ef6e5b 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -37,7 +37,7 @@ #include "llresizehandle.h" #include "llpointer.h" #include "lluuid.h" -#include "llinventorymodel.h" // LLInventoryObserver +#include "llinventoryobserver.h" #include <map> class LLInventoryItem; diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index 604faf8eb4b26ff08132a96008da0e81bc6425b3..92bd4dc62b11eba1e3ad289477eae69092b12838 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild() childSetAction("Anim audition btn",auditionAnim, this); childSetCommitCallback("desc", LLPreview::onText, this); - childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 7b3a20d1020edf7323f7760f4c74edbb377cf9ae..3d2c529dda6e29a11c3d439024d0647d0e3c3dbe 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -355,7 +355,7 @@ LLPreviewGesture::~LLPreviewGesture() BOOL LLPreviewGesture::postBuild() { - mVisibleSignal.connect(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2)); + setVisibleCallback(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2)); LLLineEditor* edit; LLComboBox* combo; @@ -493,7 +493,7 @@ BOOL LLPreviewGesture::postBuild() { childSetCommitCallback("desc", LLPreview::onText, this); childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); } return LLPreview::postBuild(); diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index ab9cfbf85064b7b0a3fda13e1db168f0f76c2e3b..ce81077d802fd492160a51bd7c3f1de59f13c200 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -96,7 +96,7 @@ BOOL LLPreviewNotecard::postBuild() childSetCommitCallback("desc", LLPreview::onText, this); if (item) childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 2382befcfa7144435ad602aee25fd1b95e30589d..4e4711f8fbdd9729cc72a9ff6065b227d8b4ab6c 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -956,7 +956,7 @@ BOOL LLPreviewLSL::postBuild() childSetCommitCallback("desc", LLPreview::onText, this); childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index a00f580e327cd548572d4156417e270d283f58e9..28a409d3ee8063a9ca7cf3401cca628358cc4df3 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -41,7 +41,6 @@ #include "lliconctrl.h" #include "llframetimer.h" - class LLMessageSystem; class LLTextEditor; class LLButton; @@ -52,6 +51,7 @@ struct LLEntryAndEdCore; class LLMenuBarGL; class LLFloaterScriptSearch; class LLKeywordToken; +class LLViewerInventoryItem; // Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these. class LLScriptEdCore : public LLPanel diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index 7659c50ed3153ecc7bc831f8c2b017b7b08e68dc..d7fd252fb67f26e2bb9b6dddb6e1a261e94f420b 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::prevalidatePrintableNotPipe); + childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 3eab13fc4a23b942e51957a09529d91bbefe9704..41cf402d6f4bc6b05b5e97bb887ae0907d4e85cd 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -152,7 +152,7 @@ BOOL LLPreviewTexture::postBuild() { childSetCommitCallback("desc", LLPreview::onText, this); childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); } } @@ -394,8 +394,8 @@ void LLPreviewTexture::updateDimensions() S32 client_height = image_height; S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; S32 vert_pad = PREVIEW_HEADER_SIZE + 2 * CLIENT_RECT_VPAD + LLPANEL_BORDER_WIDTH; - S32 max_client_width = gViewerWindow->getWindowWidth() - horiz_pad; - S32 max_client_height = gViewerWindow->getWindowHeight() - vert_pad; + S32 max_client_width = gViewerWindow->getWindowWidthScaled() - horiz_pad; + S32 max_client_height = gViewerWindow->getWindowHeightScaled() - vert_pad; if (mAspectRatio > 0.f) { diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp index b491c7e1092a43fbed2ca1f017667fce95dade31..bd46b5b56aa58a14ea3018bec4a0a8249403707e 100644 --- a/indra/newview/llrecentpeople.cpp +++ b/indra/newview/llrecentpeople.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llrecentpeople.h" +#include "llgroupmgr.h" #include "llagent.h" @@ -43,12 +44,18 @@ bool LLRecentPeople::add(const LLUUID& id) if (id == gAgent.getID()) return false; - LLDate date_added = LLDate::now(); + bool is_not_group_id = LLGroupMgr::getInstance()->getGroupData(id) == NULL; - //[] instead of insert to replace existing id->date with new date value - mPeople[id] = date_added; - mChangedSignal(); - return true; + if (is_not_group_id) + { + LLDate date_added = LLDate::now(); + + //[] instead of insert to replace existing id->date with new date value + mPeople[id] = date_added; + mChangedSignal(); + } + + return is_not_group_id; } bool LLRecentPeople::contains(const LLUUID& id) const diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index e4dbcbd21928875ac7b4242ed84ac1369bdb3337..24ba288c49db941657684cae3334c8fe0a9353c7 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -46,6 +46,7 @@ #include "lldockablefloater.h" #include "llsyswellwindow.h" #include "llimfloater.h" +#include "llscriptfloater.h" #include <algorithm> @@ -63,7 +64,7 @@ LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) : ,mCanStoreToasts(true) ,mHiddenToastsNum(0) ,mOverflowToastHidden(false) - ,mIsHovering(false) + ,mHoveredToast(NULL) ,mControlHovering(false) ,mShowToasts(true) { @@ -103,8 +104,8 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne void LLScreenChannelBase::init(S32 channel_left, S32 channel_right) { - S32 channel_top = gViewerWindow->getWorldViewRect().getHeight(); - S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); + S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight(); + S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom)); setVisible(TRUE); } @@ -114,7 +115,9 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right) // LLScreenChannel ////////////////////// //-------------------------------------------------------------------------- -LLScreenChannel::LLScreenChannel(LLUUID& id): LLScreenChannelBase(id) +LLScreenChannel::LLScreenChannel(LLUUID& id): +LLScreenChannelBase(id) +,mStartUpToastPanel(NULL) { } @@ -216,8 +219,10 @@ void LLScreenChannel::deleteToast(LLToast* toast) // update channel's Hovering state // turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard - if(toast->hasFocus()) - setHovering(false); + if(mHoveredToast == toast) + { + mHoveredToast = NULL; + } // close the toast toast->closeFloater(); @@ -352,11 +357,9 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel) //-------------------------------------------------------------------------- void LLScreenChannel::redrawToasts() { - if(mToastList.size() == 0 || mIsHovering) + if(mToastList.size() == 0 || isHovering()) return; - hideToastsFromScreen(); - switch(mToastAlignment) { case NA_TOP : @@ -380,6 +383,8 @@ void LLScreenChannel::showToastsBottom() S32 toast_margin = 0; std::vector<ToastElem>::reverse_iterator it; + closeOverflowToastPanel(); + for(it = mToastList.rbegin(); it != mToastList.rend(); ++it) { if(it != mToastList.rbegin()) @@ -405,7 +410,20 @@ void LLScreenChannel::showToastsBottom() if(stop_showing_toasts) break; - (*it).toast->setVisible(TRUE); + if( !(*it).toast->getVisible() ) + { + if((*it).toast->isFirstLook()) + { + (*it).toast->setVisible(TRUE); + } + else + { + // HACK + // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts + (*it).toast->setVisible(TRUE); + gFloaterView->sendChildToBack((*it).toast); + } + } } if(it != mToastList.rend() && !mOverflowToastHidden) @@ -414,6 +432,7 @@ void LLScreenChannel::showToastsBottom() for(; it != mToastList.rend(); it++) { (*it).toast->stopTimer(); + (*it).toast->setVisible(FALSE); mHiddenToastsNum++; } createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime")); @@ -453,10 +472,9 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer) if(!mOverflowToastPanel) return; - mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this)); + mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this)); LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text"); - LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon"); std::string text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum); if(mHiddenToastsNum == 1) { @@ -474,7 +492,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer) text_box->setValue(text); text_box->setVisible(TRUE); - icon->setVisible(TRUE); mOverflowToastPanel->setVisible(TRUE); } @@ -532,21 +549,8 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this)); LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text"); - LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon"); - std::string mStartUpFormatString; - - if(notif_num == 1) - { - mStartUpFormatString = LLTrans::getString("StartUpNotification"); - } - else - { - mStartUpFormatString = LLTrans::getString("StartUpNotifications"); - } - - - std::string text = llformat(mStartUpFormatString.c_str(), notif_num); + std::string text = LLTrans::getString("StartUpNotifications"); toast_rect = mStartUpToastPanel->getRect(); mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true); @@ -555,8 +559,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) text_box->setValue(text); text_box->setVisible(TRUE); - icon->setVisible(TRUE); - addChild(mStartUpToastPanel); mStartUpToastPanel->setVisible(TRUE); @@ -654,7 +656,14 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter) // we must check this to prevent incorrect setting for hovering in a channel std::map<LLToast*, bool>::iterator it_first, it_second; S32 stack_size = mToastEventStack.size(); - mIsHovering = mouse_enter; + if(mouse_enter) + { + mHoveredToast = toast; + } + else + { + mHoveredToast = NULL; + } switch(stack_size) { @@ -666,7 +675,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter) if((*it_first).second && !mouse_enter && ((*it_first).first != toast) ) { mToastEventStack.clear(); - mIsHovering = true; + mHoveredToast = toast; } else { @@ -678,7 +687,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter) LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl; } - if(!mIsHovering) + if(!isHovering()) redrawToasts(); } @@ -694,7 +703,8 @@ void LLScreenChannel::updateShowToastsState() } // for IM floaters showed in a docked state - prohibit showing of ani toast - if(dynamic_cast<LLIMFloater*>(floater)) + if(dynamic_cast<LLIMFloater*>(floater) + || dynamic_cast<LLScriptFloater*>(floater) ) { setShowToasts(!(floater->getVisible() && floater->isDocked())); if (!getShowToasts()) @@ -706,7 +716,7 @@ void LLScreenChannel::updateShowToastsState() // for Message Well floater showed in a docked state - adjust channel's height if(dynamic_cast<LLSysWellWindow*>(floater)) { - S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");; + S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");; LLRect this_rect = getRect(); if(floater->getVisible() && floater->isDocked()) { diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index fd31690622f8b65ad63a16c7de08f5bb7d184b04..f39b94b89df3b722602e6606312453b83964fd07 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -93,9 +93,10 @@ class LLScreenChannelBase : public LLUICtrl // Channel's behavior-functions // set whether a channel will control hovering inside itself or not virtual void setControlHovering(bool control) { mControlHovering = control; } - // set Hovering flag for a channel - virtual void setHovering(bool hovering) { mIsHovering = hovering; } + + bool isHovering() { return mHoveredToast != NULL; } + void setCanStoreToasts(bool store) { mCanStoreToasts = store; } void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; } @@ -117,7 +118,7 @@ class LLScreenChannelBase : public LLUICtrl protected: // Channel's flags bool mControlHovering; - bool mIsHovering; + LLToast* mHoveredToast; bool mCanStoreToasts; bool mDisplayToastsAlways; bool mOverflowToastHidden; diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bdea6ff45944cafea6f4a40c786b4c8b9cdb91f0 --- /dev/null +++ b/indra/newview/llscriptfloater.cpp @@ -0,0 +1,335 @@ +/** + * @file llscriptfloater.cpp + * @brief LLScriptFloater class definition + * + * $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 "llviewerprecompiledheaders.h" +#include "llscriptfloater.h" + +#include "llbottomtray.h" +#include "llchannelmanager.h" +#include "llchiclet.h" +#include "llfloaterreg.h" +#include "llscreenchannel.h" +#include "lltoastnotifypanel.h" +#include "llviewerwindow.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLUUID notification_id_to_object_id(const LLUUID& notification_id) +{ + LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); + if(notification) + { + return notification->getPayload()["object_id"].asUUID(); + } + return LLUUID::null; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLScriptFloater::LLScriptFloater(const LLSD& key) +: LLTransientDockableFloater(NULL, true, key) +, mScriptForm(NULL) +, mObjectId(key.asUUID()) +{ +} + +bool LLScriptFloater::toggle(const LLUUID& object_id) +{ + LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id); + + // show existing floater + if(floater) + { + if(floater->getVisible()) + { + floater->setVisible(false); + return false; + } + else + { + floater->setVisible(TRUE); + floater->setFocus(TRUE); + return true; + } + } + // create and show new floater + else + { + show(object_id); + return true; + } +} + +LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id) +{ + LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", object_id); + floater->createForm(object_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); + } + + floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), + LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, floater, _1))); + } + + return floater; +} + +void LLScriptFloater::getAllowedRect(LLRect& rect) +{ + rect = gViewerWindow->getWorldViewRectRaw(); +} + +void LLScriptFloater::createForm(const LLUUID& object_id) +{ + // delete old form + if(mScriptForm) + { + removeChild(mScriptForm); + mScriptForm->die(); + } + + LLNotificationPtr notification = LLNotifications::getInstance()->find( + LLScriptFloaterManager::getInstance()->findNotificationId(object_id)); + if(NULL == notification) + { + return; + } + + // create new form + mScriptForm = new LLToastNotifyPanel(notification); + 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); +} + +void LLScriptFloater::onClose(bool app_quitting) +{ + LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId()); +} + +void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */) +{ + LLTransientDockableFloater::setDocked(docked, pop_on_undock); + + hideToastsIfNeeded(); +} + +void LLScriptFloater::setVisible(BOOL visible) +{ + LLTransientDockableFloater::setVisible(visible); + + hideToastsIfNeeded(); +} + +void LLScriptFloater::hideToastsIfNeeded() +{ + using namespace LLNotificationsUI; + + // find channel + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID( + LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); + // update notification channel state + if(channel) + { + channel->updateShowToastsState(); + } +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +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()) + { + llwarns << "Invalid notification, no object id" << llendl; + return; + } + + // 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()) + { + onRemoveNotification(notification_id); + } + + LLNotificationData nd = {notification_id}; + mNotifications.insert(std::make_pair(object_id, nd)); + + LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id); +} + +void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id) +{ + LLUUID object_id = notification_id_to_object_id(notification_id); + if(object_id.isNull()) + { + llwarns << "Invalid notification, no object 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)); + if(channel) + { + channel->killToastByNotificationID(findNotificationToastId(object_id)); + } + + mNotifications.erase(object_id); + + // remove related chiclet + LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id); + + // close floater + LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id); + if(floater) + { + floater->closeFloater(); + } +} + +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()); + } +} + +void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id) +{ + // hide "new message" icon from chiclet + LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id); + if(chiclet) + { + chiclet->setShowNewMessagesIcon(false); + } + + // kill toast + using namespace LLNotificationsUI; + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID( + LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); + if(channel) + { + channel->killToastByNotificationID(findNotificationToastId(object_id)); + } + + // toggle floater + LLScriptFloater::toggle(object_id); +} + +void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id) +{ + script_notification_map_t::iterator it = mNotifications.find(object_id); + if(mNotifications.end() != it) + { + it->second.toast_notification_id = notification_id; + } +} + +LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id) +{ + script_notification_map_t::const_iterator it = mNotifications.find(object_id); + if(mNotifications.end() != it) + { + return it->second.notification_id; + } + 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) + { + return it->second.toast_notification_id; + } + return LLUUID::null; +} + +//static +void LLScriptFloaterManager::onToastButtonClick(const LLSD¬ification, const LLSD&response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + LLUUID object_id = notification["payload"]["object_id"].asUUID(); + + switch(option) + { + case 0: // "Open" + LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id); + break; + case 1: // "Ignore" + LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id); + break; + case 2: // "Block" + LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT)); + LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id); + break; + default: + llwarns << "Unexpected value" << llendl; + break; + } +} + +// EOF diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h new file mode 100644 index 0000000000000000000000000000000000000000..0e1a7f36b72fdf8724053d4d6fe70c61f50a5619 --- /dev/null +++ b/indra/newview/llscriptfloater.h @@ -0,0 +1,164 @@ +/** + * @file llscriptfloater.h + * @brief LLScriptFloater class definition + * + * $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_SCRIPTFLOATER_H +#define LL_SCRIPTFLOATER_H + +#include "lltransientdockablefloater.h" + +class LLToastNotifyPanel; + +/** + * Handles script notifications ("ScriptDialog" and "ScriptDialogGroup") + * and manages Script Floaters. + */ +class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager> +{ +public: + + /** + * Handles new notifications. + * Saves notification and object ids, removes old notification if needed, creates script chiclet + * Note that one object can spawn one script floater. + */ + void onAddNotification(const LLUUID& notification_id); + + /** + * Handles notification removal. + * Removes script notification toast, removes script chiclet, closes script floater + */ + 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. + */ + void toggleScriptFloater(const LLUUID& object_id); + + LLUUID findNotificationId(const LLUUID& object_id); + + LLUUID findNotificationToastId(const LLUUID& object_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); + +private: + + struct LLNotificationData + { + LLUUID notification_id; + LLUUID toast_notification_id; + }; + + // <object_id, notification_data> + typedef std::map<LLUUID, LLNotificationData> script_notification_map_t; + + script_notification_map_t mNotifications; +}; + +/** + * Floater script forms. + * LLScriptFloater will create script form based on notification data and + * will auto fit the form. + */ +class LLScriptFloater : public LLTransientDockableFloater +{ +public: + + /** + * key - UUID of scripted Object + */ + LLScriptFloater(const LLSD& key); + + virtual ~LLScriptFloater(){}; + + /** + * Toggle existing floater or create and show a new one. + */ + static bool toggle(const LLUUID& object_id); + + /** + * Creates and shows floater + */ + static LLScriptFloater* show(const LLUUID& object_id); + + const LLUUID& getObjectId() { return mObjectId; } + + /** + * Close notification if script floater is closed. + */ + /*virtual*/ void onClose(bool app_quitting); + + /** + * Hide all notification toasts when we show dockable floater + */ + /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); + + /** + * Hide all notification toasts when we show dockable floater + */ + /*virtual*/ void setVisible(BOOL visible); + +protected: + + /** + * Creates script form, will delete old form if floater is shown for same object. + */ + void createForm(const LLUUID& object_id); + + /*virtual*/ void getAllowedRect(LLRect& rect); + + /** + * Hide all notification toasts. + */ + static void hideToastsIfNeeded(); + + void setObjectId(const LLUUID& id) { mObjectId = id; } + +private: + LLToastNotifyPanel* mScriptForm; + LLUUID mObjectId; +}; + +#endif //LL_SCRIPTFLOATER_H diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 1fbaeb94f534b1378402f6a36a829d659bf0a080..b5e55df1f59181b893d1c33aacb320921827fa33 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -73,9 +73,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param F32 min_weight = param->getMinWeight(); F32 max_weight = param->getMaxWeight(); - mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, min_weight); + 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, param, max_weight ); + mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), max_weight ); mHintMin->setAllowsUpdates( FALSE ); mHintMax->setAllowsUpdates( FALSE ); diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp index f95671685b3b9173a04af80cc970dac412795d08..93a70b6471a040ab1fab79069e17a069c65f05a5 100644 --- a/indra/newview/llsearchcombobox.cpp +++ b/indra/newview/llsearchcombobox.cpp @@ -82,7 +82,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p) setButtonVisible(p.dropdown_button_visible); mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2)); mTextEntry->setKeystrokeCallback(boost::bind(&LLComboBox::onTextEntry, this, _1), NULL); - setSelectionCallback(boost::bind(&LLSearchComboBox::onSelectionCommit, this)); + setCommitCallback(boost::bind(&LLSearchComboBox::onSelectionCommit, this)); setPrearrangeCallback(boost::bind(&LLSearchComboBox::onSearchPrearrange, this, _2)); mSearchButton->setCommitCallback(boost::bind(&LLSearchComboBox::onTextCommit, this, _2)); } diff --git a/indra/newview/llsearchhistory.h b/indra/newview/llsearchhistory.h index 253ef21e9e182a50e0fccbd17adf4444a521a374..eb6efdb86f2a5f1888ba738225e7f2e4a79d896e 100644 --- a/indra/newview/llsearchhistory.h +++ b/indra/newview/llsearchhistory.h @@ -34,12 +34,15 @@ #define LL_LLSEARCHHISTORY_H #include "llsingleton.h" +#include "llui.h" + /** * Search history container able to save and load history from file. * History is stored in chronological order, most recent at the beginning. */ -class LLSearchHistory : public LLSingleton<LLSearchHistory> +class LLSearchHistory : public LLSingleton<LLSearchHistory>, private LLDestroyClass<LLSearchHistory> { + friend class LLDestroyClass<LLSearchHistory>; public: // Forward declaration @@ -130,6 +133,12 @@ class LLSearchHistory : public LLSingleton<LLSearchHistory> private: + // Implementation of LLDestroyClass<LLSearchHistory> + static void destroyClass() + { + LLSearchHistory::getInstance()->save(); + } + search_history_list_t mSearchHistory; }; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0f8e86cb3cab6ce4169c36495966141d8219c7ac --- /dev/null +++ b/indra/newview/llsidepanelappearance.cpp @@ -0,0 +1,382 @@ +/** + * @file llsidepanelappearance.cpp + * @brief Side Bar "Appearance" panel + * + * $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 "llsidepanelappearance.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" +#include "llinventorypanel.h" +#include "llfiltereditor.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "llfoldervieweventlistener.h" +#include "llpaneleditwearable.h" +#include "llpaneloutfitsinventory.h" +#include "lltextbox.h" +#include "lluictrlfactory.h" +#include "llviewerregion.h" +#include "llvoavatarself.h" +#include "llwearable.h" + +static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance"); + +class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver +{ +public: + LLCurrentlyWornFetchObserver(LLSidepanelAppearance *panel) : + mPanel(panel) + {} + ~LLCurrentlyWornFetchObserver() {} + virtual void done() + { + mPanel->inventoryFetched(); + gInventory.removeObserver(this); + } +private: + LLSidepanelAppearance *mPanel; +}; + +LLSidepanelAppearance::LLSidepanelAppearance() : + LLPanel(), + mFilterSubString(LLStringUtil::null), + mFilterEditor(NULL), + mLookInfo(NULL), + mCurrOutfitPanel(NULL) +{ + //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() + mFetchWorn = new LLCurrentlyWornFetchObserver(this); +} + +LLSidepanelAppearance::~LLSidepanelAppearance() +{ +} + +// virtual +BOOL LLSidepanelAppearance::postBuild() +{ + mOpenOutfitBtn = getChild<LLButton>("openoutfit_btn"); + mOpenOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onOpenOutfitButtonClicked, this)); + + mEditAppearanceBtn = getChild<LLButton>("editappearance_btn"); + mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this)); + + mWearBtn = getChild<LLButton>("wear_btn"); + mWearBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onWearButtonClicked, this)); + + mEditBtn = getChild<LLButton>("edit_btn"); + mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this)); + + mNewOutfitBtn = getChild<LLButton>("newlook_btn"); + mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this)); + mNewOutfitBtn->setEnabled(false); + + mFilterEditor = getChild<LLFilterEditor>("Filter"); + if (mFilterEditor) + { + mFilterEditor->setCommitCallback(boost::bind(&LLSidepanelAppearance::onFilterEdit, this, _2)); + } + + mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory")); + mPanelOutfitsInventory->setParent(this); + + mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info")); + if (mLookInfo) + { + LLButton* back_btn = mLookInfo->getChild<LLButton>("back_btn"); + if (back_btn) + { + back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this)); + } + + } + + mEditWearable = dynamic_cast<LLPanelEditWearable*>(getChild<LLPanel>("panel_edit_wearable")); + if (mEditWearable) + { + 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)); + } + } + + mCurrentLookName = getChild<LLTextBox>("currentlook_name"); + + mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook"); + + return TRUE; +} + +// virtual +void LLSidepanelAppearance::onOpen(const LLSD& key) +{ + fetchInventory(); + refreshCurrentOutfitName(); + + if(key.size() == 0) + return; + + toggleLookInfoPanel(TRUE); + updateVerbs(); + + mLookInfoType = key["type"].asString(); + + if (mLookInfoType == "look") + { + LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID()); + if (pLook) + mLookInfo->displayLookInfo(pLook); + } +} + +void LLSidepanelAppearance::onFilterEdit(const std::string& search_string) +{ + if (mFilterSubString != search_string) + { + mFilterSubString = search_string; + + // Searches are case-insensitive + LLStringUtil::toUpper(mFilterSubString); + LLStringUtil::trimHead(mFilterSubString); + + mPanelOutfitsInventory->onSearchEdit(mFilterSubString); + } +} + +void LLSidepanelAppearance::onWearButtonClicked() +{ + if (!mLookInfo->getVisible()) + { + mPanelOutfitsInventory->onWear(); + } +} + +void LLSidepanelAppearance::onOpenOutfitButtonClicked() +{ + const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink(); + if (!outfit_link) + return; + if (!outfit_link->getIsLinkType()) + return; + LLInventoryPanel *inventory_panel = mPanelOutfitsInventory->getActivePanel(); + if (inventory_panel) + { + LLFolderView *folder = inventory_panel->getRootFolder(); + LLFolderViewItem *outfit_folder = folder->getItemByID(outfit_link->getLinkedUUID()); + if (outfit_folder) + { + outfit_folder->setOpen(!outfit_folder->isOpen()); + folder->setSelectionFromRoot(outfit_folder,TRUE); + folder->scrollToShowSelection(); + } + } +} + +void LLSidepanelAppearance::onEditAppearanceButtonClicked() +{ + if (gAgentWearables.areWearablesLoaded()) + { + gAgent.changeCameraToCustomizeAvatar(); + } +} + +void LLSidepanelAppearance::onEditButtonClicked() +{ + toggleLookInfoPanel(FALSE); + toggleWearableEditPanel(TRUE, NULL); + /*if (mLookInfo->getVisible()) + { + } + else + { + mPanelOutfitsInventory->onEdit(); + }*/ +} + +void LLSidepanelAppearance::onNewOutfitButtonClicked() +{ + if (!mLookInfo->getVisible()) + { + mPanelOutfitsInventory->onNew(); + } +} + + +void LLSidepanelAppearance::onBackButtonClicked() +{ + toggleLookInfoPanel(FALSE); +} + +void LLSidepanelAppearance::onEditWearBackClicked() +{ + mEditWearable->saveChanges(); + toggleWearableEditPanel(FALSE, NULL); + toggleLookInfoPanel(TRUE); +} + +void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible) +{ + if (!mLookInfo) + return; + + mLookInfo->setVisible(visible); + mPanelOutfitsInventory->setVisible(!visible); + mFilterEditor->setVisible(!visible); + mWearBtn->setVisible(!visible); + mEditBtn->setVisible(!visible); + mNewOutfitBtn->setVisible(!visible); + mCurrOutfitPanel->setVisible(!visible); +} + +void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable) +{ + if (!wearable) + { + wearable = gAgentWearables.getWearable(WT_SHAPE, 0); + } + if (!mEditWearable || !wearable) + { + return; + } + + mEditWearable->setVisible(visible); + mFilterEditor->setVisible(!visible); + mPanelOutfitsInventory->setVisible(!visible); +} + +void LLSidepanelAppearance::updateVerbs() +{ + bool is_look_info_visible = mLookInfo->getVisible(); + + if (!is_look_info_visible) + { + const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); + mEditBtn->setEnabled(is_correct_type); + mWearBtn->setEnabled(is_correct_type); + } + else + { + mEditBtn->setEnabled(FALSE); + mWearBtn->setEnabled(FALSE); + } +} + +void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string name) +{ + if (name == "") + { + const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink(); + if (outfit_link) + { + const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory(); + if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + mCurrentLookName->setText(cat->getName()); + return; + } + } + mCurrentLookName->setText(getString("No Outfit")); + mOpenOutfitBtn->setEnabled(FALSE); + } + else + { + mCurrentLookName->setText(name); + // Can't just call update verbs since the folder link may not have been created yet. + mOpenOutfitBtn->setEnabled(TRUE); + } +} + +//static +void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data) +{ + LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data; + panel->toggleLookInfoPanel(FALSE); + panel->toggleWearableEditPanel(TRUE, wearable); +} + +// Fetch currently worn items and only enable the New Look button after everything's been +// fetched. Alternatively, we could stuff this logic into llagentwearables::makeNewOutfitLinks. +void LLSidepanelAppearance::fetchInventory() +{ + + mNewOutfitBtn->setEnabled(false); + LLInventoryFetchObserver::item_ref_t ids; + LLUUID item_id; + for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type) + { + // MULTI_WEARABLE: + item_id = gAgentWearables.getWearableItemID((EWearableType)type,0); + if(item_id.notNull()) + { + ids.push_back(item_id); + } + } + + 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); + } + } + } + + mFetchWorn->fetchItems(ids); + // If no items to be fetched, done will never be triggered. + // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition. + if (mFetchWorn->isEverythingComplete()) + { + mFetchWorn->done(); + } + else + { + gInventory.addObserver(mFetchWorn); + } +} + +void LLSidepanelAppearance::inventoryFetched() +{ + mNewOutfitBtn->setEnabled(true); +} diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h new file mode 100644 index 0000000000000000000000000000000000000000..b335fd910d9e2a9bc50b28bd3b61b4b2aa055fc2 --- /dev/null +++ b/indra/newview/llsidepanelappearance.h @@ -0,0 +1,103 @@ +/** + * @file llsidepanelappearance.h + * @brief Side Bar "Appearance" panel + * + * $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_LLSIDEPANELAPPEARANCE_H +#define LL_LLSIDEPANELAPPEARANCE_H + +#include "llpanel.h" +#include "llinventoryobserver.h" + +#include "llinventory.h" +#include "llpanellookinfo.h" + +class LLFilterEditor; +class LLCurrentlyWornFetchObserver; +class LLPanelEditWearable; +class LLWearable; +class LLPanelOutfitsInventory; + +class LLSidepanelAppearance : public LLPanel +{ +public: + LLSidepanelAppearance(); + virtual ~LLSidepanelAppearance(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + void refreshCurrentOutfitName(const std::string name = ""); + + static void editWearable(LLWearable *wearable, void *data); + + void fetchInventory(); + void inventoryFetched(); + void updateVerbs(); + +private: + void onFilterEdit(const std::string& search_string); + + void onOpenOutfitButtonClicked(); + void onEditAppearanceButtonClicked(); + void onWearButtonClicked(); + void onEditButtonClicked(); + void onNewOutfitButtonClicked(); + void onBackButtonClicked(); + void onEditWearBackClicked(); + void toggleLookInfoPanel(BOOL visible); + void toggleWearableEditPanel(BOOL visible, LLWearable* wearable); + + LLFilterEditor* mFilterEditor; + LLPanelOutfitsInventory* mPanelOutfitsInventory; + LLPanelLookInfo* mLookInfo; + LLPanelEditWearable* mEditWearable; + + LLButton* mOpenOutfitBtn; + LLButton* mEditAppearanceBtn; + LLButton* mWearBtn; + LLButton* mEditBtn; + LLButton* mNewOutfitBtn; + LLPanel* mCurrOutfitPanel; + + LLTextBox* mCurrentLookName; + + // Used to make sure the user's inventory is in memory. + LLCurrentlyWornFetchObserver* mFetchWorn; + + // Search string for filtering landmarks and teleport + // history locations + std::string mFilterSubString; + + // Information type currently shown in Look Information panel + std::string mLookInfoType; + +}; + +#endif //LL_LLSIDEPANELAPPEARANCE_H diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 6aa5c53194f5573a2d2391f2fdd82547fca34b38..824def3d92848be03ff790162ed3dd0ce8a2deb6 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -1,274 +1,279 @@ -/** - * @file LLSidepanelInventory.cpp - * @brief Side Bar "Inventory" panel - * - * $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 "llsidepanelinventory.h" - -#include "llagent.h" -#include "llbutton.h" -#include "llinventorybridge.h" -#include "llinventorypanel.h" -#include "llpanelmaininventory.h" -#include "llsidepaneliteminfo.h" -#include "llsidepaneltaskinfo.h" -#include "lltabcontainer.h" -#include "llselectmgr.h" - -static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); - -LLSidepanelInventory::LLSidepanelInventory() - : LLPanel(), - mItemPanel(NULL) -{ - - //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() -} - -LLSidepanelInventory::~LLSidepanelInventory() -{ -} - -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)); - - mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn"); - mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); - - mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn"); - mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); - - mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn"); - mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); - - mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn"); - mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); - - LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); - panel_main_inventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); - } - - // UI elements from item panel - { - mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel"); - - LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn"); - back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); - } - - // UI elements from task panel - { - mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel"); - if (mTaskPanel) - { - LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn"); - back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); - } - } - - return TRUE; -} - -void LLSidepanelInventory::onOpen(const LLSD& key) -{ - if(key.size() == 0) - return; - - mItemPanel->reset(); - - if (key.has("id")) - { - mItemPanel->setItemID(key["id"].asUUID()); - if (key.has("object")) - { - mItemPanel->setObjectID(key["object"].asUUID()); - } - showItemInfoPanel(); - } - if (key.has("task")) - { - if (mTaskPanel) - mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); - showTaskInfoPanel(); - } -} - -void LLSidepanelInventory::onInfoButtonClicked() -{ - LLInventoryItem *item = getSelectedItem(); - if (item) - { - mItemPanel->reset(); - mItemPanel->setItemID(item->getUUID()); - showItemInfoPanel(); - } -} - -void LLSidepanelInventory::onShareButtonClicked() -{ -} - -void LLSidepanelInventory::performActionOnSelection(const std::string &action) -{ - LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); - LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return; - } - current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action); -} - -void LLSidepanelInventory::onWearButtonClicked() -{ - performActionOnSelection("wear"); - performActionOnSelection("attach"); -} - -void LLSidepanelInventory::onPlayButtonClicked() -{ - performActionOnSelection("activate"); -} - -void LLSidepanelInventory::onTeleportButtonClicked() -{ - performActionOnSelection("teleport"); -} - -void LLSidepanelInventory::onOverflowButtonClicked() -{ -} - -void LLSidepanelInventory::onBackButtonClicked() -{ - showInventoryPanel(); -} - -void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) -{ - updateVerbs(); -} - -void LLSidepanelInventory::showItemInfoPanel() -{ - mItemPanel->setVisible(TRUE); - if (mTaskPanel) - mTaskPanel->setVisible(FALSE); - mInventoryPanel->setVisible(FALSE); - - mItemPanel->dirty(); - mItemPanel->setIsEditing(FALSE); -} - -void LLSidepanelInventory::showTaskInfoPanel() -{ - mItemPanel->setVisible(FALSE); - mInventoryPanel->setVisible(FALSE); - - if (mTaskPanel) - { - mTaskPanel->setVisible(TRUE); - mTaskPanel->dirty(); - mTaskPanel->setIsEditing(FALSE); - } -} - -void LLSidepanelInventory::showInventoryPanel() -{ - mItemPanel->setVisible(FALSE); - if (mTaskPanel) - mTaskPanel->setVisible(FALSE); - mInventoryPanel->setVisible(TRUE); - updateVerbs(); -} - -void LLSidepanelInventory::updateVerbs() -{ - mInfoBtn->setEnabled(FALSE); - mShareBtn->setEnabled(FALSE); - - mWearBtn->setVisible(FALSE); - mWearBtn->setEnabled(FALSE); - mPlayBtn->setVisible(FALSE); - mPlayBtn->setEnabled(FALSE); - mTeleportBtn->setVisible(FALSE); - mTeleportBtn->setEnabled(FALSE); - - const LLInventoryItem *item = getSelectedItem(); - if (!item) - return; - - mInfoBtn->setEnabled(TRUE); - mShareBtn->setEnabled(TRUE); - - switch(item->getInventoryType()) - { - case LLInventoryType::IT_WEARABLE: - case LLInventoryType::IT_OBJECT: - case LLInventoryType::IT_ATTACHMENT: - mWearBtn->setVisible(TRUE); - mWearBtn->setEnabled(TRUE); - break; - case LLInventoryType::IT_SOUND: - case LLInventoryType::IT_GESTURE: - case LLInventoryType::IT_ANIMATION: - mPlayBtn->setVisible(TRUE); - mPlayBtn->setEnabled(TRUE); - break; - case LLInventoryType::IT_LANDMARK: - mTeleportBtn->setVisible(TRUE); - mTeleportBtn->setEnabled(TRUE); - break; - default: - break; - } -} - -LLInventoryItem *LLSidepanelInventory::getSelectedItem() -{ - LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); - LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return NULL; - } - const LLUUID &item_id = current_item->getListener()->getUUID(); - LLInventoryItem *item = gInventory.getItem(item_id); - return item; -} +/** + * @file LLSidepanelInventory.cpp + * @brief Side Bar "Inventory" panel + * + * $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 "llsidepanelinventory.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llinventorybridge.h" +#include "llinventorypanel.h" +#include "llpanelmaininventory.h" +#include "llsidepaneliteminfo.h" +#include "llsidepaneltaskinfo.h" +#include "lltabcontainer.h" +#include "llselectmgr.h" + +static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); + +LLSidepanelInventory::LLSidepanelInventory() + : LLPanel(), + mItemPanel(NULL), + mPanelMainInventory(NULL) +{ + + //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() +} + +LLSidepanelInventory::~LLSidepanelInventory() +{ +} + +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)); + + mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn"); + mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); + + mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn"); + mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); + + mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn"); + mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); + + mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn"); + mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); + + mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); + } + + // UI elements from item panel + { + mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel"); + + LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + } + + // UI elements from task panel + { + mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel"); + if (mTaskPanel) + { + LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + } + } + + return TRUE; +} + +void LLSidepanelInventory::onOpen(const LLSD& key) +{ + if(key.size() == 0) + return; + + mItemPanel->reset(); + + if (key.has("id")) + { + mItemPanel->setItemID(key["id"].asUUID()); + if (key.has("object")) + { + mItemPanel->setObjectID(key["object"].asUUID()); + } + showItemInfoPanel(); + } + if (key.has("task")) + { + if (mTaskPanel) + mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); + showTaskInfoPanel(); + } + if (key.has("select")) + { + mPanelMainInventory->getPanel()->setSelection(key["select"].asUUID(), TAKE_FOCUS_NO); + } +} + +void LLSidepanelInventory::onInfoButtonClicked() +{ + LLInventoryItem *item = getSelectedItem(); + if (item) + { + mItemPanel->reset(); + mItemPanel->setItemID(item->getUUID()); + showItemInfoPanel(); + } +} + +void LLSidepanelInventory::onShareButtonClicked() +{ +} + +void LLSidepanelInventory::performActionOnSelection(const std::string &action) +{ + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action); +} + +void LLSidepanelInventory::onWearButtonClicked() +{ + performActionOnSelection("wear"); + performActionOnSelection("attach"); +} + +void LLSidepanelInventory::onPlayButtonClicked() +{ + performActionOnSelection("activate"); +} + +void LLSidepanelInventory::onTeleportButtonClicked() +{ + performActionOnSelection("teleport"); +} + +void LLSidepanelInventory::onOverflowButtonClicked() +{ +} + +void LLSidepanelInventory::onBackButtonClicked() +{ + showInventoryPanel(); +} + +void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) +{ + updateVerbs(); +} + +void LLSidepanelInventory::showItemInfoPanel() +{ + mItemPanel->setVisible(TRUE); + if (mTaskPanel) + mTaskPanel->setVisible(FALSE); + mInventoryPanel->setVisible(FALSE); + + mItemPanel->dirty(); + mItemPanel->setIsEditing(FALSE); +} + +void LLSidepanelInventory::showTaskInfoPanel() +{ + mItemPanel->setVisible(FALSE); + mInventoryPanel->setVisible(FALSE); + + if (mTaskPanel) + { + mTaskPanel->setVisible(TRUE); + mTaskPanel->dirty(); + mTaskPanel->setIsEditing(FALSE); + } +} + +void LLSidepanelInventory::showInventoryPanel() +{ + mItemPanel->setVisible(FALSE); + if (mTaskPanel) + mTaskPanel->setVisible(FALSE); + mInventoryPanel->setVisible(TRUE); + updateVerbs(); +} + +void LLSidepanelInventory::updateVerbs() +{ + mInfoBtn->setEnabled(FALSE); + mShareBtn->setEnabled(FALSE); + + mWearBtn->setVisible(FALSE); + mWearBtn->setEnabled(FALSE); + mPlayBtn->setVisible(FALSE); + mPlayBtn->setEnabled(FALSE); + mTeleportBtn->setVisible(FALSE); + mTeleportBtn->setEnabled(FALSE); + + const LLInventoryItem *item = getSelectedItem(); + if (!item) + return; + + mInfoBtn->setEnabled(TRUE); + mShareBtn->setEnabled(TRUE); + + switch(item->getInventoryType()) + { + case LLInventoryType::IT_WEARABLE: + case LLInventoryType::IT_OBJECT: + case LLInventoryType::IT_ATTACHMENT: + mWearBtn->setVisible(TRUE); + mWearBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_SOUND: + case LLInventoryType::IT_GESTURE: + case LLInventoryType::IT_ANIMATION: + mPlayBtn->setVisible(TRUE); + mPlayBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_LANDMARK: + mTeleportBtn->setVisible(TRUE); + mTeleportBtn->setEnabled(TRUE); + break; + default: + break; + } +} + +LLInventoryItem *LLSidepanelInventory::getSelectedItem() +{ + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return NULL; + } + const LLUUID &item_id = current_item->getListener()->getUUID(); + LLInventoryItem *item = gInventory.getItem(item_id); + return item; +} diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 681af7fafabc0e418f6f45c95a31f3dfad599acd..6aa9cc745fba2047decb07ee5970432094155016 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -1,90 +1,91 @@ -/** - * @file LLSidepanelInventory.h - * @brief Side Bar "Inventory" panel - * - * $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_LLSIDEPANELINVENTORY_H -#define LL_LLSIDEPANELINVENTORY_H - -#include "llpanel.h" - -class LLFolderViewItem; -class LLInventoryItem; -class LLPanelMainInventory; -class LLSidepanelItemInfo; -class LLSidepanelTaskInfo; - -class LLSidepanelInventory : public LLPanel -{ -public: - LLSidepanelInventory(); - virtual ~LLSidepanelInventory(); - - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - -protected: - // Tracks highlighted (selected) item in inventory panel. - LLInventoryItem *getSelectedItem(); - void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); - // "wear", "teleport", etc. - void performActionOnSelection(const std::string &action); - - void showItemInfoPanel(); - void showTaskInfoPanel(); - void showInventoryPanel(); - void updateVerbs(); - - // - // UI Elements - // -private: - LLPanel* mInventoryPanel; // Main inventory view - LLSidepanelItemInfo* mItemPanel; // Individual item view - LLSidepanelTaskInfo* mTaskPanel; // Individual in-world object view - -protected: - void onInfoButtonClicked(); - void onShareButtonClicked(); - void onWearButtonClicked(); - void onPlayButtonClicked(); - void onTeleportButtonClicked(); - void onOverflowButtonClicked(); - void onBackButtonClicked(); -private: - LLButton* mInfoBtn; - LLButton* mShareBtn; - LLButton* mWearBtn; - LLButton* mPlayBtn; - LLButton* mTeleportBtn; - LLButton* mOverflowBtn; - -}; - -#endif //LL_LLSIDEPANELINVENTORY_H +/** + * @file LLSidepanelInventory.h + * @brief Side Bar "Inventory" panel + * + * $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_LLSIDEPANELINVENTORY_H +#define LL_LLSIDEPANELINVENTORY_H + +#include "llpanel.h" + +class LLFolderViewItem; +class LLInventoryItem; +class LLPanelMainInventory; +class LLSidepanelItemInfo; +class LLSidepanelTaskInfo; + +class LLSidepanelInventory : public LLPanel +{ +public: + LLSidepanelInventory(); + virtual ~LLSidepanelInventory(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +protected: + // Tracks highlighted (selected) item in inventory panel. + LLInventoryItem *getSelectedItem(); + void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); + // "wear", "teleport", etc. + void performActionOnSelection(const std::string &action); + + void showItemInfoPanel(); + void showTaskInfoPanel(); + void showInventoryPanel(); + void updateVerbs(); + + // + // UI Elements + // +private: + LLPanel* mInventoryPanel; // Main inventory view + LLSidepanelItemInfo* mItemPanel; // Individual item view + LLSidepanelTaskInfo* mTaskPanel; // Individual in-world object view + LLPanelMainInventory* mPanelMainInventory; + +protected: + void onInfoButtonClicked(); + void onShareButtonClicked(); + void onWearButtonClicked(); + void onPlayButtonClicked(); + void onTeleportButtonClicked(); + void onOverflowButtonClicked(); + void onBackButtonClicked(); +private: + LLButton* mInfoBtn; + LLButton* mShareBtn; + LLButton* mWearBtn; + LLButton* mPlayBtn; + LLButton* mTeleportBtn; + LLButton* mOverflowBtn; + +}; + +#endif //LL_LLSIDEPANELINVENTORY_H diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp index 162198f1c55c193b19f786d5160b28eed87d9260..23931defdd2295e8df10e578c096dccb11547aec 100644 --- a/indra/newview/llsidepanelinventorysubpanel.cpp +++ b/indra/newview/llsidepanelinventorysubpanel.cpp @@ -1,155 +1,155 @@ -/** - * @file llsidepanelinventorysubpanel.cpp - * @brief A floater which shows an inventory item's properties. - * - * $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 "llsidepanelinventorysubpanel.h" - -#include "roles_constants.h" - -#include "llagent.h" -#include "llavataractions.h" -#include "llbutton.h" -#include "llfloaterreg.h" -#include "llgroupactions.h" -#include "llinventorymodel.h" -#include "lllineeditor.h" -#include "llradiogroup.h" -#include "llviewercontrol.h" -#include "llviewerinventory.h" -#include "llviewerobjectlist.h" - - -///---------------------------------------------------------------------------- -/// Class LLSidepanelInventorySubpanel -///---------------------------------------------------------------------------- - -// Default constructor -LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel() - : LLPanel(), - mIsDirty(TRUE), - mIsEditing(FALSE), - mEditBtn(NULL), - mCancelBtn(NULL), - mSaveBtn(NULL) -{ -} - -// Destroys the object -LLSidepanelInventorySubpanel::~LLSidepanelInventorySubpanel() -{ -} - -// virtual -BOOL LLSidepanelInventorySubpanel::postBuild() -{ - mEditBtn = getChild<LLButton>("edit_btn"); - mEditBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onEditButtonClicked, this)); - - mSaveBtn = getChild<LLButton>("save_btn"); - mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onSaveButtonClicked, this)); - - mCancelBtn = getChild<LLButton>("cancel_btn"); - mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onCancelButtonClicked, this)); - return TRUE; -} - -void LLSidepanelInventorySubpanel::setVisible(BOOL visible) -{ - if (visible) - { - dirty(); - } - LLPanel::setVisible(visible); -} - -void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit) -{ - mIsEditing = edit; - mIsDirty = TRUE; -} - -BOOL LLSidepanelInventorySubpanel::getIsEditing() const -{ - return mIsEditing; -} - -void LLSidepanelInventorySubpanel::reset() -{ - mIsDirty = TRUE; -} - -void LLSidepanelInventorySubpanel::draw() -{ - if (mIsDirty) - { - mIsDirty = FALSE; - refresh(); - updateVerbs(); - } - - LLPanel::draw(); -} - -void LLSidepanelInventorySubpanel::dirty() -{ - mIsDirty = TRUE; - setIsEditing(FALSE); -} - -void LLSidepanelInventorySubpanel::updateVerbs() -{ - mEditBtn->setVisible(!mIsEditing); - mSaveBtn->setVisible(mIsEditing); - mCancelBtn->setVisible(mIsEditing); -} - -void LLSidepanelInventorySubpanel::onEditButtonClicked() -{ - setIsEditing(TRUE); - refresh(); - updateVerbs(); -} - -void LLSidepanelInventorySubpanel::onSaveButtonClicked() -{ - save(); - setIsEditing(FALSE); - refresh(); - updateVerbs(); -} - -void LLSidepanelInventorySubpanel::onCancelButtonClicked() -{ - setIsEditing(FALSE); - refresh(); - updateVerbs(); -} +/** + * @file llsidepanelinventorysubpanel.cpp + * @brief A floater which shows an inventory item's properties. + * + * $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 "llsidepanelinventorysubpanel.h" + +#include "roles_constants.h" + +#include "llagent.h" +#include "llavataractions.h" +#include "llbutton.h" +#include "llfloaterreg.h" +#include "llgroupactions.h" +#include "llinventorymodel.h" +#include "lllineeditor.h" +#include "llradiogroup.h" +#include "llviewercontrol.h" +#include "llviewerinventory.h" +#include "llviewerobjectlist.h" + + +///---------------------------------------------------------------------------- +/// Class LLSidepanelInventorySubpanel +///---------------------------------------------------------------------------- + +// Default constructor +LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel() + : LLPanel(), + mIsDirty(TRUE), + mIsEditing(FALSE), + mEditBtn(NULL), + mCancelBtn(NULL), + mSaveBtn(NULL) +{ +} + +// Destroys the object +LLSidepanelInventorySubpanel::~LLSidepanelInventorySubpanel() +{ +} + +// virtual +BOOL LLSidepanelInventorySubpanel::postBuild() +{ + mEditBtn = getChild<LLButton>("edit_btn"); + mEditBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onEditButtonClicked, this)); + + mSaveBtn = getChild<LLButton>("save_btn"); + mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onSaveButtonClicked, this)); + + mCancelBtn = getChild<LLButton>("cancel_btn"); + mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onCancelButtonClicked, this)); + return TRUE; +} + +void LLSidepanelInventorySubpanel::setVisible(BOOL visible) +{ + if (visible) + { + dirty(); + } + LLPanel::setVisible(visible); +} + +void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit) +{ + mIsEditing = edit; + mIsDirty = TRUE; +} + +BOOL LLSidepanelInventorySubpanel::getIsEditing() const +{ + return mIsEditing; +} + +void LLSidepanelInventorySubpanel::reset() +{ + mIsDirty = TRUE; +} + +void LLSidepanelInventorySubpanel::draw() +{ + if (mIsDirty) + { + mIsDirty = FALSE; + refresh(); + updateVerbs(); + } + + LLPanel::draw(); +} + +void LLSidepanelInventorySubpanel::dirty() +{ + mIsDirty = TRUE; + setIsEditing(FALSE); +} + +void LLSidepanelInventorySubpanel::updateVerbs() +{ + mEditBtn->setVisible(!mIsEditing); + mSaveBtn->setVisible(mIsEditing); + mCancelBtn->setVisible(mIsEditing); +} + +void LLSidepanelInventorySubpanel::onEditButtonClicked() +{ + setIsEditing(TRUE); + refresh(); + updateVerbs(); +} + +void LLSidepanelInventorySubpanel::onSaveButtonClicked() +{ + save(); + setIsEditing(FALSE); + refresh(); + updateVerbs(); +} + +void LLSidepanelInventorySubpanel::onCancelButtonClicked() +{ + setIsEditing(FALSE); + refresh(); + updateVerbs(); +} diff --git a/indra/newview/llsidepanelinventorysubpanel.h b/indra/newview/llsidepanelinventorysubpanel.h index 6503887cd1a97f79c0623627a92b3ff7699c1b04..a74f4fdee61120100deba01f7c58c92606026b3c 100644 --- a/indra/newview/llsidepanelinventorysubpanel.h +++ b/indra/newview/llsidepanelinventorysubpanel.h @@ -1,82 +1,82 @@ -/** - * @file llsidepanelinventorysubpanel.h - * @brief A panel which shows an inventory item's properties. - * - * $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_LLSIDEPANELINVENTORYSUBPANEL_H -#define LL_LLSIDEPANELINVENTORYSUBPANEL_H - -#include "llpanel.h" - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLSidepanelInventorySubpanel -// Base class for inventory sidepanel panels (e.g. item info, task info). -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLButton; -class LLInventoryItem; - -class LLSidepanelInventorySubpanel : public LLPanel -{ -public: - LLSidepanelInventorySubpanel(); - virtual ~LLSidepanelInventorySubpanel(); - - /*virtual*/ void setVisible(BOOL visible); - virtual BOOL postBuild(); - virtual void draw(); - virtual void reset(); - - void dirty(); - void setIsEditing(BOOL edit); -protected: - virtual void refresh() = 0; - virtual void save() = 0; - virtual void updateVerbs(); - - BOOL getIsEditing() const; - - // - // UI Elements - // -protected: - void onEditButtonClicked(); - void onSaveButtonClicked(); - void onCancelButtonClicked(); - LLButton* mEditBtn; - LLButton* mSaveBtn; - LLButton* mCancelBtn; - -private: - BOOL mIsDirty; // item properties need to be updated - BOOL mIsEditing; // if we're in edit mode -}; - -#endif // LL_LLSIDEPANELINVENTORYSUBPANEL_H +/** + * @file llsidepanelinventorysubpanel.h + * @brief A panel which shows an inventory item's properties. + * + * $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_LLSIDEPANELINVENTORYSUBPANEL_H +#define LL_LLSIDEPANELINVENTORYSUBPANEL_H + +#include "llpanel.h" + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLSidepanelInventorySubpanel +// Base class for inventory sidepanel panels (e.g. item info, task info). +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLButton; +class LLInventoryItem; + +class LLSidepanelInventorySubpanel : public LLPanel +{ +public: + LLSidepanelInventorySubpanel(); + virtual ~LLSidepanelInventorySubpanel(); + + /*virtual*/ void setVisible(BOOL visible); + virtual BOOL postBuild(); + virtual void draw(); + virtual void reset(); + + void dirty(); + void setIsEditing(BOOL edit); +protected: + virtual void refresh() = 0; + virtual void save() = 0; + virtual void updateVerbs(); + + BOOL getIsEditing() const; + + // + // UI Elements + // +protected: + void onEditButtonClicked(); + void onSaveButtonClicked(); + void onCancelButtonClicked(); + LLButton* mEditBtn; + LLButton* mSaveBtn; + LLButton* mCancelBtn; + +private: + BOOL mIsDirty; // item properties need to be updated + BOOL mIsEditing; // if we're in edit mode +}; + +#endif // LL_LLSIDEPANELINVENTORYSUBPANEL_H diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 9d2960fbed15ce00021ba7946baa104c6283b66c..5081c33f8e27c78aaa7806f781d75d2d3c8ef090 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -1,882 +1,883 @@ -/** - * @file llsidepaneliteminfo.cpp - * @brief A floater which shows an inventory item's properties. - * - * $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 "llsidepaneliteminfo.h" - -#include "roles_constants.h" - -#include "llagent.h" -#include "llavataractions.h" -#include "llbutton.h" -#include "llfloaterreg.h" -#include "llgroupactions.h" -#include "llinventorymodel.h" -#include "lllineeditor.h" -#include "llradiogroup.h" -#include "llviewercontrol.h" -#include "llviewerinventory.h" -#include "llviewerobjectlist.h" - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLItemPropertiesObserver -// -// Helper class to watch for changes to the item. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLItemPropertiesObserver : public LLInventoryObserver -{ -public: - LLItemPropertiesObserver(LLSidepanelItemInfo* floater) - : mFloater(floater) - { - gInventory.addObserver(this); - } - virtual ~LLItemPropertiesObserver() - { - gInventory.removeObserver(this); - } - virtual void changed(U32 mask); -private: - LLSidepanelItemInfo* mFloater; -}; - -void LLItemPropertiesObserver::changed(U32 mask) -{ - // if there's a change we're interested in. - if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) - { - mFloater->dirty(); - } -} - - - -///---------------------------------------------------------------------------- -/// Class LLSidepanelItemInfo -///---------------------------------------------------------------------------- - -static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info"); - -// Default constructor -LLSidepanelItemInfo::LLSidepanelItemInfo() - : mItemID(LLUUID::null) -{ - mPropertiesObserver = new LLItemPropertiesObserver(this); - - //LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml"); -} - -// Destroys the object -LLSidepanelItemInfo::~LLSidepanelItemInfo() -{ - delete mPropertiesObserver; - mPropertiesObserver = NULL; -} - -// virtual -BOOL LLSidepanelItemInfo::postBuild() -{ - LLSidepanelInventorySubpanel::postBuild(); - - // build the UI - // item name & description - childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidatePrintableNotPipe); - //getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); - childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidatePrintableNotPipe); - //getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); - - // Creator information - getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this)); - - // owner information - getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this)); - - refresh(); - return TRUE; -} - -void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id) -{ - mObjectID = object_id; -} - -void LLSidepanelItemInfo::setItemID(const LLUUID& item_id) -{ - mItemID = item_id; -} - -void LLSidepanelItemInfo::reset() -{ - LLSidepanelInventorySubpanel::reset(); - - mObjectID = LLUUID::null; - mItemID = LLUUID::null; -} - -void LLSidepanelItemInfo::refresh() -{ - LLInventoryItem* item = findItem(); - if(item) - { - refreshFromItem(item); - updateVerbs(); - } - else - { - if (getIsEditing()) - { - setIsEditing(FALSE); - return; - } - } - - if (!getIsEditing()) - { - const std::string no_item_names[]={ - "LabelItemName", - "LabelItemDesc", - "LabelCreatorName", - "LabelOwnerName", - "CheckOwnerModify", - "CheckOwnerCopy", - "CheckOwnerTransfer", - "CheckShareWithGroup", - "CheckEveryoneCopy", - "CheckNextOwnerModify", - "CheckNextOwnerCopy", - "CheckNextOwnerTransfer", - "CheckPurchase", - "RadioSaleType", - "Edit Cost" - }; - - for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t) - { - childSetEnabled(no_item_names[t],false); - } - - const std::string hide_names[]={ - "BaseMaskDebug", - "OwnerMaskDebug", - "GroupMaskDebug", - "EveryoneMaskDebug", - "NextMaskDebug" - }; - for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t) - { - childSetVisible(hide_names[t],false); - } - } - - if (!item) - { - const std::string no_edit_mode_names[]={ - "BtnCreator", - "BtnOwner", - }; - for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t) - { - childSetEnabled(no_edit_mode_names[t],false); - } - } - - updateVerbs(); -} - -void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item) -{ - //////////////////////// - // PERMISSIONS LOOKUP // - //////////////////////// - - // do not enable the UI for incomplete items. - LLViewerInventoryItem* i = (LLViewerInventoryItem*)item; - BOOL is_complete = i->isComplete(); - const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType()); - const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD); - const LLPermissions& perm = item->getPermissions(); - const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm, - GP_OBJECT_MANIPULATE); - const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm, - GP_OBJECT_SET_SALE) && - !cannot_restrict_permissions; - const BOOL is_link = i->getIsLinkType(); - - // You need permission to modify the object to modify an inventory - // item in it. - LLViewerObject* object = NULL; - if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID); - BOOL is_obj_modify = TRUE; - if(object) - { - is_obj_modify = object->permOwnerModify(); - } - - ////////////////////// - // ITEM NAME & DESC // - ////////////////////// - BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, - GP_OBJECT_MANIPULATE) - && is_obj_modify && is_complete; - - childSetEnabled("LabelItemNameTitle",TRUE); - childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards - childSetText("LabelItemName",item->getName()); - childSetEnabled("LabelItemDescTitle",TRUE); - childSetEnabled("LabelItemDesc",is_modifiable); - childSetVisible("IconLocked",!is_modifiable); - childSetText("LabelItemDesc",item->getDescription()); - - ////////////////// - // CREATOR NAME // - ////////////////// - if(!gCacheName) return; - if(!gAgent.getRegion()) return; - - if (item->getCreatorUUID().notNull()) - { - std::string name; - gCacheName->getFullName(item->getCreatorUUID(), name); - childSetEnabled("BtnCreator",TRUE); - childSetEnabled("LabelCreatorTitle",TRUE); - childSetEnabled("LabelCreatorName",TRUE); - childSetText("LabelCreatorName",name); - } - else - { - childSetEnabled("BtnCreator",FALSE); - childSetEnabled("LabelCreatorTitle",FALSE); - childSetEnabled("LabelCreatorName",FALSE); - childSetText("LabelCreatorName",getString("unknown")); - } - - //////////////// - // OWNER NAME // - //////////////// - if(perm.isOwned()) - { - std::string name; - if (perm.isGroupOwned()) - { - gCacheName->getGroupName(perm.getGroup(), name); - } - else - { - gCacheName->getFullName(perm.getOwner(), name); - } - childSetEnabled("BtnOwner",TRUE); - childSetEnabled("LabelOwnerTitle",TRUE); - childSetEnabled("LabelOwnerName",TRUE); - childSetText("LabelOwnerName",name); - } - else - { - childSetEnabled("BtnOwner",FALSE); - childSetEnabled("LabelOwnerTitle",FALSE); - childSetEnabled("LabelOwnerName",FALSE); - childSetText("LabelOwnerName",getString("public")); - } - - ////////////////// - // ACQUIRE DATE // - ////////////////// - - time_t time_utc = item->getCreationDate(); - if (0 == time_utc) - { - childSetText("LabelAcquiredDate",getString("unknown")); - } - else - { - std::string timeStr = getString("acquiredDate"); - LLSD substitution; - substitution["datetime"] = (S32) time_utc; - LLStringUtil::format (timeStr, substitution); - childSetText ("LabelAcquiredDate", timeStr); - } - - /////////////////////// - // OWNER PERMISSIONS // - /////////////////////// - if(can_agent_manipulate) - { - childSetText("OwnerLabel",getString("you_can")); - } - else - { - childSetText("OwnerLabel",getString("owner_can")); - } - - U32 base_mask = perm.getMaskBase(); - U32 owner_mask = perm.getMaskOwner(); - U32 group_mask = perm.getMaskGroup(); - U32 everyone_mask = perm.getMaskEveryone(); - U32 next_owner_mask = perm.getMaskNextOwner(); - - childSetEnabled("OwnerLabel",TRUE); - childSetEnabled("CheckOwnerModify",FALSE); - childSetValue("CheckOwnerModify",LLSD((BOOL)(owner_mask & PERM_MODIFY))); - childSetEnabled("CheckOwnerCopy",FALSE); - childSetValue("CheckOwnerCopy",LLSD((BOOL)(owner_mask & PERM_COPY))); - childSetEnabled("CheckOwnerTransfer",FALSE); - childSetValue("CheckOwnerTransfer",LLSD((BOOL)(owner_mask & PERM_TRANSFER))); - - /////////////////////// - // DEBUG PERMISSIONS // - /////////////////////// - - if( gSavedSettings.getBOOL("DebugPermissions") ) - { - BOOL slam_perm = FALSE; - BOOL overwrite_group = FALSE; - BOOL overwrite_everyone = FALSE; - - 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; - } - - std::string perm_string; - - perm_string = "B: "; - perm_string += mask_to_string(base_mask); - childSetText("BaseMaskDebug",perm_string); - childSetVisible("BaseMaskDebug",TRUE); - - perm_string = "O: "; - perm_string += mask_to_string(owner_mask); - childSetText("OwnerMaskDebug",perm_string); - childSetVisible("OwnerMaskDebug",TRUE); - - perm_string = "G"; - perm_string += overwrite_group ? "*: " : ": "; - perm_string += mask_to_string(group_mask); - childSetText("GroupMaskDebug",perm_string); - childSetVisible("GroupMaskDebug",TRUE); - - perm_string = "E"; - perm_string += overwrite_everyone ? "*: " : ": "; - perm_string += mask_to_string(everyone_mask); - childSetText("EveryoneMaskDebug",perm_string); - childSetVisible("EveryoneMaskDebug",TRUE); - - perm_string = "N"; - perm_string += slam_perm ? "*: " : ": "; - perm_string += mask_to_string(next_owner_mask); - childSetText("NextMaskDebug",perm_string); - childSetVisible("NextMaskDebug",TRUE); - } - else - { - childSetVisible("BaseMaskDebug",FALSE); - childSetVisible("OwnerMaskDebug",FALSE); - childSetVisible("GroupMaskDebug",FALSE); - childSetVisible("EveryoneMaskDebug",FALSE); - childSetVisible("NextMaskDebug",FALSE); - } - - ///////////// - // SHARING // - ///////////// - - // Check for ability to change values. - if (is_link || cannot_restrict_permissions) - { - childSetEnabled("CheckShareWithGroup",FALSE); - childSetEnabled("CheckEveryoneCopy",FALSE); - } - else if (is_obj_modify && can_agent_manipulate) - { - childSetEnabled("CheckShareWithGroup",TRUE); - childSetEnabled("CheckEveryoneCopy",(owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER)); - } - else - { - childSetEnabled("CheckShareWithGroup",FALSE); - childSetEnabled("CheckEveryoneCopy",FALSE); - } - - // Set values. - BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE; - BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE; - BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE; - - if (is_group_copy && is_group_modify && is_group_move) - { - childSetValue("CheckShareWithGroup",LLSD((BOOL)TRUE)); - - LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); - if(ctl) - { - ctl->setTentative(FALSE); - } - } - else if (!is_group_copy && !is_group_modify && !is_group_move) - { - childSetValue("CheckShareWithGroup",LLSD((BOOL)FALSE)); - LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); - if(ctl) - { - ctl->setTentative(FALSE); - } - } - else - { - LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); - if(ctl) - { - ctl->setTentative(TRUE); - ctl->set(TRUE); - } - } - - childSetValue("CheckEveryoneCopy",LLSD((BOOL)(everyone_mask & PERM_COPY))); - - /////////////// - // SALE INFO // - /////////////// - - const LLSaleInfo& sale_info = item->getSaleInfo(); - BOOL is_for_sale = sale_info.isForSale(); - // Check for ability to change values. - if (is_obj_modify && can_agent_sell - && gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE)) - { - childSetEnabled("SaleLabel",is_complete); - childSetEnabled("CheckPurchase",is_complete); - - childSetEnabled("NextOwnerLabel",TRUE); - childSetEnabled("CheckNextOwnerModify",(base_mask & PERM_MODIFY) && !cannot_restrict_permissions); - childSetEnabled("CheckNextOwnerCopy",(base_mask & PERM_COPY) && !cannot_restrict_permissions); - childSetEnabled("CheckNextOwnerTransfer",(next_owner_mask & PERM_COPY) && !cannot_restrict_permissions); - - childSetEnabled("RadioSaleType",is_complete && is_for_sale); - childSetEnabled("TextPrice",is_complete && is_for_sale); - childSetEnabled("Edit Cost",is_complete && is_for_sale); - } - else - { - childSetEnabled("SaleLabel",FALSE); - childSetEnabled("CheckPurchase",FALSE); - - childSetEnabled("NextOwnerLabel",FALSE); - childSetEnabled("CheckNextOwnerModify",FALSE); - childSetEnabled("CheckNextOwnerCopy",FALSE); - childSetEnabled("CheckNextOwnerTransfer",FALSE); - - childSetEnabled("RadioSaleType",FALSE); - childSetEnabled("TextPrice",FALSE); - childSetEnabled("Edit Cost",FALSE); - } - - // Set values. - childSetValue("CheckPurchase", is_for_sale); - childSetEnabled("combobox sale copy", is_for_sale); - childSetEnabled("Edit Cost", is_for_sale); - childSetValue("CheckNextOwnerModify",LLSD(BOOL(next_owner_mask & PERM_MODIFY))); - childSetValue("CheckNextOwnerCopy",LLSD(BOOL(next_owner_mask & PERM_COPY))); - childSetValue("CheckNextOwnerTransfer",LLSD(BOOL(next_owner_mask & PERM_TRANSFER))); - - LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType"); - if (is_for_sale) - { - radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1); - S32 numerical_price; - numerical_price = sale_info.getSalePrice(); - childSetText("Edit Cost",llformat("%d",numerical_price)); - } - else - { - radioSaleType->setSelectedIndex(-1); - childSetText("Edit Cost",llformat("%d",0)); - } -} - -void LLSidepanelItemInfo::onClickCreator() -{ - LLInventoryItem* item = findItem(); - if(!item) return; - if(!item->getCreatorUUID().isNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } -} - -// static -void LLSidepanelItemInfo::onClickOwner() -{ - LLInventoryItem* item = findItem(); - if(!item) return; - if(item->getPermissions().isGroupOwned()) - { - LLGroupActions::show(item->getPermissions().getGroup()); - } - else - { - LLAvatarActions::showProfile(item->getPermissions().getOwner()); - } -} - -// static -void LLSidepanelItemInfo::onCommitName() -{ - //llinfos << "LLSidepanelItemInfo::onCommitName()" << llendl; - LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); - if(!item) - { - return; - } - LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName"); - - if(labelItemName&& - (item->getName() != labelItemName->getText()) && - (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) ) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(labelItemName->getText()); - if(mObjectID.isNull()) - { - new_item->updateServer(FALSE); - gInventory.updateItem(new_item); - gInventory.notifyObservers(); - } - else - { - LLViewerObject* object = gObjectList.findObject(mObjectID); - if(object) - { - object->updateInventory( - new_item, - TASK_INVENTORY_ITEM_KEY, - false); - } - } - } -} - -void LLSidepanelItemInfo::onCommitDescription() -{ - //llinfos << "LLSidepanelItemInfo::onCommitDescription()" << llendl; - LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); - if(!item) return; - - LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc"); - if(!labelItemDesc) - { - return; - } - if((item->getDescription() != labelItemDesc->getText()) && - (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - - new_item->setDescription(labelItemDesc->getText()); - if(mObjectID.isNull()) - { - new_item->updateServer(FALSE); - gInventory.updateItem(new_item); - gInventory.notifyObservers(); - } - else - { - LLViewerObject* object = gObjectList.findObject(mObjectID); - if(object) - { - object->updateInventory( - new_item, - TASK_INVENTORY_ITEM_KEY, - false); - } - } - } -} - -// static -void LLSidepanelItemInfo::onCommitPermissions() -{ - //llinfos << "LLSidepanelItemInfo::onCommitPermissions()" << llendl; - LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); - if(!item) return; - LLPermissions perm(item->getPermissions()); - - - LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); - - if(CheckShareWithGroup) - { - perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(), - CheckShareWithGroup->get(), - PERM_MODIFY | PERM_MOVE | PERM_COPY); - } - LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy"); - if(CheckEveryoneCopy) - { - perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(), - CheckEveryoneCopy->get(), PERM_COPY); - } - - LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify"); - if(CheckNextOwnerModify) - { - perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), - CheckNextOwnerModify->get(), PERM_MODIFY); - } - LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy"); - if(CheckNextOwnerCopy) - { - perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), - CheckNextOwnerCopy->get(), PERM_COPY); - } - LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer"); - if(CheckNextOwnerTransfer) - { - perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), - CheckNextOwnerTransfer->get(), PERM_TRANSFER); - } - if(perm != item->getPermissions() - && item->isComplete()) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setPermissions(perm); - U32 flags = new_item->getFlags(); - // If next owner permissions have changed (and this is an object) - // then set the slam permissions flag so that they are applied on rez. - if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner()) - && (item->getType() == LLAssetType::AT_OBJECT)) - { - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; - } - // If everyone permissions have changed (and this is an object) - // then set the overwrite everyone permissions flag so they - // are applied on rez. - if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone()) - && (item->getType() == LLAssetType::AT_OBJECT)) - { - flags |= LLInventoryItem::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 - // are applied on rez. - if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup()) - && (item->getType() == LLAssetType::AT_OBJECT)) - { - flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; - } - new_item->setFlags(flags); - if(mObjectID.isNull()) - { - new_item->updateServer(FALSE); - gInventory.updateItem(new_item); - gInventory.notifyObservers(); - } - else - { - LLViewerObject* object = gObjectList.findObject(mObjectID); - if(object) - { - object->updateInventory( - new_item, - TASK_INVENTORY_ITEM_KEY, - false); - } - } - } - else - { - // need to make sure we don't just follow the click - refresh(); - } -} - -// static -void LLSidepanelItemInfo::onCommitSaleInfo() -{ - //llinfos << "LLSidepanelItemInfo::onCommitSaleInfo()" << llendl; - updateSaleInfo(); -} - -// static -void LLSidepanelItemInfo::onCommitSaleType() -{ - //llinfos << "LLSidepanelItemInfo::onCommitSaleType()" << llendl; - updateSaleInfo(); -} - -void LLSidepanelItemInfo::updateSaleInfo() -{ - LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); - if(!item) return; - LLSaleInfo sale_info(item->getSaleInfo()); - if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE)) - { - childSetValue("CheckPurchase",LLSD((BOOL)FALSE)); - } - - if((BOOL)childGetValue("CheckPurchase")) - { - // turn on sale info - LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY; - - LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType"); - if(RadioSaleType) - { - switch (RadioSaleType->getSelectedIndex()) - { - case 0: - sale_type = LLSaleInfo::FS_ORIGINAL; - break; - case 1: - sale_type = LLSaleInfo::FS_COPY; - break; - case 2: - sale_type = LLSaleInfo::FS_CONTENTS; - break; - default: - sale_type = LLSaleInfo::FS_COPY; - break; - } - } - - if (sale_type == LLSaleInfo::FS_COPY - && !gAgent.allowOperation(PERM_COPY, item->getPermissions(), - GP_OBJECT_SET_SALE)) - { - sale_type = LLSaleInfo::FS_ORIGINAL; - } - - - - S32 price = -1; - price = getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();; - - // Invalid data - turn off the sale - if (price < 0) - { - sale_type = LLSaleInfo::FS_NOT; - price = 0; - } - - sale_info.setSaleType(sale_type); - sale_info.setSalePrice(price); - } - else - { - sale_info.setSaleType(LLSaleInfo::FS_NOT); - } - if(sale_info != item->getSaleInfo() - && item->isComplete()) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - - // Force an update on the sale price at rez - if (item->getType() == LLAssetType::AT_OBJECT) - { - U32 flags = new_item->getFlags(); - flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE; - new_item->setFlags(flags); - } - - new_item->setSaleInfo(sale_info); - if(mObjectID.isNull()) - { - // This is in the agent's inventory. - new_item->updateServer(FALSE); - gInventory.updateItem(new_item); - gInventory.notifyObservers(); - } - else - { - // This is in an object's contents. - LLViewerObject* object = gObjectList.findObject(mObjectID); - if(object) - { - object->updateInventory( - new_item, - TASK_INVENTORY_ITEM_KEY, - false); - } - } - } - else - { - // need to make sure we don't just follow the click - refresh(); - } -} - -LLInventoryItem* LLSidepanelItemInfo::findItem() const -{ - LLInventoryItem* item = NULL; - if(mObjectID.isNull()) - { - // it is in agent inventory - item = gInventory.getItem(mItemID); - } - else - { - LLViewerObject* object = gObjectList.findObject(mObjectID); - if(object) - { - item = (LLInventoryItem*)object->getInventoryObject(mItemID); - } - } - return item; -} - -// virtual -void LLSidepanelItemInfo::updateVerbs() -{ - LLSidepanelInventorySubpanel::updateVerbs(); - - const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); - if (item) - { - const LLPermissions& perm = item->getPermissions(); - BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, - GP_OBJECT_MANIPULATE); - mEditBtn->setEnabled(is_modifiable); - } -} - -// virtual -void LLSidepanelItemInfo::save() -{ - onCommitName(); - onCommitDescription(); - onCommitPermissions(); - onCommitSaleInfo(); - onCommitSaleType(); -} +/** + * @file llsidepaneliteminfo.cpp + * @brief A floater which shows an inventory item's properties. + * + * $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 "llsidepaneliteminfo.h" + +#include "roles_constants.h" + +#include "llagent.h" +#include "llavataractions.h" +#include "llbutton.h" +#include "llfloaterreg.h" +#include "llgroupactions.h" +#include "llinventorymodel.h" +#include "llinventoryobserver.h" +#include "lllineeditor.h" +#include "llradiogroup.h" +#include "llviewercontrol.h" +#include "llviewerinventory.h" +#include "llviewerobjectlist.h" + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLItemPropertiesObserver +// +// Helper class to watch for changes to the item. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLItemPropertiesObserver : public LLInventoryObserver +{ +public: + LLItemPropertiesObserver(LLSidepanelItemInfo* floater) + : mFloater(floater) + { + gInventory.addObserver(this); + } + virtual ~LLItemPropertiesObserver() + { + gInventory.removeObserver(this); + } + virtual void changed(U32 mask); +private: + LLSidepanelItemInfo* mFloater; +}; + +void LLItemPropertiesObserver::changed(U32 mask) +{ + // if there's a change we're interested in. + if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) + { + mFloater->dirty(); + } +} + + + +///---------------------------------------------------------------------------- +/// Class LLSidepanelItemInfo +///---------------------------------------------------------------------------- + +static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info"); + +// Default constructor +LLSidepanelItemInfo::LLSidepanelItemInfo() + : mItemID(LLUUID::null) +{ + mPropertiesObserver = new LLItemPropertiesObserver(this); + + //LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml"); +} + +// Destroys the object +LLSidepanelItemInfo::~LLSidepanelItemInfo() +{ + delete mPropertiesObserver; + mPropertiesObserver = NULL; +} + +// virtual +BOOL LLSidepanelItemInfo::postBuild() +{ + LLSidepanelInventorySubpanel::postBuild(); + + // build the UI + // item name & description + childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + //getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); + childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + //getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); + + // Creator information + getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this)); + + // owner information + getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this)); + + refresh(); + return TRUE; +} + +void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id) +{ + mObjectID = object_id; +} + +void LLSidepanelItemInfo::setItemID(const LLUUID& item_id) +{ + mItemID = item_id; +} + +void LLSidepanelItemInfo::reset() +{ + LLSidepanelInventorySubpanel::reset(); + + mObjectID = LLUUID::null; + mItemID = LLUUID::null; +} + +void LLSidepanelItemInfo::refresh() +{ + LLInventoryItem* item = findItem(); + if(item) + { + refreshFromItem(item); + updateVerbs(); + } + else + { + if (getIsEditing()) + { + setIsEditing(FALSE); + return; + } + } + + if (!getIsEditing()) + { + const std::string no_item_names[]={ + "LabelItemName", + "LabelItemDesc", + "LabelCreatorName", + "LabelOwnerName", + "CheckOwnerModify", + "CheckOwnerCopy", + "CheckOwnerTransfer", + "CheckShareWithGroup", + "CheckEveryoneCopy", + "CheckNextOwnerModify", + "CheckNextOwnerCopy", + "CheckNextOwnerTransfer", + "CheckPurchase", + "RadioSaleType", + "Edit Cost" + }; + + for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t) + { + childSetEnabled(no_item_names[t],false); + } + + const std::string hide_names[]={ + "BaseMaskDebug", + "OwnerMaskDebug", + "GroupMaskDebug", + "EveryoneMaskDebug", + "NextMaskDebug" + }; + for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t) + { + childSetVisible(hide_names[t],false); + } + } + + if (!item) + { + const std::string no_edit_mode_names[]={ + "BtnCreator", + "BtnOwner", + }; + for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t) + { + childSetEnabled(no_edit_mode_names[t],false); + } + } + + updateVerbs(); +} + +void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item) +{ + //////////////////////// + // PERMISSIONS LOOKUP // + //////////////////////// + + // do not enable the UI for incomplete items. + LLViewerInventoryItem* i = (LLViewerInventoryItem*)item; + BOOL is_complete = i->isComplete(); + const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType()); + const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD); + const LLPermissions& perm = item->getPermissions(); + const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm, + GP_OBJECT_MANIPULATE); + const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm, + GP_OBJECT_SET_SALE) && + !cannot_restrict_permissions; + const BOOL is_link = i->getIsLinkType(); + + // You need permission to modify the object to modify an inventory + // item in it. + LLViewerObject* object = NULL; + if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID); + BOOL is_obj_modify = TRUE; + if(object) + { + is_obj_modify = object->permOwnerModify(); + } + + ////////////////////// + // ITEM NAME & DESC // + ////////////////////// + BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, + GP_OBJECT_MANIPULATE) + && is_obj_modify && is_complete; + + childSetEnabled("LabelItemNameTitle",TRUE); + childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards + childSetText("LabelItemName",item->getName()); + childSetEnabled("LabelItemDescTitle",TRUE); + childSetEnabled("LabelItemDesc",is_modifiable); + childSetVisible("IconLocked",!is_modifiable); + childSetText("LabelItemDesc",item->getDescription()); + + ////////////////// + // CREATOR NAME // + ////////////////// + if(!gCacheName) return; + if(!gAgent.getRegion()) return; + + if (item->getCreatorUUID().notNull()) + { + std::string name; + gCacheName->getFullName(item->getCreatorUUID(), name); + childSetEnabled("BtnCreator",TRUE); + childSetEnabled("LabelCreatorTitle",TRUE); + childSetEnabled("LabelCreatorName",TRUE); + childSetText("LabelCreatorName",name); + } + else + { + childSetEnabled("BtnCreator",FALSE); + childSetEnabled("LabelCreatorTitle",FALSE); + childSetEnabled("LabelCreatorName",FALSE); + childSetText("LabelCreatorName",getString("unknown")); + } + + //////////////// + // OWNER NAME // + //////////////// + if(perm.isOwned()) + { + std::string name; + if (perm.isGroupOwned()) + { + gCacheName->getGroupName(perm.getGroup(), name); + } + else + { + gCacheName->getFullName(perm.getOwner(), name); + } + childSetEnabled("BtnOwner",TRUE); + childSetEnabled("LabelOwnerTitle",TRUE); + childSetEnabled("LabelOwnerName",TRUE); + childSetText("LabelOwnerName",name); + } + else + { + childSetEnabled("BtnOwner",FALSE); + childSetEnabled("LabelOwnerTitle",FALSE); + childSetEnabled("LabelOwnerName",FALSE); + childSetText("LabelOwnerName",getString("public")); + } + + ////////////////// + // ACQUIRE DATE // + ////////////////// + + time_t time_utc = item->getCreationDate(); + if (0 == time_utc) + { + childSetText("LabelAcquiredDate",getString("unknown")); + } + else + { + std::string timeStr = getString("acquiredDate"); + LLSD substitution; + substitution["datetime"] = (S32) time_utc; + LLStringUtil::format (timeStr, substitution); + childSetText ("LabelAcquiredDate", timeStr); + } + + /////////////////////// + // OWNER PERMISSIONS // + /////////////////////// + if(can_agent_manipulate) + { + childSetText("OwnerLabel",getString("you_can")); + } + else + { + childSetText("OwnerLabel",getString("owner_can")); + } + + U32 base_mask = perm.getMaskBase(); + U32 owner_mask = perm.getMaskOwner(); + U32 group_mask = perm.getMaskGroup(); + U32 everyone_mask = perm.getMaskEveryone(); + U32 next_owner_mask = perm.getMaskNextOwner(); + + childSetEnabled("OwnerLabel",TRUE); + childSetEnabled("CheckOwnerModify",FALSE); + childSetValue("CheckOwnerModify",LLSD((BOOL)(owner_mask & PERM_MODIFY))); + childSetEnabled("CheckOwnerCopy",FALSE); + childSetValue("CheckOwnerCopy",LLSD((BOOL)(owner_mask & PERM_COPY))); + childSetEnabled("CheckOwnerTransfer",FALSE); + childSetValue("CheckOwnerTransfer",LLSD((BOOL)(owner_mask & PERM_TRANSFER))); + + /////////////////////// + // DEBUG PERMISSIONS // + /////////////////////// + + if( gSavedSettings.getBOOL("DebugPermissions") ) + { + BOOL slam_perm = FALSE; + BOOL overwrite_group = FALSE; + BOOL overwrite_everyone = FALSE; + + 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; + } + + std::string perm_string; + + perm_string = "B: "; + perm_string += mask_to_string(base_mask); + childSetText("BaseMaskDebug",perm_string); + childSetVisible("BaseMaskDebug",TRUE); + + perm_string = "O: "; + perm_string += mask_to_string(owner_mask); + childSetText("OwnerMaskDebug",perm_string); + childSetVisible("OwnerMaskDebug",TRUE); + + perm_string = "G"; + perm_string += overwrite_group ? "*: " : ": "; + perm_string += mask_to_string(group_mask); + childSetText("GroupMaskDebug",perm_string); + childSetVisible("GroupMaskDebug",TRUE); + + perm_string = "E"; + perm_string += overwrite_everyone ? "*: " : ": "; + perm_string += mask_to_string(everyone_mask); + childSetText("EveryoneMaskDebug",perm_string); + childSetVisible("EveryoneMaskDebug",TRUE); + + perm_string = "N"; + perm_string += slam_perm ? "*: " : ": "; + perm_string += mask_to_string(next_owner_mask); + childSetText("NextMaskDebug",perm_string); + childSetVisible("NextMaskDebug",TRUE); + } + else + { + childSetVisible("BaseMaskDebug",FALSE); + childSetVisible("OwnerMaskDebug",FALSE); + childSetVisible("GroupMaskDebug",FALSE); + childSetVisible("EveryoneMaskDebug",FALSE); + childSetVisible("NextMaskDebug",FALSE); + } + + ///////////// + // SHARING // + ///////////// + + // Check for ability to change values. + if (is_link || cannot_restrict_permissions) + { + childSetEnabled("CheckShareWithGroup",FALSE); + childSetEnabled("CheckEveryoneCopy",FALSE); + } + else if (is_obj_modify && can_agent_manipulate) + { + childSetEnabled("CheckShareWithGroup",TRUE); + childSetEnabled("CheckEveryoneCopy",(owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER)); + } + else + { + childSetEnabled("CheckShareWithGroup",FALSE); + childSetEnabled("CheckEveryoneCopy",FALSE); + } + + // Set values. + BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE; + BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE; + BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE; + + if (is_group_copy && is_group_modify && is_group_move) + { + childSetValue("CheckShareWithGroup",LLSD((BOOL)TRUE)); + + LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + if(ctl) + { + ctl->setTentative(FALSE); + } + } + else if (!is_group_copy && !is_group_modify && !is_group_move) + { + childSetValue("CheckShareWithGroup",LLSD((BOOL)FALSE)); + LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + if(ctl) + { + ctl->setTentative(FALSE); + } + } + else + { + LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + if(ctl) + { + ctl->setTentative(TRUE); + ctl->set(TRUE); + } + } + + childSetValue("CheckEveryoneCopy",LLSD((BOOL)(everyone_mask & PERM_COPY))); + + /////////////// + // SALE INFO // + /////////////// + + const LLSaleInfo& sale_info = item->getSaleInfo(); + BOOL is_for_sale = sale_info.isForSale(); + // Check for ability to change values. + if (is_obj_modify && can_agent_sell + && gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE)) + { + childSetEnabled("SaleLabel",is_complete); + childSetEnabled("CheckPurchase",is_complete); + + childSetEnabled("NextOwnerLabel",TRUE); + childSetEnabled("CheckNextOwnerModify",(base_mask & PERM_MODIFY) && !cannot_restrict_permissions); + childSetEnabled("CheckNextOwnerCopy",(base_mask & PERM_COPY) && !cannot_restrict_permissions); + childSetEnabled("CheckNextOwnerTransfer",(next_owner_mask & PERM_COPY) && !cannot_restrict_permissions); + + childSetEnabled("RadioSaleType",is_complete && is_for_sale); + childSetEnabled("TextPrice",is_complete && is_for_sale); + childSetEnabled("Edit Cost",is_complete && is_for_sale); + } + else + { + childSetEnabled("SaleLabel",FALSE); + childSetEnabled("CheckPurchase",FALSE); + + childSetEnabled("NextOwnerLabel",FALSE); + childSetEnabled("CheckNextOwnerModify",FALSE); + childSetEnabled("CheckNextOwnerCopy",FALSE); + childSetEnabled("CheckNextOwnerTransfer",FALSE); + + childSetEnabled("RadioSaleType",FALSE); + childSetEnabled("TextPrice",FALSE); + childSetEnabled("Edit Cost",FALSE); + } + + // Set values. + childSetValue("CheckPurchase", is_for_sale); + childSetEnabled("combobox sale copy", is_for_sale); + childSetEnabled("Edit Cost", is_for_sale); + childSetValue("CheckNextOwnerModify",LLSD(BOOL(next_owner_mask & PERM_MODIFY))); + childSetValue("CheckNextOwnerCopy",LLSD(BOOL(next_owner_mask & PERM_COPY))); + childSetValue("CheckNextOwnerTransfer",LLSD(BOOL(next_owner_mask & PERM_TRANSFER))); + + LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType"); + if (is_for_sale) + { + radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1); + S32 numerical_price; + numerical_price = sale_info.getSalePrice(); + childSetText("Edit Cost",llformat("%d",numerical_price)); + } + else + { + radioSaleType->setSelectedIndex(-1); + childSetText("Edit Cost",llformat("%d",0)); + } +} + +void LLSidepanelItemInfo::onClickCreator() +{ + LLInventoryItem* item = findItem(); + if(!item) return; + if(!item->getCreatorUUID().isNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } +} + +// static +void LLSidepanelItemInfo::onClickOwner() +{ + LLInventoryItem* item = findItem(); + if(!item) return; + if(item->getPermissions().isGroupOwned()) + { + LLGroupActions::show(item->getPermissions().getGroup()); + } + else + { + LLAvatarActions::showProfile(item->getPermissions().getOwner()); + } +} + +// static +void LLSidepanelItemInfo::onCommitName() +{ + //llinfos << "LLSidepanelItemInfo::onCommitName()" << llendl; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) + { + return; + } + LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName"); + + if(labelItemName&& + (item->getName() != labelItemName->getText()) && + (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) ) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(labelItemName->getText()); + if(mObjectID.isNull()) + { + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } +} + +void LLSidepanelItemInfo::onCommitDescription() +{ + //llinfos << "LLSidepanelItemInfo::onCommitDescription()" << llendl; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) return; + + LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc"); + if(!labelItemDesc) + { + return; + } + if((item->getDescription() != labelItemDesc->getText()) && + (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + + new_item->setDescription(labelItemDesc->getText()); + if(mObjectID.isNull()) + { + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } +} + +// static +void LLSidepanelItemInfo::onCommitPermissions() +{ + //llinfos << "LLSidepanelItemInfo::onCommitPermissions()" << llendl; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) return; + LLPermissions perm(item->getPermissions()); + + + LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + + if(CheckShareWithGroup) + { + perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(), + CheckShareWithGroup->get(), + PERM_MODIFY | PERM_MOVE | PERM_COPY); + } + LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy"); + if(CheckEveryoneCopy) + { + perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(), + CheckEveryoneCopy->get(), PERM_COPY); + } + + LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify"); + if(CheckNextOwnerModify) + { + perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), + CheckNextOwnerModify->get(), PERM_MODIFY); + } + LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy"); + if(CheckNextOwnerCopy) + { + perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), + CheckNextOwnerCopy->get(), PERM_COPY); + } + LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer"); + if(CheckNextOwnerTransfer) + { + perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), + CheckNextOwnerTransfer->get(), PERM_TRANSFER); + } + if(perm != item->getPermissions() + && item->isComplete()) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->setPermissions(perm); + U32 flags = new_item->getFlags(); + // If next owner permissions have changed (and this is an object) + // then set the slam permissions flag so that they are applied on rez. + if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner()) + && (item->getType() == LLAssetType::AT_OBJECT)) + { + flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + } + // If everyone permissions have changed (and this is an object) + // then set the overwrite everyone permissions flag so they + // are applied on rez. + if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone()) + && (item->getType() == LLAssetType::AT_OBJECT)) + { + flags |= LLInventoryItem::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 + // are applied on rez. + if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup()) + && (item->getType() == LLAssetType::AT_OBJECT)) + { + flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + } + new_item->setFlags(flags); + if(mObjectID.isNull()) + { + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } + else + { + // need to make sure we don't just follow the click + refresh(); + } +} + +// static +void LLSidepanelItemInfo::onCommitSaleInfo() +{ + //llinfos << "LLSidepanelItemInfo::onCommitSaleInfo()" << llendl; + updateSaleInfo(); +} + +// static +void LLSidepanelItemInfo::onCommitSaleType() +{ + //llinfos << "LLSidepanelItemInfo::onCommitSaleType()" << llendl; + updateSaleInfo(); +} + +void LLSidepanelItemInfo::updateSaleInfo() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) return; + LLSaleInfo sale_info(item->getSaleInfo()); + if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE)) + { + childSetValue("CheckPurchase",LLSD((BOOL)FALSE)); + } + + if((BOOL)childGetValue("CheckPurchase")) + { + // turn on sale info + LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY; + + LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType"); + if(RadioSaleType) + { + switch (RadioSaleType->getSelectedIndex()) + { + case 0: + sale_type = LLSaleInfo::FS_ORIGINAL; + break; + case 1: + sale_type = LLSaleInfo::FS_COPY; + break; + case 2: + sale_type = LLSaleInfo::FS_CONTENTS; + break; + default: + sale_type = LLSaleInfo::FS_COPY; + break; + } + } + + if (sale_type == LLSaleInfo::FS_COPY + && !gAgent.allowOperation(PERM_COPY, item->getPermissions(), + GP_OBJECT_SET_SALE)) + { + sale_type = LLSaleInfo::FS_ORIGINAL; + } + + + + S32 price = -1; + price = getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();; + + // Invalid data - turn off the sale + if (price < 0) + { + sale_type = LLSaleInfo::FS_NOT; + price = 0; + } + + sale_info.setSaleType(sale_type); + sale_info.setSalePrice(price); + } + else + { + sale_info.setSaleType(LLSaleInfo::FS_NOT); + } + if(sale_info != item->getSaleInfo() + && item->isComplete()) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + + // Force an update on the sale price at rez + if (item->getType() == LLAssetType::AT_OBJECT) + { + U32 flags = new_item->getFlags(); + flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE; + new_item->setFlags(flags); + } + + new_item->setSaleInfo(sale_info); + if(mObjectID.isNull()) + { + // This is in the agent's inventory. + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + // This is in an object's contents. + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } + else + { + // need to make sure we don't just follow the click + refresh(); + } +} + +LLInventoryItem* LLSidepanelItemInfo::findItem() const +{ + LLInventoryItem* item = NULL; + if(mObjectID.isNull()) + { + // it is in agent inventory + item = gInventory.getItem(mItemID); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + item = (LLInventoryItem*)object->getInventoryObject(mItemID); + } + } + return item; +} + +// virtual +void LLSidepanelItemInfo::updateVerbs() +{ + LLSidepanelInventorySubpanel::updateVerbs(); + + const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if (item) + { + const LLPermissions& perm = item->getPermissions(); + BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, + GP_OBJECT_MANIPULATE); + mEditBtn->setEnabled(is_modifiable); + } +} + +// virtual +void LLSidepanelItemInfo::save() +{ + onCommitName(); + onCommitDescription(); + onCommitPermissions(); + onCommitSaleInfo(); + onCommitSaleType(); +} diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index b348b5cceba2b5cdaa46b64b36c7978ff21c44b0..4bfbd56ea795096409c9bf13d3fd87dbc88f3c0b 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -1,91 +1,91 @@ -/** - * @file llsidepaneliteminfo.h - * @brief A panel which shows an inventory item's properties. - * - * $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_LLSIDEPANELITEMINFO_H -#define LL_LLSIDEPANELITEMINFO_H - -#include "llsidepanelinventorysubpanel.h" - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLSidepanelItemInfo -// Object properties for inventory side panel. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -class LLButton; -class LLInventoryItem; -class LLItemPropertiesObserver; -class LLViewerObject; -class LLPermissions; - -class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel -{ -public: - LLSidepanelItemInfo(); - virtual ~LLSidepanelItemInfo(); - - /*virtual*/ BOOL postBuild(); - /*virtual*/ void reset(); - - void setObjectID(const LLUUID& object_id); - void setItemID(const LLUUID& item_id); - void setEditMode(BOOL edit); - -protected: - /*virtual*/ void refresh(); - /*virtual*/ void save(); - /*virtual*/ void updateVerbs(); - - LLInventoryItem* findItem() const; - LLViewerObject* findObject() const; - - void refreshFromItem(LLInventoryItem* item); - -private: - LLUUID mItemID; // inventory UUID for the inventory item. - LLUUID mObjectID; // in-world task UUID, or null if in agent inventory. - LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item - - // - // UI Elements - // -protected: - void onClickCreator(); - void onClickOwner(); - void onCommitName(); - void onCommitDescription(); - void onCommitPermissions(); - void onCommitSaleInfo(); - void onCommitSaleType(); - void updateSaleInfo(); -}; - -#endif // LL_LLSIDEPANELITEMINFO_H +/** + * @file llsidepaneliteminfo.h + * @brief A panel which shows an inventory item's properties. + * + * $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_LLSIDEPANELITEMINFO_H +#define LL_LLSIDEPANELITEMINFO_H + +#include "llsidepanelinventorysubpanel.h" + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLSidepanelItemInfo +// Object properties for inventory side panel. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLButton; +class LLInventoryItem; +class LLItemPropertiesObserver; +class LLViewerObject; +class LLPermissions; + +class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel +{ +public: + LLSidepanelItemInfo(); + virtual ~LLSidepanelItemInfo(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void reset(); + + void setObjectID(const LLUUID& object_id); + void setItemID(const LLUUID& item_id); + void setEditMode(BOOL edit); + +protected: + /*virtual*/ void refresh(); + /*virtual*/ void save(); + /*virtual*/ void updateVerbs(); + + LLInventoryItem* findItem() const; + LLViewerObject* findObject() const; + + void refreshFromItem(LLInventoryItem* item); + +private: + LLUUID mItemID; // inventory UUID for the inventory item. + LLUUID mObjectID; // in-world task UUID, or null if in agent inventory. + LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item + + // + // UI Elements + // +protected: + void onClickCreator(); + void onClickOwner(); + void onCommitName(); + void onCommitDescription(); + void onCommitPermissions(); + void onCommitSaleInfo(); + void onCommitSaleType(); + void updateSaleInfo(); +}; + +#endif // LL_LLSIDEPANELITEMINFO_H diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 01c832d7d565c7b0db37b8eb29702b7161fffc44..4396cce545142f7646ca6bf0eb66e2fc2a0f73a3 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -100,8 +100,8 @@ BOOL LLSidepanelTaskInfo::postBuild() mBuyBtn = getChild<LLButton>("buy_btn"); mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this)); - childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe); - childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe); + childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe); // getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this)); // childSetAction("button deed",LLSidepanelTaskInfo::onClickDeedToGroup,this); diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index c3da246039aacb4dd9572ecbfe8936c8cb48f859..ee5fa46c9cacd302850c94cb9f07c36e13272be8 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -34,6 +34,7 @@ #include "lltextbox.h" +#include "llagent.h" #include "llbottomtray.h" #include "llsidetray.h" #include "llviewerwindow.h" @@ -354,7 +355,8 @@ bool LLSideTray::selectTabByName (const std::string& name) return true; } -LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback) +LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,const std::string& tooltip, + LLUICtrl::commit_callback_t callback) { static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>()); @@ -375,6 +377,9 @@ LLButton* LLSideTray::createButton (const std::string& name,const std::string& i LLButton* button = LLUICtrlFactory::create<LLButton> (bparams); button->setLabel(name); button->setClickedCallback(callback); + + if(tooltip!="Home") + button->setToolTip(tooltip); if(image.length()) { @@ -413,28 +418,44 @@ void LLSideTray::createButtons () // change if the home screen becomes its own tab. if (name == "sidebar_home") { - mCollapseButton = createButton("",sidebar_tab->mImage, + mCollapseButton = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(), boost::bind(&LLSideTray::onToggleCollapse, this)); } else { - LLButton* button = createButton("",sidebar_tab->mImage, + LLButton* button = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(), boost::bind(&LLSideTray::onTabButtonClick, this, name)); mTabButtons[name] = button; } } } +void LLSideTray::processTriState () +{ + if(mCollapsed) + expandSideBar(); + else + { +#if 0 // *TODO: EXT-2092 + + // Tell the active task panel to switch to its default view + // or collapse side tray if already on the default view. + LLSD info; + info["task-panel-action"] = "handle-tri-state"; + mActiveTab->notifyChildren(info); +#else + collapseSideBar(); +#endif + } +} + void LLSideTray::onTabButtonClick(string name) { LLSideTrayTab* side_bar = getTab(name); if(side_bar == mActiveTab) { - if(mCollapsed) - expandSideBar(); - else - collapseSideBar(); + processTriState (); return; } selectTabByName (name); @@ -634,6 +655,24 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para return NULL; } +LLPanel* LLSideTray::getPanel (const std::string& panel_name) +{ + child_vector_const_iter_t child_it; + for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + { + LLView* view = (*child_it)->findChildView(panel_name,true); + if(view) + { + LLPanel* panel = dynamic_cast<LLPanel*>(view); + if(panel) + { + return panel; + } + } + } + return NULL; +} + // *TODO: Eliminate magic constants. static const S32 fake_offset = 132; static const S32 fake_top_offset = 18; @@ -643,7 +682,7 @@ void LLSideTray::updateSidetrayVisibility() // set visibility of parent container based on collapsed state if (getParent()) { - getParent()->setVisible(!mCollapsed); + getParent()->setVisible(!mCollapsed && !gAgent.cameraMouselook()); } } diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 4d6081e230c386781f542c975983a23e924795e1..73215746819f36b4468ab451bc960fdc8d045b5d 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -36,8 +36,8 @@ #include "llpanel.h" #include "string" -class LLSideTrayTab; class LLAccordionCtrl; +class LLSideTrayTab; // added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions // while disconnecting viewer in LLAppViewer::disconnectViewer(). @@ -97,6 +97,11 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> LLPanel* showPanel (const std::string& panel_name, const LLSD& params); /* + * get the panel (don't show it or do anything else with it) + */ + LLPanel* getPanel (const std::string& panel_name); + + /* * collapse SideBar, hiding visible tab and moving tab buttons * to the right corner of the screen */ @@ -115,7 +120,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> void setVisible(BOOL visible) { - LLPanel::setVisible(visible); + if (getParent()) getParent()->setVisible(visible); } LLPanel* getButtonsPanel() { return mButtonsPanel; } @@ -134,20 +139,21 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE); + void processTriState (); + + void updateSidetrayVisibility(); + protected: LLSideTrayTab* getTab (const std::string& name); void createButtons (); - LLButton* createButton (const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback); + LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip, + LLUICtrl::commit_callback_t callback); void arrange (); void reflectCollapseChange(); void toggleTabButton (LLSideTrayTab* tab); - void updateSidetrayVisibility(); - - - private: // Implementation of LLDestroyClass<LLSideTray> static void destroyClass() @@ -157,7 +163,6 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> LLSideTray::getInstance()->setEnabled(FALSE); } - private: LLPanel* mButtonsPanel; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 8c5439d47ea624916188f0304e545abbc7b44f98..6ca67345984c475b8b87bbc08f859718604b44f6 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -435,7 +435,7 @@ void LLSpatialGroup::clearDrawMap() BOOL LLSpatialGroup::isRecentlyVisible() const { - return (LLDrawable::getCurrentFrame() - (S32)mVisible) < LLDrawable::getMinVisFrameRange() ; + return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ; } BOOL LLSpatialGroup::isVisible() const diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 57ea018f2540c833bb9a19dfe6fbdb30d2fc35f8..54f776ca6a7fa5253e228375a5a189b59cf282bd 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -133,6 +133,37 @@ LLSpeakButton::~LLSpeakButton() LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); } +void LLSpeakButton::setSpeakToolTip(const std::string& msg) +{ + mSpeakBtn->setToolTip(msg); +} + +void LLSpeakButton::setShowToolTip(const std::string& msg) +{ + mShowBtn->setToolTip(msg); +} + +void LLSpeakButton::setLabelVisible(bool visible) +{ + static std::string label_selected = mSpeakBtn->getLabelSelected(); + static std::string label_unselected = mSpeakBtn->getLabelUnselected(); + + if (visible) + { + mSpeakBtn->setLabelSelected(label_selected); + mSpeakBtn->setLabelUnselected(label_unselected); + } + else + { + static LLStringExplicit empty_string(""); + mSpeakBtn->setLabelSelected(empty_string); + mSpeakBtn->setLabelUnselected(empty_string); + } +} + +////////////////////////////////////////////////////////////////////////// +/// PROTECTED SECTION +////////////////////////////////////////////////////////////////////////// void LLSpeakButton::onMouseDown_SpeakBtn() { bool down = true; diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index e213c562dd820c5781e234208b14c395a865fa3c..424ee5357a440f7dc6f28897bae4a491099bdde7 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -62,6 +62,23 @@ class LLSpeakButton : public LLUICtrl /*virtual*/ ~LLSpeakButton(); /*virtual*/ void draw(); + // *HACK: Need to put tooltips in a translatable location, + // the panel that contains this button. + void setSpeakToolTip(const std::string& msg); + void setShowToolTip(const std::string& msg); + + /** + * Sets visibility of speak button's label according to passed parameter. + * + * It removes label/selected label if "visible" is false and restores otherwise. + * + * @param visible if true - show label and selected label. + * + * @see mSpeakBtn + * @see LLBottomTray::processShrinkButtons() + */ + void setLabelVisible(bool visible); + protected: friend class LLUICtrlFactory; LLSpeakButton(const Params& p); diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 2ed82b7d621c1b8be82159dee900538fd2f0c226..261bdbcfc05833b57611c03bc3c829583b619562 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -359,6 +359,9 @@ void LLSpeakerMgr::updateSpeakerList() LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id) { + //In some conditions map causes crash if it is empty(Windows only), adding check (EK) + if (mSpeakers.size() == 0) + return NULL; speaker_map_t::iterator found_it = mSpeakers.find(speaker_id); if (found_it == mSpeakers.end()) { diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 2c1f468f77abc9761d5aab8391e81178d5ae7839..736be677104a9bd486513a1c439215c42e8229d2 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -873,6 +873,9 @@ bool idle_startup() 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 @@ -1386,7 +1389,7 @@ bool idle_startup() // Make sure agent knows correct aspect ratio // FOV limits depend upon aspect ratio so this needs to happen before initializing the FOV below - LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeight()); + LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeightRaw()); LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio()); // Initialize FOV LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle")); @@ -1688,8 +1691,11 @@ bool idle_startup() //all categories loaded. lets create "My Favorites" category gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true); - // lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies - LLFriendCardsManager::instance().syncFriendsFolder(); + // Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder, + // fetches their contents if needed and synchronizes it with buddies list. + // If the folders are not found they are created. + LLFriendCardsManager::instance().syncFriendCardsFolders(); + // set up callbacks llinfos << "Registering Callbacks" << llendl; @@ -1900,9 +1906,6 @@ bool idle_startup() //DEV-17797. get null folder. Any items found here moved to Lost and Found LLInventoryModel::findLostItems(); - //DEV-10530. do cleanup. remove at some later date. jan-2009 - LLFloaterPreference::cleanupBadSetting(); - LLStartUp::setStartupState( STATE_PRECACHE ); timeout.reset(); return FALSE; @@ -2122,7 +2125,7 @@ void login_show() BOOL bUseDebugLogin = TRUE; #endif - LLPanelLogin::show( gViewerWindow->getVirtualWindowRect(), + LLPanelLogin::show( gViewerWindow->getWindowRectScaled(), bUseDebugLogin, login_callback, NULL ); @@ -2150,7 +2153,7 @@ void login_callback(S32 option, void *userdata) LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); return; } - else if (QUIT_OPTION == option) + 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; @@ -2478,7 +2481,7 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("AvatarPicksReply", &LLAvatarPropertiesProcessor::processAvatarPicksReply); msg->setHandlerFunc("AvatarClassifiedReply", - &LLAvatarPropertiesProcessor::processAvatarClassifiedReply); + &LLAvatarPropertiesProcessor::processAvatarClassifiedsReply); msg->setHandlerFuncFast(_PREHASH_CreateGroupReply, LLGroupMgr::processCreateGroupReply); @@ -2543,7 +2546,8 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply); msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply); - msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply); +// msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply); + msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply); msg->setHandlerFunc("ParcelInfoReply", LLRemoteParcelInfoProcessor::processParcelInfoReply); msg->setHandlerFunc("ScriptDialog", process_script_dialog); msg->setHandlerFunc("LoadURL", process_load_url); @@ -2629,10 +2633,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, } else { - LLAppearanceManager::wearOutfitByName(outfit_folder_name); + LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name); } - LLAppearanceManager::wearOutfitByName(gestures); - LLAppearanceManager::wearOutfitByName(COMMON_GESTURES_FOLDER); + LLAppearanceManager::instance().wearOutfitByName(gestures); + LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER); // This is really misnamed -- it means we have started loading // an outfit/shape that will give the avatar a gender eventually. JC diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 4dccdfd7e6c275ec535a8448e3e16de9f42847e7..b649a0c38ebd45243f9dea3073b3d1f534dfec43 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -109,6 +109,7 @@ const S32 TEXT_HEIGHT = 18; static void onClickBuyCurrency(void*); static void onClickHealth(void*); static void onClickScriptDebug(void*); +static void onClickVolume(void*); std::vector<std::string> LLStatusBar::sDays; std::vector<std::string> LLStatusBar::sMonths; @@ -116,6 +117,12 @@ const U32 LLStatusBar::MAX_DATE_STRING_LENGTH = 2000; LLStatusBar::LLStatusBar(const LLRect& rect) : LLPanel(), + mTextHealth(NULL), + mTextTime(NULL), + mSGBandwidth(NULL), + mSGPacketLoss(NULL), + mBtnBuyCurrency(NULL), + mBtnVolume(NULL), mBalance(0), mHealth(100), mSquareMetersCredit(0), @@ -148,6 +155,11 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mBtnBuyCurrency = getChild<LLButton>( "buycurrency" ); mBtnBuyCurrency->setClickedCallback( onClickBuyCurrency, this ); + mBtnVolume = getChild<LLButton>( "volume_btn" ); + mBtnVolume->setClickedCallback( onClickVolume, this ); + + gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); + childSetAction("scriptout", onClickScriptDebug, this); childSetAction("health", onClickHealth, this); @@ -333,6 +345,10 @@ void LLStatusBar::refresh() mSGBandwidth->setVisible(net_stats_visible); mSGPacketLoss->setVisible(net_stats_visible); childSetEnabled("stat_btn", net_stats_visible); + + // update the master volume button state + BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); + mBtnVolume->setToggleState(mute_audio); } void LLStatusBar::setVisibleForMouselook(bool visible) @@ -488,6 +504,13 @@ static void onClickScriptDebug(void*) LLFloaterScriptDebug::show(LLUUID::null); } +static void onClickVolume(void* data) +{ + // toggle the master mute setting + BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); + gSavedSettings.setBOOL("MuteAudio", !mute_audio); +} + // sets the static variables necessary for the date void LLStatusBar::setupDate() { @@ -562,6 +585,10 @@ BOOL can_afford_transaction(S32 cost) return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost))); } +void LLStatusBar::onVolumeChanged(const LLSD& newvalue) +{ + refresh(); +} // Implements secondlife:///app/balance/request to request a L$ balance // update via UDP message system. JC diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index d5629e6f1ebd7bb35ea4899636fd4ab4a4bef1b4..bdaacce981d653b584e0eef1e848658ba5071aef 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -34,7 +34,6 @@ #define LL_LLSTATUSBAR_H #include "llpanel.h" -#include <llmenugl.h> // "Constants" loaded from settings.xml at start time extern S32 STATUS_BAR_HEIGHT; @@ -91,9 +90,10 @@ class LLStatusBar // simple method to setup the part that holds the date void setupDate(); - static void onCommitSearch(LLUICtrl*, void* data); - static void onClickSearch(void* data); + void onVolumeChanged(const LLSD& newvalue); + static void onClickStatGraph(void* data); + private: LLTextBox *mTextHealth; @@ -103,6 +103,7 @@ class LLStatusBar LLStatGraph *mSGPacketLoss; LLButton *mBtnBuyCurrency; + LLButton *mBtnVolume; S32 mBalance; S32 mHealth; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 723ac0fc33a203ec58404d4ab9a37df0fdb445c4..539536b52770cff3292f38553bd807772ecf1b4b 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -90,9 +90,9 @@ BOOL LLSysWellWindow::postBuild() void LLSysWellWindow::setMinimized(BOOL minimize) { // we don't show empty Message Well window - if (!minimize) + if (!minimize && isWindowEmpty()) { - setVisible(!isWindowEmpty()); + return; } LLDockableFloater::setMinimized(minimize); @@ -238,7 +238,7 @@ void LLSysWellWindow::initChannel() //--------------------------------------------------------------------------------- void LLSysWellWindow::getAllowedRect(LLRect& rect) { - rect = gViewerWindow->getWorldViewRect(); + rect = gViewerWindow->getWorldViewRectScaled(); } //--------------------------------------------------------------------------------- @@ -268,8 +268,11 @@ void LLSysWellWindow::toggleWindow() { setVisible(FALSE); } - //set window in foreground - setFocus(getVisible()); + else if(!isDocked()) + { + // bring to front undocked floater + setVisible(TRUE); + } } //--------------------------------------------------------------------------------- @@ -329,7 +332,9 @@ void LLSysWellWindow::reshapeWindow() new_window_height = MAX_WINDOW_HEIGHT; } S32 newY = curRect.mTop + new_window_height - curRect.getHeight(); - curRect.setLeftTopAndSize(curRect.mLeft, newY, MIN_WINDOW_WIDTH, new_window_height); + 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); @@ -501,14 +506,14 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID& switch (im_chiclet_type) { case LLIMChiclet::TYPE_GROUP: + mChiclet = getChild<LLIMGroupChiclet>("group_chiclet"); + break; case LLIMChiclet::TYPE_AD_HOC: - mChiclet = getChild<LLIMChiclet>("group_chiclet"); - childSetVisible("p2p_chiclet", false); + mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet"); break; case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway case LLIMChiclet::TYPE_IM: - mChiclet = getChild<LLIMChiclet>("p2p_chiclet"); - childSetVisible("group_chiclet", false); + mChiclet = getChild<LLIMP2PChiclet>("p2p_chiclet"); break; } @@ -517,6 +522,7 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID& mChiclet->setSessionId(sessionId); mChiclet->setIMSessionName(name); mChiclet->setOtherParticipantId(otherParticipantId); + mChiclet->setVisible(true); LLTextBox* contactName = getChild<LLTextBox>("contact_name"); contactName->setValue(name); diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index cbc5f7358f0cf36e66b4cd7189ddb7d2ec6765f3..3e4cdbdcbec543d97b46a9867d864fe22cbde840 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -39,12 +39,13 @@ #include "llbutton.h" #include "llscreenchannel.h" #include "llscrollcontainer.h" -#include "llchiclet.h" #include "llimview.h" #include "boost/shared_ptr.hpp" class LLFlatListView; +class LLChiclet; +class LLIMChiclet; class LLSysWellWindow : public LLDockableFloater, LLIMSessionObserver { diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index bc886d5743281d90470c35d4af915514d1f0c637..cc4689062eb11e16a66fd8349047edd21bb46dfc 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -52,7 +52,7 @@ const std::string& LLTeleportHistoryItem::getTitle() const { - return gSavedSettings.getBOOL("ShowCoordinatesOption") ? mFullTitle : mTitle; + return gSavedSettings.getBOOL("NavBarShowCoordinates") ? mFullTitle : mTitle; } ////////////////////////////////////////////////////////////////////////////// @@ -177,7 +177,7 @@ void LLTeleportHistory::purgeItems() std::string LLTeleportHistory::getCurrentLocationTitle(bool full, const LLVector3& local_pos_override) { std::string location_name; - LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM : LLAgentUI::LOCATION_FORMAT_NORMAL; + LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_NO_MATURITY : LLAgentUI::LOCATION_FORMAT_NORMAL; if (!LLAgentUI::buildLocationString(location_name, fmt, local_pos_override)) location_name = "Unknown"; return location_name; diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h index 9f5563ed0b45563d39356cd829287aa8f0390162..a82bec7c4f466a341f97c744d879dbbf8e968f93 100644 --- a/indra/newview/llteleporthistory.h +++ b/indra/newview/llteleporthistory.h @@ -57,7 +57,8 @@ class LLTeleportHistoryItem {} /** - * @return title formatted according to the current value of the ShowCoordinatesOption setting. + * @return title formatted according to the current value of the + * NavBarShowCoordinates setting. */ const std::string& getTitle() const; diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp index 595b24ad471441bd9d15219ef49f1fa482c7f40d..d7840fb4355b337fbc352344a5800acb65aaf3b0 100644 --- a/indra/newview/lltexglobalcolor.cpp +++ b/indra/newview/lltexglobalcolor.cpp @@ -108,9 +108,9 @@ LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color) return new_param; } -void LLTexParamGlobalColor::onGlobalColorChanged(bool set_by_user) +void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake) { - mAvatar->onGlobalColorChanged(mTexGlobalColor, set_by_user); + mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake); } //----------------------------------------------------------------------------- diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h index 1e6754133fb5f398fb1ca22c5d41a5cd0f99bb11..829a7d645be4daeb048f52a4f2a6d390446a5185 100644 --- a/indra/newview/lltexglobalcolor.h +++ b/indra/newview/lltexglobalcolor.h @@ -80,7 +80,7 @@ class LLTexParamGlobalColor : public LLTexLayerParamColor LLTexParamGlobalColor(LLTexGlobalColor *tex_color); /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; protected: - /*virtual*/ void onGlobalColorChanged(bool set_by_user); + /*virtual*/ void onGlobalColorChanged(bool upload_bake); private: LLTexGlobalColor* mTexGlobalColor; }; diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 5d682cad3c09b1f857a4fa49897b22357018931c..25e0ca46e4d27b45c0b5f1b34ea21556f658cba0 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -1834,7 +1834,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) } if (layer) { - wearable->writeToAvatar(FALSE, FALSE); + wearable->writeToAvatar(); layer->setLTO(lto); success &= layer->render(x,y,width,height); } diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp index b744722f4cd5b72a5f16af772e32212f9d8d2793..0c7e61d00e2e75ffe9aea9289d37d700cabf8c38 100644 --- a/indra/newview/lltexlayerparams.cpp +++ b/indra/newview/lltexlayerparams.cpp @@ -160,7 +160,7 @@ BOOL LLTexLayerParamAlpha::getMultiplyBlend() const return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend; } -void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user) +void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake) { if (mIsAnimating || mTexLayer == NULL) { @@ -179,37 +179,37 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user) { if (gAgent.cameraCustomizeAvatar()) { - set_by_user = FALSE; + upload_bake = FALSE; } - mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user); + mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); mTexLayer->invalidateMorphMasks(); } } } -void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL set_by_user) +void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake) { // do not animate dummy parameters if (mIsDummy) { - setWeight(target_value, set_by_user); + setWeight(target_value, upload_bake); return; } mTargetWeight = target_value; - setWeight(target_value, set_by_user); + setWeight(target_value, upload_bake); mIsAnimating = TRUE; if (mNext) { - mNext->setAnimationTarget(target_value, set_by_user); + mNext->setAnimationTarget(target_value, upload_bake); } } -void LLTexLayerParamAlpha::animate(F32 delta, BOOL set_by_user) +void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake) { if (mNext) { - mNext->animate(delta, set_by_user); + mNext->animate(delta, upload_bake); } } @@ -449,7 +449,7 @@ LLColor4 LLTexLayerParamColor::getNetColor() const } } -void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user) +void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake) { if (mIsAnimating) { @@ -474,10 +474,10 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user) if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. { - onGlobalColorChanged(set_by_user); + onGlobalColorChanged(upload_bake); if (mTexLayer) { - mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user); + mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); } } @@ -485,23 +485,23 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user) } } -void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL set_by_user) +void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake) { // set value first then set interpolating flag to ignore further updates mTargetWeight = target_value; - setWeight(target_value, set_by_user); + setWeight(target_value, upload_bake); mIsAnimating = TRUE; if (mNext) { - mNext->setAnimationTarget(target_value, set_by_user); + mNext->setAnimationTarget(target_value, upload_bake); } } -void LLTexLayerParamColor::animate(F32 delta, BOOL set_by_user) +void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake) { if (mNext) { - mNext->animate(delta, set_by_user); + mNext->animate(delta, upload_bake); } } diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h index 98365864f99eb46d52adee903ed952116777a2b8..2b80dbdba4cf34833489f92347b57141af8321f9 100644 --- a/indra/newview/lltexlayerparams.h +++ b/indra/newview/lltexlayerparams.h @@ -66,9 +66,9 @@ class LLTexLayerParamAlpha : public LLTexLayerParam // LLVisualParam Virtual functions ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); /*virtual*/ void apply( ESex avatar_sex ) {} - /*virtual*/ void setWeight(F32 weight, BOOL set_by_user); - /*virtual*/ void setAnimationTarget(F32 target_value, BOOL set_by_user); - /*virtual*/ void animate(F32 delta, BOOL set_by_user); + /*virtual*/ void setWeight(F32 weight, BOOL upload_bake); + /*virtual*/ void setAnimationTarget(F32 target_value, BOOL upload_bake); + /*virtual*/ void animate(F32 delta, BOOL upload_bake); // LLViewerVisualParam Virtual functions /*virtual*/ F32 getTotalDistortion() { return 1.f; } @@ -143,9 +143,9 @@ class LLTexLayerParamColor : public LLTexLayerParam // LLVisualParam Virtual functions ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); /*virtual*/ void apply( ESex avatar_sex ) {} - /*virtual*/ void setWeight(F32 weight, BOOL set_by_user); - /*virtual*/ void setAnimationTarget(F32 target_value, BOOL set_by_user); - /*virtual*/ void animate(F32 delta, BOOL set_by_user); + /*virtual*/ void setWeight(F32 weight, BOOL upload_bake); + /*virtual*/ void setAnimationTarget(F32 target_value, BOOL upload_bake); + /*virtual*/ void animate(F32 delta, BOOL upload_bake); // LLViewerVisualParam Virtual functions @@ -159,7 +159,7 @@ class LLTexLayerParamColor : public LLTexLayerParam // New functions LLColor4 getNetColor() const; protected: - virtual void onGlobalColorChanged(bool set_by_user) {} + virtual void onGlobalColorChanged(bool upload_bake) {} private: LLVector3 mAvgDistortionVec; }; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 69a2d1d7a6bd914264658c3bff764ccabb5216e5..845e71378a790b5040e9310ea7b420a06188d9ac 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -834,9 +834,9 @@ bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize) S32 idx = openAndReadEntry(id, entry, false); if (idx < 0) { - // TODO: change to llwarns - llerrs << "Failed to open entry: " << id << llendl; - removeFromCache(id); + llwarns << "Failed to open entry: " << id << llendl; + removeHeaderCacheEntry(id); + LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); return false; } else if (oldbodysize != entry.mBodySize) @@ -917,7 +917,7 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id) //static const S32 MAX_REASONABLE_FILE_SIZE = 512*1024*1024; // 512 MB -F32 LLTextureCache::sHeaderCacheVersion = 1.3f; +F32 LLTextureCache::sHeaderCacheVersion = 1.4f; U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_ENTRY_SIZE; S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit const char* entries_filename = "texture.entries"; @@ -1002,7 +1002,7 @@ void LLTextureCache::closeHeaderEntriesFile() void LLTextureCache::readEntriesHeader() { // mHeaderEntriesInfo initializes to default values so safe not to read it - llassert_always(mHeaderAPRFile == NULL); + llassert_always(mHeaderAPRFile == NULL); if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool())) { LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), @@ -1192,7 +1192,7 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries) // Called from either the main thread or the worker thread void LLTextureCache::readHeaderCache() { - LLMutexLock lock(&mHeaderMutex); + mHeaderMutex.lock(); mLRU.clear(); // always clear the LRU @@ -1212,28 +1212,29 @@ void LLTextureCache::readHeaderCache() if (num_entries) { U32 empty_entries = 0; - typedef std::pair<U32, LLUUID> lru_data_t; + typedef std::pair<U32, S32> lru_data_t; std::set<lru_data_t> lru; - std::vector<LLUUID> purge_list; + std::set<LLUUID> purge_list; for (U32 i=0; i<num_entries; i++) { Entry& entry = entries[i]; const LLUUID& id = entry.mID; if (entry.mImageSize < 0) { - // This will be in the Free List, don't put it in the LRY + // This will be in the Free List, don't put it in the LRU ++empty_entries; } else { - lru.insert(std::make_pair(entry.mTime, id)); + lru.insert(std::make_pair(entry.mTime, i)); if (entry.mBodySize > 0) { if (entry.mBodySize > entry.mImageSize) { // Shouldn't happen, failsafe only llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl; - purge_list.push_back(id); + purge_list.insert(entry.mID); + entry.mImageSize = -1; // empty/available } } } @@ -1243,22 +1244,31 @@ void LLTextureCache::readHeaderCache() // Special case: cache size was reduced, need to remove entries // Note: After we prune entries, we will call this again and create the LRU U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries; + llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl; if (entries_to_purge > 0) { for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter) { - purge_list.push_back(iter->second); - if (--entries_to_purge <= 0) - break; + 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; + } } } + llassert_always(purge_list.size() >= entries_to_purge); } else { S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE); for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter) { - mLRU.insert(iter->second); + S32 idx = iter->second; + const LLUUID& id = entries[idx].mID; + mLRU.insert(id); // llinfos << "LRU: " << iter->first << " : " << iter->second << llendl; if (--lru_entries <= 0) break; @@ -1267,9 +1277,12 @@ void LLTextureCache::readHeaderCache() if (purge_list.size() > 0) { - for (std::vector<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) + for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) { - removeFromCache(*iter); + const LLUUID& id = *iter; + bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1 + llassert_always(res); + LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); } // If we removed any entries, we need to rebuild the entries list, // write the header, and call this again @@ -1285,7 +1298,9 @@ void LLTextureCache::readHeaderCache() llassert_always(new_entries.size() <= sCacheMaxEntries); mHeaderEntriesInfo.mEntries = new_entries.size(); writeEntriesAndClose(new_entries); + mHeaderMutex.unlock(); // unlock the mutex before calling again readHeaderCache(); // repeat with new entries file + mHeaderMutex.lock(); } else { @@ -1293,6 +1308,7 @@ void LLTextureCache::readHeaderCache() } } } + mHeaderMutex.unlock(); } ////////////////////////////////////////////////////////////////////////////// @@ -1307,6 +1323,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories) for (S32 i=0; i<16; i++) { std::string dirname = mTexturesDirName + delem + subdirs[i]; + llinfos << "Deleting files in directory: " << dirname << llendl; gDirUtilp->deleteFilesInDir(dirname,mask); if (purge_directories) { @@ -1337,9 +1354,12 @@ void LLTextureCache::purgeTextures(bool validate) return; } - // *FIX:Mani - watchdog off. - LLAppViewer::instance()->pauseMainloopTimeout(); - + if (!mThreaded) + { + // *FIX:Mani - watchdog off. + LLAppViewer::instance()->pauseMainloopTimeout(); + } + LLMutexLock lock(&mHeaderMutex); llinfos << "TEXTURE CACHE: Purging." << llendl; @@ -1486,7 +1506,7 @@ S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize) // Writes imagesize to the header, updates timestamp S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize) { - LLMutexLock lock(&mHeaderMutex); + mHeaderMutex.lock(); llassert_always(imagesize >= 0); Entry entry; S32 idx = openAndReadEntry(id, entry, true); @@ -1494,11 +1514,15 @@ S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize) { entry.mImageSize = imagesize; writeEntryAndClose(idx, entry); + mHeaderMutex.unlock(); } 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 } return idx; @@ -1541,21 +1565,24 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort) { lockWorkers(); handle_map_t::iterator iter = mReaders.find(handle); - llassert_always(iter != mReaders.end() || abort); - LLTextureCacheWorker* worker = iter->second; - bool res = worker->complete(); - if (res || abort) + LLTextureCacheWorker* worker = NULL; + bool complete = false; + if (iter != mReaders.end()) + { + worker = iter->second; + complete = worker->complete(); + } + if (worker && (complete || abort)) { - mReaders.erase(handle); + mReaders.erase(iter); unlockWorkers(); worker->scheduleDelete(); - return true; } else { unlockWorkers(); - return false; } + return (complete || abort); } LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority, @@ -1621,24 +1648,20 @@ void LLTextureCache::addCompleted(Responder* responder, bool success) ////////////////////////////////////////////////////////////////////////////// // Called from MAIN thread (endWork()) - +// Ensure that mHeaderMutex is locked first! bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id) { - if (!mReadOnly) + Entry entry; + S32 idx = openAndReadEntry(id, entry, false); + if (idx >= 0) { - LLMutexLock lock(&mHeaderMutex); - Entry entry; - S32 idx = openAndReadEntry(id, entry, false); - if (idx >= 0) - { - entry.mImageSize = -1; - entry.mBodySize = 0; - writeEntryAndClose(idx, entry); - mFreeList.insert(idx); - mHeaderIDMap.erase(id); - mTexturesSizeMap.erase(id); - return true; - } + entry.mImageSize = -1; + entry.mBodySize = 0; + writeEntryAndClose(idx, entry); + mFreeList.insert(idx); + mHeaderIDMap.erase(id); + mTexturesSizeMap.erase(id); + return true; } return false; } @@ -1648,6 +1671,7 @@ void LLTextureCache::removeFromCache(const LLUUID& id) //llwarns << "Removing texture from cache: " << id << llendl; if (!mReadOnly) { + LLMutexLock lock(&mHeaderMutex); removeHeaderCacheEntry(id); LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); } diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index de00ca8420b601f7947eba7f355c35d3c838de11..5f7c2f5080bff0c70963bbeed8d09a77f29ab591 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -48,7 +48,7 @@ #include "llfoldervieweventlistener.h" #include "llinventory.h" #include "llinventoryfunctions.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" #include "lllineeditor.h" diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index c918f988952ae5cda09819a785abd3036df1bfb7..9bb2a4ad0a9c0d035e0936c1833f9d2b92b0b3a3 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -524,6 +524,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size) mDesiredSize = size; prioritize = true; } + mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); if ((prioritize && mState == INIT) || mState == DONE) { mState = INIT; @@ -613,6 +614,7 @@ bool LLTextureFetchWorker::doWork(S32 param) mCacheReadHandle = LLTextureCache::nullHandle(); mCacheWriteHandle = LLTextureCache::nullHandle(); mState = LOAD_FROM_TEXTURE_CACHE; + mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); // min desired size is TEXTURE_CACHE_ENTRY_SIZE LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority) << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL; // fall through @@ -681,7 +683,6 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == CACHE_POST) { - mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); mCachedSize = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0; // Successfully loaded if ((mCachedSize >= mDesiredSize) || mHaveAllData) @@ -930,6 +931,14 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == DECODE_IMAGE) { + if (mDesiredDiscard < 0) + { + // We aborted, don't decode + mState = DONE; + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return true; + } + if (mFormattedImage->getDataSize() <= 0) { llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl; diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 903df21e785044ceb557eba7c05fd6332156737c..f9cbdc20d60dc67b0df1f53bbe75a9183ff956f2 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -225,8 +225,9 @@ void LLToast::setVisible(BOOL show) { mTimer.start(); } + LLModalDialog::setFrontmost(FALSE); } - LLPanel::setVisible(show); + LLFloater::setVisible(show); if(mPanel) { if(!mPanel->isDead()) diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index beb31bc83342f9b6f62ea94d052cbf5560c0cba4..a4f5164a8dd749db733d9462db9a647b600376e6 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -53,6 +53,7 @@ #include "lluictrlfactory.h" #include "llnotifications.h" #include "llfunctorregistry.h" +#include "llrootview.h" const S32 MAX_ALLOWED_MSG_WIDTH = 400; const F32 DEFAULT_BUTTON_DELAY = 0.5f; @@ -220,16 +221,13 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor"); if (mCaution) { - LLIconCtrl::Params params; - params.name("icon"); - params.rect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32)); - params.mouse_opaque(false); - params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP); - params.tab_stop(false); - LLIconCtrl * icon = LLUICtrlFactory::create<LLIconCtrl> (params); - icon->setValue ("notify_caution_icon.tga"); - icon->setMouseOpaque(FALSE); - LLToastPanel::addChild(icon); + LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance()); + if(icon) + { + icon->setRect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32)); + LLToastPanel::addChild(icon); + } + msg_x += 32 + HPAD; msg_box->setColor( alert_caution_text_color ); } @@ -245,29 +243,30 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal // Buttons S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2; - + for( S32 i = 0; i < num_options; i++ ) { LLRect button_rect; - button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT ); - - LLButton::Params p; - p.name(options[i].first); - p.rect(button_rect); - p.click_callback.function(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i)); - p.font(font); - p.label(options[i].second); + + LLButton* btn = LLUICtrlFactory::getInstance()->createFromFile<LLButton>("alert_button.xml", this, LLPanel::child_registry_t::instance()); + if(btn) + { + btn->setName(options[i].first); + 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)); - LLButton* btn = LLUICtrlFactory::create<LLButton>(p); - mButtonData[i].mButton = btn; + mButtonData[i].mButton = btn; - LLToastPanel::addChild(btn); + LLToastPanel::addChild(btn); - if( i == mDefaultOption ) - { - btn->setFocus(TRUE); + if( i == mDefaultOption ) + { + btn->setFocus(TRUE); + } } - button_left += button_width + BTN_HPAD; } @@ -275,25 +274,26 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal 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); - LLLineEditor::Params params; - params.name(edit_text_name); - params.rect(LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y)); - params.default_text(edit_text_contents); - params.max_length_bytes(STD_STRING_STR_LEN); - mLineEditor = LLUICtrlFactory::create<LLLineEditor> (params); + // make sure all edit keys get handled properly (DEV-22396) + mLineEditor->setHandleEditKeysDirectly(TRUE); - // make sure all edit keys get handled properly (DEV-22396) - mLineEditor->setHandleEditKeysDirectly(TRUE); + LLToastPanel::addChild(mLineEditor); - LLToastPanel::addChild(mLineEditor); - } - - if (mLineEditor) - { - mLineEditor->setDrawAsterixes(is_password); + mLineEditor->setDrawAsterixes(is_password); - setEditTextArgs(notification->getSubstitutions()); + setEditTextArgs(notification->getSubstitutions()); + } } std::string ignore_label; @@ -323,7 +323,14 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::string& check_control ) { - const LLFontGL* font = LLFontGL::getFontSansSerif(); + mCheck = LLUICtrlFactory::getInstance()->createFromFile<LLCheckBoxCtrl>("alert_check_box.xml", this, LLPanel::child_registry_t::instance()); + + if(!mCheck) + { + return false; + } + + const LLFontGL* font = mCheck->getFont(); const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f); // Extend dialog for "check next time" @@ -339,14 +346,13 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std:: LLToastPanel::reshape( dialog_width, dialog_height, FALSE ); S32 msg_x = (LLToastPanel::getRect().getWidth() - max_msg_width) / 2; + + // set check_box's attributes + LLRect check_rect; + mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT)); + mCheck->setLabel(check_title); + mCheck->setCommitCallback(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1)); - LLCheckBoxCtrl::Params p; - p.name("check"); - p.rect.left(msg_x).bottom(VPAD+BTN_HEIGHT+LINE_HEIGHT/2).width(max_msg_width).height(LINE_HEIGHT); - p.label(check_title); - p.font(font); - p.commit_callback.function(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1)); - mCheck = LLUICtrlFactory::create<LLCheckBoxCtrl>(p); LLToastPanel::addChild(mCheck); return true; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index f82573f46cd4400af4af66b1acfab7b5a98e0a05..d1bdcb13543da05606a3bd8867331aa842411312 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -40,7 +40,7 @@ #include "lliconctrl.h" #include "llinventoryfunctions.h" #include "llnotify.h" -#include "lltextbox.h" +#include "llviewertexteditor.h" #include "lluiconstants.h" #include "llui.h" @@ -54,7 +54,7 @@ #include "llfloaterinventory.h" #include "llinventorytype.h" -const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 4; +const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 7; LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification) : LLToastPanel(notification), @@ -84,11 +84,6 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification //message body const std::string& message = payload["message"].asString(); - - LLTextBox* pSubjectText = getChild<LLTextBox>("subject"); - pSubjectText->setValue(subject); - - LLTextBox* pDateTimeText = getChild<LLTextBox>("datetime"); std::string timeStr = "["+LLTrans::getString("UTCTimeWeek")+"],[" +LLTrans::getString("UTCTimeDay")+"] [" +LLTrans::getString("UTCTimeMth")+"] [" @@ -102,20 +97,23 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification LLSD substitution; substitution["datetime"] = (S32) notice_date.secondsSinceEpoch(); LLStringUtil::format(timeStr, substitution); - pDateTimeText->setValue(timeStr); - LLTextBox* pMessageText = getChild<LLTextBox>("message"); - - //If message is empty let it be invisible and not take place at the panel - if(message.size() != 0) - { - pMessageText->setVisible(TRUE); - pMessageText->setValue(message); - } - else - { - pMessageText->setVisible(FALSE); - } + LLViewerTextEditor* pMessageText = getChild<LLViewerTextEditor>("message"); + pMessageText->clear(); + + LLStyle::Params style; + LLFontGL* subject_font = LLFontGL::getFontByName(getString("subject_font")); + if (subject_font) + style.font = subject_font; + pMessageText->appendText(subject, FALSE, style); + + LLFontGL* date_font = LLFontGL::getFontByName(getString("date_font")); + if (date_font) + style.font = date_font; + pMessageText->appendText(timeStr + "\n", TRUE, style); + + style.font = pMessageText->getDefaultFont(); + pMessageText->appendText(message, TRUE, style); //attachment BOOL hasInventory = payload["inventory_offer"].isDefined(); diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index c02fd7a5eff956eccd2227ce82e48ed14d429150..9040bdb41ab41f9c75fc9c7ac6cf5090340e46c6 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -50,14 +50,32 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif mMessage = getChild<LLTextBox>("message"); mReplyBtn = getChild<LLButton>("reply"); - mMessage->setValue(p.message); + LLStyle::Params style_params; + style_params.font.name(LLFontGL::nameFromFont(style_params.font)); + style_params.font.size(LLFontGL::sizeFromFont(style_params.font)); + style_params.font.style = "UNDERLINE"; + + //Handle IRC styled /me messages. + std::string prefix = p.message.substr(0, 4); + if (prefix == "/me " || prefix == "/me'") + { + mMessage->clear(); + + style_params.font.style ="ITALIC"; + mMessage->appendText(p.from + " ", FALSE, style_params); + + style_params.font.style = "ITALIC"; + mMessage->appendText(p.message.substr(3), FALSE, style_params); + } + else + mMessage->setValue(p.message); mUserName->setValue(p.from); mTime->setValue(p.time); mSessionID = p.session_id; mNotification = p.notification; // if message comes from the system - there shouldn't be a reply btn - if(p.from == "Second Life") + if(p.from == SYSTEM_FROM) { mAvatar->setVisible(FALSE); sys_msg_icon->setVisible(TRUE); diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 0c23947a8ce99c62eefe08b8673e5e00e0f08e0e..699424ef361c577619858cf91fe4138a632c8b61 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -48,7 +48,6 @@ const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL; LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification) : LLToastPanel(notification), mTextBox(NULL), -mIcon(NULL), mInfoPanel(NULL), mControlPanel(NULL), mNumOptions(0), @@ -58,7 +57,6 @@ mAddedDefaultBtn(false) LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml"); mInfoPanel = getChild<LLPanel>("info_panel"); mControlPanel = getChild<LLPanel>("control_panel"); - mIcon = getChild<LLIconCtrl>("info_icon"); // customize panel's attributes // is it intended for displaying a tip @@ -94,26 +92,6 @@ mAddedDefaultBtn(false) // preliminary adjust panel's layout mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form); - // choose a right icon - if (mIsTip) - { - // use the tip notification icon - mIcon->setValue("notify_tip_icon.tga"); - LLRect icon_rect = mIcon->getRect(); - icon_rect.setLeftTopAndSize(icon_rect.mLeft, getRect().getHeight() - VPAD, icon_rect.getWidth(), icon_rect.getHeight()); - mIcon->setRect(icon_rect); - } - else if (mIsCaution) - { - // use the caution notification icon - mIcon->setValue("notify_caution_icon.tga"); - } - else - { - // use the default notification icon - mIcon->setValue("notify_box_icon.tga"); - } - // adjust text options according to the notification type // add a caution textbox at the top of a caution notification if (mIsCaution && !mIsTip) @@ -128,6 +106,7 @@ mAddedDefaultBtn(false) // *TODO: magic numbers(???) - copied from llnotify.cpp(250) const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; + mTextBox->setMaxTextLength(MAX_LENGTH); mTextBox->setVisible(TRUE); mTextBox->setValue(notification->getMessage()); diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index 66534edcdf873ac2a736bf3b64c4fa7f87a7f3dd..eea70705ec1abf0dc50a5e9fc1f7ef2b012172a9 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -73,7 +73,6 @@ class LLToastNotifyPanel: public LLToastPanel // panel elements LLTextBase* mTextBox; - LLIconCtrl* mIcon; LLPanel* mInfoPanel; // a panel, that contains an information LLPanel* mControlPanel; // a panel, that contains buttons (if present) diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp index 0572f9a69864879bf986fb4ff0cd799a69aa8207..268a18d2a2c0c05476b2431920a81cd27be7e31c 100644 --- a/indra/newview/lltoolbar.cpp +++ b/indra/newview/lltoolbar.cpp @@ -206,7 +206,7 @@ void LLToolBar::layoutButtons() { #if LL_DARWIN const S32 FUDGE_WIDTH_OF_SCREEN = 4; - S32 width = gViewerWindow->getWindowWidth() + FUDGE_WIDTH_OF_SCREEN; + S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN; S32 pad = 2; // this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet. diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 959cb3f182248fd124a267954f4c058469004b6b..fbd86d0edfc8c2f35773db0345723fc263b7c860 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -2508,7 +2508,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( if(drop) { BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE ); - LLAppearanceManager::wearInventoryCategory(category, false, append); + LLAppearanceManager::instance().wearInventoryCategory(category, false, append); } return ACCEPT_YES_MULTI; } @@ -2516,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( { if(drop) { - LLAppearanceManager::wearInventoryCategory(category, true, false); + LLAppearanceManager::instance().wearInventoryCategory(category, true, false); } return ACCEPT_YES_MULTI; } diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 9400840bdfaa4b3a85dbfeaf911fe3da350d55ac..2320ae57df34c5437dd772ad3c058affca910ff5 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -365,7 +365,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) // Orbit tool if (hasMouseCapture()) { - const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidth(); + const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthScaled(); if (dx != 0) { @@ -393,7 +393,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) F32 dist = (F32) camera_to_focus.normVec(); // Fudge factor for pan - F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidth(); + F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidthScaled(); if (dx != 0) { @@ -415,7 +415,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) if (hasMouseCapture()) { - const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidth(); + const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthScaled(); if (dx != 0) { diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index b7a97562bd1b0e4cfa8385094515b542007c2fd1..26dbe6a489066456d7b89d33121deb6227f8c25b 100644 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -510,8 +510,8 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) const F32 RADIANS_PER_PIXEL_X = 0.01f; const F32 RADIANS_PER_PIXEL_Y = 0.01f; - S32 dx = x - (gViewerWindow->getWorldViewWidth() / 2); - S32 dy = y - (gViewerWindow->getWorldViewHeight() / 2); + S32 dx = x - (gViewerWindow->getWorldViewWidthScaled() / 2); + S32 dy = y - (gViewerWindow->getWorldViewHeightScaled() / 2); if (dx != 0 || dy != 0) { @@ -631,10 +631,10 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) // Handle auto-rotation at screen edge. LLVector3 grab_pos_agent = gAgent.getPosAgentFromGlobal( grab_point_global ); - LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidth() / 2, gViewerWindow->getWorldViewHeight() / 2); + LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidthScaled() / 2, gViewerWindow->getWorldViewHeightScaled() / 2); LLViewerCamera::getInstance()->projectPosAgentToScreen(grab_pos_agent, grab_center_gl); - const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidth() / 20; + const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidthScaled() / 20; const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD; const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped; // ...build mode moves camera about focus point @@ -649,7 +649,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) gAgent.cameraOrbitAround(rotate_angle); } } - else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidth() - ROTATE_H_MARGIN) + else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidthScaled() - ROTATE_H_MARGIN) { if (gAgent.getFocusOnAvatar()) { @@ -662,7 +662,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) } // Don't move above top of screen or below bottom - if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeight() - 6) + if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeightScaled() - 6) && (grab_center_gl.mY > 24)) { // Transmit update to simulator @@ -893,7 +893,7 @@ void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask) gAgent.yaw(rotate_angle); //gAgent.setControlFlags(AGENT_CONTROL_YAW_POS); } - else if (x == (gViewerWindow->getWorldViewWidth() - 1) ) + else if (x == (gViewerWindow->getWorldViewWidthScaled() - 1) ) { gAgent.yaw(-rotate_angle); //gAgent.setControlFlags(AGENT_CONTROL_YAW_NEG); diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp index 53d71a42cfaea534cd54cde2d4b8ab15e70c76a1..a441d653c7cccd9574716872f0f637a12b1e4ecf 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -140,7 +140,7 @@ void LLToolGun::draw() { LLUIImagePtr crosshair = LLUI::getUIImage("crosshairs.tga"); crosshair->draw( - ( gViewerWindow->getVirtualWorldViewRect().getWidth() - crosshair->getWidth() ) / 2, - ( gViewerWindow->getVirtualWorldViewRect().getHeight() - crosshair->getHeight() ) / 2); + ( gViewerWindow->getWorldViewRectScaled().getWidth() - crosshair->getWidth() ) / 2, + ( gViewerWindow->getWorldViewRectScaled().getHeight() - crosshair->getHeight() ) / 2); } } diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index ded83debad8690eefdfd017c838bd8c98ddbecbd..26b3bdb82e24516926e320bb0b7a17fa2054cd7b 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -247,7 +247,7 @@ bool LLToolMgr::inEdit() bool LLToolMgr::canEdit() { - return LLViewerParcelMgr::getInstance()->agentCanBuild(); + return LLViewerParcelMgr::getInstance()->allowAgentBuild(); } void LLToolMgr::toggleBuildMode() diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index d7d7b5f44b0e35a144bf8a474f8c53a91206ea2a..4fb75f7a49fa0a428141d8e9b1adc1e5f236a3aa 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -146,8 +146,9 @@ void LLVisualParamHint::preRender(BOOL clear_depth) { LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - mLastParamWeight = avatarp->getVisualParamWeight(mVisualParam); - avatarp->setVisualParamWeight(mVisualParam, mVisualParamWeight); + 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(); @@ -242,7 +243,8 @@ BOOL LLVisualParamHint::render() gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } - avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight); + avatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); + mVisualParam->setWeight(mLastParamWeight, FALSE); gGL.color4f(1,1,1,1); mGLTexturep->setGLTextureCreated(true); return TRUE; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 93da32b115f2f38e851b0e5bc167588dd2f9cf8f..5ed8dc5fb9a2bacbcfb0c7f46781865f3cc567cc 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -209,6 +209,7 @@ 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(); @@ -252,7 +253,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback() selectionPropertiesReceived(); } } - return TRUE; + return TRUE; case CLICK_ACTION_PLAY: handle_click_action_play(); return TRUE; @@ -260,6 +261,29 @@ BOOL LLToolPie::pickLeftMouseDownCallback() // mClickActionObject = object; handle_click_action_open_media(object); return TRUE; + case CLICK_ACTION_ZOOM: + { + const F32 PADDING_FACTOR = 2.f; + LLViewerObject* object = gObjectList.findObject(mPick.mObjectID); + + if (object) + { + gAgent.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()); + F32 distance = bbox.getExtentLocal().magVec() * PADDING_FACTOR / atan(angle_of_view); + + LLVector3 obj_to_cam = LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent(); + obj_to_cam.normVec(); + + LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); + gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), + object_center_global, + mPick.mObjectID ); + } + } + return TRUE; default: // nothing break; @@ -413,6 +437,9 @@ ECursorType cursor_from_object(LLViewerObject* object) cursor = UI_CURSOR_HAND; } break; + case CLICK_ACTION_ZOOM: + cursor = UI_CURSOR_TOOLZOOMIN; + break; case CLICK_ACTION_PLAY: case CLICK_ACTION_OPEN_MEDIA: cursor = cursor_from_parcel_media(click_action); @@ -526,7 +553,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) } static LLCachedControl<bool> enable_highlight( - gSavedSettings, "RenderHighlightEnable", false); + gSavedSettings, "RenderHoverGlowEnable", false); LLDrawable* drawable = NULL; if (enable_highlight && show_highlight && object) { @@ -551,6 +578,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) case CLICK_ACTION_BUY: case CLICK_ACTION_PAY: case CLICK_ACTION_OPEN: + case CLICK_ACTION_ZOOM: + case CLICK_ACTION_PLAY: + case CLICK_ACTION_OPEN_MEDIA: // Because these actions open UI dialogs, we won't change // the cursor again until the next hover and GL pick over // the world. Keep the cursor an arrow, assuming that @@ -700,13 +730,17 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask) // *HACK: We may select this object, so pretend it was clicked mPick = mHoverPick; - LLToolTipMgr::instance().show(LLToolTip::Params() - .message(avatar_name) - .image(LLUI::getUIImage("Info")) - .click_callback(boost::bind(showAvatarInspector, hover_object->getID())) - .visible_time_near(6.f) - .visible_time_far(3.f) - .wrap(false)); + LLInspector::Params p; + p.message(avatar_name); + p.image(LLUI::getUIImage("Info")); + p.click_callback(boost::bind(showAvatarInspector, hover_object->getID())); + p.visible_time_near(6.f); + p.visible_time_far(3.f); + p.wrap(false); + + p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); + + LLToolTipMgr::instance().show(p); } } else @@ -787,18 +821,22 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask) { // We may select this object, so pretend it was clicked mPick = mHoverPick; - LLToolTipMgr::instance().show(LLToolTip::Params() - .message(tooltip_msg) - .image(LLUI::getUIImage("Info_Off")) - .click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace)) - .time_based_media(is_time_based_media) - .web_based_media(is_web_based_media) - .media_playing(is_media_playing) - .click_playmedia_callback(boost::bind(playCurrentMedia, mHoverPick)) - .click_homepage_callback(boost::bind(VisitHomePage, mHoverPick)) - .visible_time_near(6.f) - .visible_time_far(3.f) - .wrap(false)); + LLInspector::Params p; + p.message(tooltip_msg); + p.image(LLUI::getUIImage("Info_Off")); + p.click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace)); + p.time_based_media(is_time_based_media); + p.web_based_media(is_web_based_media); + p.media_playing(is_media_playing); + p.click_playmedia_callback(boost::bind(playCurrentMedia, mHoverPick)); + p.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick)); + p.visible_time_near(6.f); + p.visible_time_far(3.f); + p.wrap(false); + + p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); + + LLToolTipMgr::instance().show(p); } } } diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 1a6171765880bb5b7e90f34df9b8f7acc80f4837..407cc23d0d70c8c6d87e7dc6450ad0c40f9e88ff 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -55,6 +55,7 @@ #include "llhudtext.h" #include "llhudview.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "lllandmarklist.h" #include "llsky.h" #include "llui.h" diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp index 9c643e78dec9ee2fcd8f0833a7697ec3308a75f6..8b4cfa72481582dcafabaef2e0cb4f9b0316bf70 100644 --- a/indra/newview/lluilistener.cpp +++ b/indra/newview/lluilistener.cpp @@ -20,10 +20,16 @@ #include "lluictrl.h" #include "llerror.h" -LLUIListener::LLUIListener(const std::string& name): - LLDispatchListener(name, "op") +LLUIListener::LLUIListener(): + LLEventAPI("UI", + "LLUICtrl::CommitCallbackRegistry listener.\n" + "Capable of invoking any function (with parameter) you can specify in XUI.") { - add("call", &LLUIListener::call, LLSD().insert("function", LLSD())); + add("call", + "Invoke the operation named by [\"function\"], passing [\"parameter\"],\n" + "as if from a user gesture on a menu -- or a button click.", + &LLUIListener::call, + LLSD().insert("function", LLSD())); } void LLUIListener::call(const LLSD& event) const diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h index ea904a99ff86b82bae69b85d79a920ad5d84cc9f..8605d60bd33ecae10252b81965be9d873314fe09 100644 --- a/indra/newview/lluilistener.h +++ b/indra/newview/lluilistener.h @@ -12,15 +12,15 @@ #if ! defined(LL_LLUILISTENER_H) #define LL_LLUILISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" #include <string> class LLSD; -class LLUIListener: public LLDispatchListener +class LLUIListener: public LLEventAPI { public: - LLUIListener(const std::string& name); + LLUIListener(); private: void call(const LLSD& event) const; diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index a3daca6fa42947c000fd80095cb4775373a5efe3..9e064d81356dd37417fd93d03db6c8309b0fa70f 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -364,9 +364,9 @@ bool LLURLDispatcher::dispatchRightClick(const std::string& url) bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url) { // *NOTE: Text editors are considered sources of trusted URLs - // in order to make objectim and avatar profile links in chat - // history work. While a malicious resident could chat an app - // SLURL, the receiving resident will see it and must affirmatively + // in order to make avatar profile links in chat history work. + // While a malicious resident could chat an app SLURL, the + // receiving resident will see it and must affirmatively // click on it. // *TODO: Make this trust model more refined. JC const bool trusted_browser = true; diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp index c974171c2c2e7173b758ed39b153649e797d44dd..b382ff630699c4d3107a2a731ffe6cf9af6b3f13 100644 --- a/indra/newview/llviewerassettype.cpp +++ b/indra/newview/llviewerassettype.cpp @@ -71,7 +71,6 @@ LLViewerAssetDictionary::LLViewerAssetDictionary() addEntry(LLViewerAssetType::AT_OBJECT, new ViewerAssetEntry(DAD_OBJECT)); addEntry(LLViewerAssetType::AT_NOTECARD, new ViewerAssetEntry(DAD_NOTECARD)); addEntry(LLViewerAssetType::AT_CATEGORY, new ViewerAssetEntry(DAD_CATEGORY)); - addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, new ViewerAssetEntry(DAD_ROOT_CATEGORY)); addEntry(LLViewerAssetType::AT_LSL_TEXT, new ViewerAssetEntry(DAD_SCRIPT)); addEntry(LLViewerAssetType::AT_LSL_BYTECODE, new ViewerAssetEntry(DAD_NONE)); addEntry(LLViewerAssetType::AT_TEXTURE_TGA, new ViewerAssetEntry(DAD_NONE)); diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 49506db17381180475eadae67ac121da98ef9b3b..e7f904023a69ae3f79a69d9a26c1868689d46184 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -86,16 +86,6 @@ void init_audio() gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot"))); //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot"))); //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot"))); @@ -231,9 +221,9 @@ void audio_update_wind(bool force_update) } } // this line rotates the wind vector to be listener (agent) relative - // unfortunately we have to pre-translate to undo the translation that - // occurs in the transform call - gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity()); + // Only use the agent's motion to compute wind noise, otherwise the world + // feels desolate on login when you are standing still. + gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal( -gAgent.getVelocity() ); // don't use the setter setMaxWindGain() because we don't // want to screw up the fade-in on startup by setting actual source gain diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index b5709fa10214720a68131ad5bedd65c9e8be5609..f3c64088c9b1be29477f3e63983afcf62a9bcbb5 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -401,10 +401,10 @@ void LLViewerCamera::setPerspective(BOOL for_selection, if (for_selection && (width > 1 || height > 1)) { - calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidth() - 0.5f, - (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeight() - 0.5f, - (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidth() - 0.5f, - (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeight() - 0.5f); + 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, + (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f); } @@ -469,7 +469,7 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord } } - LLRect world_view_rect = gViewerWindow->getWorldViewRect(); + LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw(); S32 viewport[4]; viewport[0] = world_view_rect.mLeft; viewport[1] = world_view_rect.mBottom; @@ -485,7 +485,7 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord y /= gViewerWindow->getDisplayScale().mV[VY]; // should now have the x,y coords of grab_point in screen space - LLRect world_view_rect = gViewerWindow->getVirtualWorldViewRect(); + LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); // convert to pixel coordinates S32 int_x = lltrunc(x); @@ -495,14 +495,14 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord if (clamp) { - if (int_x < world_view_rect.mLeft) + if (int_x < world_rect.mLeft) { - out_point.mX = world_view_rect.mLeft; + out_point.mX = world_rect.mLeft; valid = FALSE; } - else if (int_x > world_view_rect.mRight) + else if (int_x > world_rect.mRight) { - out_point.mX = world_view_rect.mRight; + out_point.mX = world_rect.mRight; valid = FALSE; } else @@ -510,14 +510,14 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord out_point.mX = int_x; } - if (int_y < world_view_rect.mBottom) + if (int_y < world_rect.mBottom) { - out_point.mY = world_view_rect.mBottom; + out_point.mY = world_rect.mBottom; valid = FALSE; } - else if (int_y > world_view_rect.mTop) + else if (int_y > world_rect.mTop) { - out_point.mY = world_view_rect.mTop; + out_point.mY = world_rect.mTop; valid = FALSE; } else @@ -531,19 +531,19 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord out_point.mX = int_x; out_point.mY = int_y; - if (int_x < world_view_rect.mLeft) + if (int_x < world_rect.mLeft) { valid = FALSE; } - else if (int_x > world_view_rect.mRight) + else if (int_x > world_rect.mRight) { valid = FALSE; } - if (int_y < world_view_rect.mBottom) + if (int_y < world_rect.mBottom) { valid = FALSE; } - else if (int_y > world_view_rect.mTop) + else if (int_y > world_rect.mTop) { valid = FALSE; } @@ -572,7 +572,7 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent, in_front = FALSE; } - LLRect world_view_rect = gViewerWindow->getWorldViewRect(); + LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw(); S32 viewport[4]; viewport[0] = world_view_rect.mLeft; viewport[1] = world_view_rect.mBottom; @@ -587,7 +587,7 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent, x /= gViewerWindow->getDisplayScale().mV[VX]; y /= gViewerWindow->getDisplayScale().mV[VY]; // should now have the x,y coords of grab_point in screen space - const LLRect& world_rect = gViewerWindow->getVirtualWorldViewRect(); + const LLRect& world_rect = gViewerWindow->getWorldViewRectScaled(); // ...sanity check S32 int_x = lltrunc(x); diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8de87eb60266521691fa474b29aa9f0954d684e1 --- /dev/null +++ b/indra/newview/llviewerchat.cpp @@ -0,0 +1,221 @@ +/** + * @file llviewerchat.cpp + * @brief Builds menus out of items. + * + * $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 "llviewerchat.h" + +// newview includes +#include "llagent.h" // gAgent +#include "lluicolortable.h" +#include "llviewercontrol.h" // gSavedSettings + +// LLViewerChat + +//static +void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) +{ + if(chat.mMuted) + { + r_color= LLUIColorTable::instance().getColor("LtGray"); + } + else + { + switch(chat.mSourceType) + { + case CHAT_SOURCE_SYSTEM: + r_color = LLUIColorTable::instance().getColor("SystemChatColor"); + break; + case CHAT_SOURCE_AGENT: + if (chat.mFromID.isNull()) + { + r_color = LLUIColorTable::instance().getColor("SystemChatColor"); + } + else + { + if(gAgentID == chat.mFromID) + { + r_color = LLUIColorTable::instance().getColor("UserChatColor"); + } + else + { + r_color = LLUIColorTable::instance().getColor("AgentChatColor"); + } + } + break; + case CHAT_SOURCE_OBJECT: + if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) + { + r_color = LLUIColorTable::instance().getColor("ScriptErrorColor"); + } + else if ( chat.mChatType == CHAT_TYPE_OWNER ) + { + r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor"); + } + else + { + r_color = LLUIColorTable::instance().getColor("ObjectChatColor"); + } + break; + default: + r_color.setToWhite(); + } + + if (!chat.mPosAgent.isExactlyZero()) + { + LLVector3 pos_agent = gAgent.getPositionAgent(); + F32 distance = dist_vec(pos_agent, chat.mPosAgent); + if (distance > gAgent.getNearChatRadius()) + { + // diminish far-off chat + r_color.mV[VALPHA] = 0.8f; + } + } + } +} + + +//static +void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha) +{ + if(chat.mMuted) + { + r_color_name = "LtGray"; + } + else + { + switch(chat.mSourceType) + { + case CHAT_SOURCE_SYSTEM: + r_color_name = "SystemChatColor"; + break; + + case CHAT_SOURCE_AGENT: + if (chat.mFromID.isNull()) + { + r_color_name = "SystemChatColor"; + } + else + { + if(gAgentID == chat.mFromID) + { + r_color_name = "UserChatColor"; + } + else + { + r_color_name = "AgentChatColor"; + } + } + break; + + case CHAT_SOURCE_OBJECT: + if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) + { + r_color_name = "ScriptErrorColor"; + } + else if ( chat.mChatType == CHAT_TYPE_OWNER ) + { + r_color_name = "llOwnerSayChatColor"; + } + else + { + r_color_name = "ObjectChatColor"; + } + break; + default: + r_color_name = "White"; + } + + if (!chat.mPosAgent.isExactlyZero()) + { + LLVector3 pos_agent = gAgent.getPositionAgent(); + F32 distance = dist_vec(pos_agent, chat.mPosAgent); + if (distance > gAgent.getNearChatRadius()) + { + // diminish far-off chat + r_color_alpha = 0.8f; + } + else + { + r_color_alpha = 1.0f; + } + } + } + +} + + +//static +LLFontGL* LLViewerChat::getChatFont() +{ + S32 font_size = gSavedSettings.getS32("ChatFontSize"); + LLFontGL* fontp = NULL; + switch(font_size) + { + case 0: + fontp = LLFontGL::getFontSansSerifSmall(); + break; + default: + case 1: + fontp = LLFontGL::getFontSansSerif(); + break; + case 2: + fontp = LLFontGL::getFontSansSerifBig(); + break; + } + + return fontp; + +} + +//static +S32 LLViewerChat::getChatFontSize() +{ + return gSavedSettings.getS32("ChatFontSize"); +} + + +//static +void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg) +{ + std::string tmpmsg = chat.mText; + + if(chat.mChatStyle == CHAT_STYLE_IRC) + { + formated_msg = chat.mFromName + tmpmsg.substr(3); + } + else + { + formated_msg = tmpmsg; + } + +} + diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h new file mode 100644 index 0000000000000000000000000000000000000000..502d6ea7e5203c1c7204329e6cdcc02d8672e630 --- /dev/null +++ b/indra/newview/llviewerchat.h @@ -0,0 +1,52 @@ +/** + * @file llviewerchat.h + * @brief wrapper of LLChat in viewer + * + * $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_LLVIEWERCHAT_H +#define LL_LLVIEWERCHAT_H + +#include "llchat.h" +#include "llfontgl.h" +#include "v4color.h" + + +class LLViewerChat +{ +public: + static void getChatColor(const LLChat& chat, LLColor4& r_color); + static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha); + static LLFontGL* getChatFont(); + static S32 getChatFontSize(); + static void formatChatMsg(const LLChat& chat, std::string& formated_msg); + +}; + +#endif diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp index ecba1b8eb0a3ea26dc4aa33eb24d1856f96ecf6b..0b9db1b906d33052bafe98da18c01378843dc605 100644 --- a/indra/newview/llviewercontrollistener.cpp +++ b/indra/newview/llviewercontrollistener.cpp @@ -18,12 +18,22 @@ LLViewerControlListener gSavedSettingsListener; LLViewerControlListener::LLViewerControlListener() - : LLDispatchListener("LLViewerControl", "group") + : LLEventAPI("LLViewerControl", + "LLViewerControl listener: set, toggle or set default for various controls", + "group") { - add("Global", boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1)); - add("PerAccount", boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1)); - add("Warning", boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1)); - add("Crash", boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1)); + add("Global", + "Set gSavedSettings control [\"key\"] to value [\"value\"]", + boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1)); + add("PerAccount", + "Set gSavedPerAccountSettings control [\"key\"] to value [\"value\"]", + boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1)); + add("Warning", + "Set gWarningSettings control [\"key\"] to value [\"value\"]", + boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1)); + add("Crash", + "Set gCrashSettings control [\"key\"] to value [\"value\"]", + boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1)); #if 0 add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1)); diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h index cacf97e908e8f6784339e155b20267b718acfbdf..88afbb871dc025ca6a84bd9b5c9a82a90af7dfdf 100644 --- a/indra/newview/llviewercontrollistener.h +++ b/indra/newview/llviewercontrollistener.h @@ -12,12 +12,12 @@ #ifndef LL_LLVIEWERCONTROLLISTENER_H #define LL_LLVIEWERCONTROLLISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" class LLControlGroup; class LLSD; -class LLViewerControlListener : public LLDispatchListener +class LLViewerControlListener : public LLEventAPI { public: LLViewerControlListener(); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index e0bb8fedeb1da7aebe4f6d33bfa6482eb4ead218..5b733ed817be95014757a7b424cae6d784545ea3 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -782,10 +782,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // LLRect floater_rect = frontmost_floaterp->calcScreenRect(); // // deflate by one pixel so rounding errors don't occlude outside of floater extents // floater_rect.stretch(-1); - // LLRectf floater_3d_rect((F32)floater_rect.mLeft / (F32)gViewerWindow->getWindowWidth(), - // (F32)floater_rect.mTop / (F32)gViewerWindow->getWindowHeight(), - // (F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidth(), - // (F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeight()); + // LLRectf floater_3d_rect((F32)floater_rect.mLeft / (F32)gViewerWindow->getWindowWidthScaled(), + // (F32)floater_rect.mTop / (F32)gViewerWindow->getWindowHeightScaled(), + // (F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidthScaled(), + // (F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeightScaled()); // floater_3d_rect.translate(-0.5f, -0.5f); // glTranslatef(0.f, 0.f, -LLViewerCamera::getInstance()->getNear()); // glScalef(LLViewerCamera::getInstance()->getNear() * LLViewerCamera::getInstance()->getAspect() / sinf(LLViewerCamera::getInstance()->getView()), LLViewerCamera::getInstance()->getNear() / sinf(LLViewerCamera::getInstance()->getView()), 1.f); @@ -874,7 +874,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) /// and then display it again with compositor effects. /// Using render to texture would be faster/better, but I don't have a /// grasp of their full display stack just yet. - // gPostProcess->apply(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); + // gPostProcess->apply(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender) { @@ -1011,7 +1011,7 @@ void render_hud_attachments() BOOL setup_hud_matrices() { - LLRect whole_screen = gViewerWindow->getVirtualWindowRect(); + LLRect whole_screen = gViewerWindow->getWindowRectScaled(); // apply camera zoom transform (for high res screenshots) F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor(); @@ -1019,13 +1019,13 @@ BOOL setup_hud_matrices() if (zoom_factor > 1.f) { S32 num_horizontal_tiles = llceil(zoom_factor); - S32 tile_width = llround((F32)gViewerWindow->getWindowWidth() / zoom_factor); - S32 tile_height = llround((F32)gViewerWindow->getWindowHeight() / zoom_factor); + S32 tile_width = llround((F32)gViewerWindow->getWindowWidthScaled() / zoom_factor); + S32 tile_height = llround((F32)gViewerWindow->getWindowHeightScaled() / zoom_factor); int tile_y = sub_region / num_horizontal_tiles; int tile_x = sub_region - (tile_y * num_horizontal_tiles); glh::matrix4f mat; - whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWindowHeight() - (tile_y * tile_height), tile_width, tile_height); + whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWindowHeightScaled() - (tile_y * tile_height), tile_width, tile_height); } return setup_hud_matrices(whole_screen); @@ -1048,12 +1048,12 @@ BOOL setup_hud_matrices(const LLRect& screen_region) F32 aspect_ratio = LLViewerCamera::getInstance()->getAspect(); glh::matrix4f mat; - F32 scale_x = (F32)gViewerWindow->getWindowWidth() / (F32)screen_region.getWidth(); - F32 scale_y = (F32)gViewerWindow->getWindowHeight() / (F32)screen_region.getHeight(); + F32 scale_x = (F32)gViewerWindow->getWindowWidthScaled() / (F32)screen_region.getWidth(); + F32 scale_y = (F32)gViewerWindow->getWindowHeightScaled() / (F32)screen_region.getHeight(); mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f)); mat.set_translate( - glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWindowWidth(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), - clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWindowHeight(), 0.5f * scale_y, -0.5f * scale_y), + glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWindowWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), + clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWindowHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), 0.f)); proj *= mat; @@ -1269,8 +1269,8 @@ void render_ui_2d() int pos_y = sub_region / llceil(zoom_factor); int pos_x = sub_region - (pos_y*llceil(zoom_factor)); // offset for this tile - LLFontGL::sCurOrigin.mX -= llround((F32)gViewerWindow->getWindowWidth() * (F32)pos_x / zoom_factor); - LLFontGL::sCurOrigin.mY -= llround((F32)gViewerWindow->getWindowHeight() * (F32)pos_y / zoom_factor); + LLFontGL::sCurOrigin.mX -= llround((F32)gViewerWindow->getWindowWidthScaled() * (F32)pos_x / zoom_factor); + LLFontGL::sCurOrigin.mY -= llround((F32)gViewerWindow->getWindowHeightScaled() * (F32)pos_y / zoom_factor); } stop_glerror(); @@ -1280,8 +1280,8 @@ void render_ui_2d() if (gAgent.getAvatarObject() && gAgent.mHUDCurZoom < 0.98f) { glPushMatrix(); - S32 half_width = (gViewerWindow->getWindowWidth() / 2); - S32 half_height = (gViewerWindow->getWindowHeight() / 2); + S32 half_width = (gViewerWindow->getWindowWidthScaled() / 2); + S32 half_height = (gViewerWindow->getWindowHeightScaled() / 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; @@ -1341,8 +1341,8 @@ void render_ui_2d() LLGLDisable cull(GL_CULL_FACE); LLGLDisable blend(GL_BLEND); - S32 width = gViewerWindow->getWindowWidth(); - S32 height = gViewerWindow->getWindowHeight(); + S32 width = gViewerWindow->getWindowWidthScaled(); + S32 height = gViewerWindow->getWindowHeightScaled(); gGL.getTexUnit(0)->bind(&gPipeline.mUIScreen); gGL.begin(LLRender::TRIANGLE_STRIP); gGL.color4f(1,1,1,1); @@ -1411,8 +1411,8 @@ void render_disconnected_background() } // Make sure the progress view always fills the entire window. - S32 width = gViewerWindow->getWindowWidth(); - S32 height = gViewerWindow->getWindowHeight(); + S32 width = gViewerWindow->getWindowWidthScaled(); + S32 height = gViewerWindow->getWindowHeightScaled(); if (gDisconnectedImagep) { diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index edbac69e1b888a74bdc7875fafe077a107506eb9..642df923795c303ab9c4b71afba8e8762f289569 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -109,9 +109,11 @@ #include "llfloaterwhitelistentry.h" #include "llfloaterwindlight.h" #include "llfloaterworldmap.h" +#include "llimfloatercontainer.h" #include "llinspectavatar.h" #include "llinspectgroup.h" #include "llinspectobject.h" +#include "llinspectremoteobject.h" #include "llmediaremotectrl.h" #include "llmoveview.h" #include "llnearbychat.h" @@ -123,6 +125,7 @@ #include "llpreviewsound.h" #include "llpreviewtexture.h" #include "llsyswellwindow.h" +#include "llscriptfloater.h" // *NOTE: Please add files in alphabetical order to keep merges easy. @@ -170,12 +173,15 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>); LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>); + LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>); + LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>); LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>); LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>); LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>); LLInspectAvatarUtil::registerFloater(); LLInspectGroupUtil::registerFloater(); LLInspectObjectUtil::registerFloater(); + LLInspectRemoteObjectUtil::registerFloater(); LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>); LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>); @@ -195,7 +201,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>); LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>); - + LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>); LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>); LLFloaterPayUtil::registerFloater(); diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index 384538364f04707df336d605fb570748855835e2..6aabcb11b82d0c7a6d03d3cf2a02001979661bb6 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -109,8 +109,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary() addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "inv_folder_clothing.tga")); addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "inv_folder_object.tga")); addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "inv_folder_notecard.tga")); - addEntry(LLFolderType::FT_CATEGORY, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga")); - addEntry(LLFolderType::FT_ROOT_CATEGORY, new ViewerFolderEntry("Inventory", "")); + addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "")); addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "inv_folder_script.tga")); addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "inv_folder_bodypart.tga")); addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "inv_folder_trash.tga")); diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp index 0e0727e38250e3fd02b4408eb7f449f0860277f9..056260791c4e5460c24c77c84e3ec888b19dff7f 100644 --- a/indra/newview/llviewerhelp.cpp +++ b/indra/newview/llviewerhelp.cpp @@ -39,6 +39,7 @@ #include "llviewercontrol.h" #include "llversionviewer.h" #include "llappviewer.h" +#include "lllogininstance.h" #include "llviewerhelputil.h" #include "llviewerhelp.h" @@ -51,17 +52,25 @@ void LLViewerHelp::showTopic(const std::string &topic) { showHelp(); + // allow overriding the help server with a local help file if( gSavedSettings.getBOOL("HelpUseLocal") ) { LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser")); helpbrowser->navigateToLocalPage( "help-offline" , "index.html" ); + return; } - else + + // use a special login topic before the user logs in + std::string help_topic = topic; + if (! LLLoginInstance::getInstance()->authSuccess()) { - const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo(); - std::string helpURL = LLViewerHelpUtil::buildHelpURL( topic, gSavedSettings, osinfo ); - setRawURL( helpURL ); + help_topic = preLoginTopic(); } + + // work out the URL for this topic and display it + const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo(); + std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic, gSavedSettings, osinfo ); + setRawURL( helpURL ); } std::string LLViewerHelp::defaultTopic() @@ -70,6 +79,12 @@ std::string LLViewerHelp::defaultTopic() return "this_is_fallbacktopic"; } +std::string LLViewerHelp::preLoginTopic() +{ + // *hack: to be done properly + return "pre_login_help"; +} + ////////////////////////////// // our own interfaces diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h index 17aab6f239738a75de2a2aa53bcd885cb1cf836b..dcb5ae32c98956b7349b37703e9adc723b2f9ffc 100644 --- a/indra/newview/llviewerhelp.h +++ b/indra/newview/llviewerhelp.h @@ -57,6 +57,9 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp> // return topic derived from viewer UI focus, else default topic std::string getTopicFromFocus(); + // return topic to use before the user logs in + std::string preLoginTopic(); + private: static void showHelp(); // make sure help UI is visible & raised static void setRawURL(std::string url); // send URL to help UI diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 1d62ead843729c6f052b28aa94d02c66399aea51..c6ec25c1cb307a39d64ff64d324680b1e5322e0e 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -56,11 +56,43 @@ #include "lltrans.h" #include "llappearancemgr.h" #include "llfloatercustomize.h" +#include "llcommandhandler.h" +#include "llviewermessage.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- +class LLInventoryHandler : public LLCommandHandler +{ +public: + // requires trusted browser to trigger + LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_THROTTLE) { } + + bool handle(const LLSD& params, const LLSD& query_map, + LLMediaCtrl* web) + { + if (params.size() < 2) return false; + LLUUID inventory_id; + if (!inventory_id.set(params[0], FALSE)) + { + return false; + } + + const std::string verb = params[1].asString(); + if (verb == "select") + { + std::vector<LLUUID> items_to_open; + items_to_open.push_back(inventory_id); + open_inventory_offer(items_to_open, ""); + return true; + } + + return false; + } +}; +LLInventoryHandler gInventoryHandler; + ///---------------------------------------------------------------------------- /// Class LLViewerInventoryItem ///---------------------------------------------------------------------------- @@ -1215,11 +1247,6 @@ void LLViewerInventoryItem::rename(const std::string& n) const LLPermissions& LLViewerInventoryItem::getPermissions() const { - if (const LLViewerInventoryItem *linked_item = getLinkedItem()) - { - return linked_item->getPermissions(); - } - // Use the actual permissions of the symlink, not its parent. return LLInventoryItem::getPermissions(); } @@ -1341,6 +1368,12 @@ BOOL LLViewerInventoryItem::extractSortFieldAndDisplayName(const std::string& na return result; } +void LLViewerInventoryItem::insertDefaultSortField(std::string& name) +{ + name.insert(0, std::string("1") + getSeparator()); +} + + // This returns true if the item that this item points to // doesn't exist in memory (i.e. LLInventoryModel). The baseitem // might still be in the database but just not loaded yet. diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 529425aa258800f09140cb71d7fc074acf62e65b..d27faffdd9e7c4417683e4b512a5b1e1ac79c0e6 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -81,6 +81,7 @@ class LLViewerInventoryItem : public LLInventoryItem, public boost::signals2::tr virtual U32 getCRC32() const; // really more of a checksum. static BOOL extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName); + static void insertDefaultSortField(std::string& name); // construct a complete viewer inventory item LLViewerInventoryItem(const LLUUID& uuid, const LLUUID& parent_uuid, diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 69650425cb437228f7dab228986e2114a56cf36a..8c41133a3a8636d59451d6f22a5ec9a2bd7472b5 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -32,6 +32,7 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" #include "llviewermedia.h" #include "llviewermediafocus.h" #include "llmimetypes.h" @@ -54,6 +55,8 @@ #include <boost/bind.hpp> // for SkinFolder listener #include <boost/signals2.hpp> +/*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "AutoPlayMedia"; + // Move this to its own file. LLViewerMediaEventEmitter::~LLViewerMediaEventEmitter() @@ -135,9 +138,19 @@ LOG_CLASS(LLMimeDiscoveryResponder); LLMimeDiscoveryResponder( viewer_media_t media_impl) : mMediaImpl(media_impl), mInitialized(false) - {} - + { + if(mMediaImpl->mMimeTypeProbe != NULL) + { + llerrs << "impl already has an outstanding responder" << llendl; + } + + mMediaImpl->mMimeTypeProbe = this; + } + ~LLMimeDiscoveryResponder() + { + disconnectOwner(); + } virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content) { @@ -149,23 +162,63 @@ LOG_CLASS(LLMimeDiscoveryResponder); virtual void error( U32 status, const std::string& reason ) { - // completeAny(status, "none/none"); + if(status == 401) + { + // This is the "you need to authenticate" status. + // Treat this like an html page. + completeAny(status, "text/html"); + } + else + { + llwarns << "responder failed with status " << status << ", reason " << reason << llendl; + + if(mMediaImpl) + { + mMediaImpl->mMediaSourceFailed = true; + } + } } void completeAny(U32 status, const std::string& mime_type) { - if(!mInitialized && ! mime_type.empty()) + // the call to initializeMedia may disconnect the responder, which will clear mMediaImpl. + // Make a local copy so we can call loadURI() afterwards. + LLViewerMediaImpl *impl = mMediaImpl; + + if(impl && !mInitialized && ! mime_type.empty()) { - if(mMediaImpl->initializeMedia(mime_type)) + if(impl->initializeMedia(mime_type)) { mInitialized = true; - mMediaImpl->loadURI(); + impl->loadURI(); + disconnectOwner(); } } } + + void cancelRequest() + { + disconnectOwner(); + } + +private: + void disconnectOwner() + { + if(mMediaImpl) + { + if(mMediaImpl->mMimeTypeProbe != this) + { + llerrs << "internal error: mMediaImpl->mMimeTypeProbe != this" << llendl; + } - public: - viewer_media_t mMediaImpl; + mMediaImpl->mMimeTypeProbe = NULL; + } + mMediaImpl = NULL; + } + + +public: + LLViewerMediaImpl *mMediaImpl; bool mInitialized; }; static LLViewerMedia::impl_list sViewerMediaImplList; @@ -225,7 +278,7 @@ viewer_media_t LLViewerMedia::newMediaImpl( } else { - media_impl->stop(); + media_impl->unload(); media_impl->mTextureId = texture_id; media_impl->mMediaWidth = media_width; media_impl->mMediaHeight = media_height; @@ -240,7 +293,12 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s { // Try to find media with the same media ID viewer_media_t media_impl = getMediaImplFromTextureID(media_entry->getMediaID()); - + + lldebugs << "called, current URL is \"" << media_entry->getCurrentURL() + << "\", previous URL is \"" << previous_url + << "\", update_from_self is " << (update_from_self?"true":"false") + << llendl; + bool was_loaded = false; bool needs_navigate = false; @@ -261,21 +319,32 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels()); } + bool url_changed = (media_entry->getCurrentURL() != previous_url); if(media_entry->getCurrentURL().empty()) { - // The current media URL is now empty. Unload the media source. - media_impl->unload(); + if(url_changed) + { + // The current media URL is now empty. Unload the media source. + media_impl->unload(); + + lldebugs << "Unloading media instance (new current URL is empty)." << llendl; + } } else { // 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_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING)); - if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self) + if((was_loaded || auto_play) && !update_from_self) { - needs_navigate = (media_entry->getCurrentURL() != previous_url); + needs_navigate = url_changed; } + + lldebugs << "was_loaded is " << (was_loaded?"true":"false") + << ", auto_play is " << (auto_play?"true":"false") + << ", needs_navigate is " << (needs_navigate?"true":"false") << llendl; } } else @@ -289,17 +358,30 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s media_impl->setHomeURL(media_entry->getHomeURL()); - if(media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia")) + if(media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING)) { needs_navigate = true; } } - if(media_impl && needs_navigate) + if(media_impl) { std::string url = media_entry->getCurrentURL(); - - media_impl->navigateTo(url, "", true, true); + if(needs_navigate) + { + media_impl->navigateTo(url, "", true, true); + lldebugs << "navigating to URL " << url << llendl; + } + else if(!media_impl->mMediaURL.empty() && (media_impl->mMediaURL != url)) + { + // If we already have a non-empty media URL set and we aren't doing a navigate, update the media URL to match the media entry. + media_impl->mMediaURL = url; + + // If this causes a navigate at some point (such as after a reload), it should be considered server-driven so it isn't broadcast. + media_impl->mNavigateServerRequest = true; + + lldebugs << "updating URL in the media impl to " << url << llendl; + } } return media_impl; @@ -479,6 +561,16 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView // The item with user focus always comes to the front of the list, period. return false; } + else if(i1->isParcelMedia()) + { + // The parcel media impl sorts above all other inworld media, unless one has focus. + return true; + } + else if(i2->isParcelMedia()) + { + // The parcel media impl sorts above all other inworld media, unless one has focus. + return false; + } else if(i1->getUsedInUI() && !i2->getUsedInUI()) { // i1 is a UI element, i2 is not. This makes i1 "less than" i2, so it sorts earlier in our list. @@ -489,16 +581,21 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView // i2 is a UI element, i1 is not. This makes i2 "less than" i1, so it sorts earlier in our list. return false; } - else if(i1->isParcelMedia()) + else if(i1->isPlayable() && !i2->isPlayable()) { - // The parcel media impl sorts above all other inworld media, unless one has focus. + // Playable items sort above ones that wouldn't play even if they got high enough priority return true; } - else if(i2->isParcelMedia()) + else if(!i1->isPlayable() && i2->isPlayable()) { - // The parcel media impl sorts above all other inworld media, unless one has focus. + // Playable items sort above ones that wouldn't play even if they got high enough priority return false; } + else if(i1->getInterest() == i2->getInterest()) + { + // Generally this will mean both objects have zero interest. In this case, sort on distance. + return (i1->getProximityDistance() < i2->getProximityDistance()); + } else { // The object with the larger interest value should be earlier in the list, so we reverse the sense of the comparison here. @@ -506,6 +603,11 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView } } +static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2) +{ + return (i1->getProximityDistance() < i2->getProximityDistance()); +} + ////////////////////////////////////////////////////////////////////////////////////////// // static void LLViewerMedia::updateMedia() @@ -531,12 +633,9 @@ void LLViewerMedia::updateMedia() int impl_count_total = 0; int impl_count_interest_low = 0; int impl_count_interest_normal = 0; - int i = 0; - -#if 0 - LL_DEBUGS("PluginPriority") << "Sorted impls:" << llendl; -#endif - + + std::vector<LLViewerMediaImpl*> proximity_order; + U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal"); U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal"); U32 max_low = gSavedSettings.getU32("PluginInstancesLow"); @@ -567,10 +666,12 @@ void LLViewerMedia::updateMedia() else if(pimpl->hasFocus()) { new_priority = LLPluginClassMedia::PRIORITY_HIGH; + impl_count_interest_normal++; // count this against the count of "normal" instances for priority purposes } else if(pimpl->getUsedInUI()) { new_priority = LLPluginClassMedia::PRIORITY_NORMAL; + impl_count_interest_normal++; } else { @@ -578,7 +679,17 @@ void LLViewerMedia::updateMedia() // Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture, // turn it down to low instead of normal. This may downsample for plugins that support it. - bool media_is_small = pimpl->getInterest() < (pimpl->getApproximateTextureInterest() / 4); + bool media_is_small = false; + F64 approximate_interest = pimpl->getApproximateTextureInterest(); + if(approximate_interest == 0.0f) + { + // this media has no current size, which probably means it's not loaded. + media_is_small = true; + } + else if(pimpl->getInterest() < (approximate_interest / 4)) + { + media_is_small = true; + } if(pimpl->getInterest() == 0.0f) { @@ -616,7 +727,7 @@ void LLViewerMedia::updateMedia() } } - if(new_priority != LLPluginClassMedia::PRIORITY_UNLOADED) + if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED)) { impl_count_total++; } @@ -630,23 +741,27 @@ void LLViewerMedia::updateMedia() } else { - // Other impls just get the same ordering as the priority list (for now). - pimpl->mProximity = i; + proximity_order.push_back(pimpl); } -#if 0 - LL_DEBUGS("PluginPriority") << " " << pimpl - << ", setting priority to " << new_priority - << (pimpl->hasFocus()?", HAS FOCUS":"") - << (pimpl->getUsedInUI()?", is UI":"") - << ", cpu " << pimpl->getCPUUsage() - << ", interest " << pimpl->getInterest() - << ", media url " << pimpl->getMediaURL() << llendl; -#endif - total_cpu += pimpl->getCPUUsage(); - - i++; + } + + if(gSavedSettings.getBOOL("MediaPerformanceManagerDebug")) + { + // Give impls the same ordering as the priority list + // they're already in the right order for this. + } + else + { + // Use a distance-based sort for proximity values. + std::stable_sort(proximity_order.begin(), proximity_order.end(), proximity_comparitor); + } + + // Transfer the proximity order to the proximity fields in the objects. + for(int i = 0; i < (int)proximity_order.size(); i++) + { + proximity_order[i]->mProximity = i; } LL_DEBUGS("PluginPriority") << "Total reported CPU usage is " << total_cpu << llendl; @@ -698,6 +813,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, mIsDisabled(false), mIsParcelMedia(false), mProximity(-1), + mProximityDistance(0.0f), + mMimeTypeProbe(NULL), mIsUpdated(false) { @@ -801,7 +918,9 @@ void LLViewerMediaImpl::destroyMediaSource() { oldImage->setPlaying(FALSE) ; } - + + cancelMimeTypeProbe(); + if(mMediaSource) { delete mMediaSource; @@ -847,7 +966,7 @@ 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)) + if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"))) { return media_source; } @@ -992,15 +1111,7 @@ void LLViewerMediaImpl::stop() { if(mMediaSource) { - if(mMediaSource->pluginSupportsMediaBrowser()) - { - mMediaSource->browse_stop(); - } - else - { - mMediaSource->stop(); - } - + mMediaSource->stop(); // destroyMediaSource(); } } @@ -1032,6 +1143,40 @@ void LLViewerMediaImpl::seek(F32 time) } } +////////////////////////////////////////////////////////////////////////////////////////// +void LLViewerMediaImpl::skipBack(F32 step_scale) +{ + if(mMediaSource) + { + if(mMediaSource->pluginSupportsMediaTime()) + { + F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale); + if(back_step < 0.0) + { + back_step = 0.0; + } + mMediaSource->seek(back_step); + } + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +void LLViewerMediaImpl::skipForward(F32 step_scale) +{ + if(mMediaSource) + { + if(mMediaSource->pluginSupportsMediaTime()) + { + F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale); + if(forward_step > mMediaSource->getDuration()) + { + forward_step = mMediaSource->getDuration(); + } + mMediaSource->seek(forward_step); + } + } +} + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::setVolume(F32 volume) { @@ -1133,11 +1278,15 @@ void LLViewerMediaImpl::mouseMove(S32 x, S32 y, MASK mask) void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords, MASK mask, S32 button) { if(mMediaSource) - { - mouseDown( - llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()), - llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()), - mask, button); + { + // scale x and y to texel units. + S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); + S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); + + // Adjust for the difference between the actual texture height and the amount of the texture in use. + y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + + mouseDown(x, y, mask, button); } } @@ -1145,10 +1294,14 @@ void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32 { if(mMediaSource) { - mouseUp( - llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()), - llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()), - mask, button); + // scale x and y to texel units. + S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); + S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); + + // Adjust for the difference between the actual texture height and the amount of the texture in use. + y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + + mouseUp(x, y, mask, button); } } @@ -1156,10 +1309,14 @@ void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask) { if(mMediaSource) { - mouseMove( - llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()), - llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()), - mask); + // scale x and y to texel units. + S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()); + S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()); + + // Adjust for the difference between the actual texture height and the amount of the texture in use. + y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight()); + + mouseMove(x, y, mask); } } @@ -1227,21 +1384,7 @@ void LLViewerMediaImpl::navigateBack() { if (mMediaSource) { - if(mMediaSource->pluginSupportsMediaTime()) - { - F64 step_scale = 0.02; // temp , can be changed - F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale); - if(back_step < 0.0) - { - back_step = 0.0; - } - mMediaSource->seek(back_step); - //mMediaSource->start(-2.0); - } - else - { - mMediaSource->browse_back(); - } + mMediaSource->browse_back(); } } @@ -1250,21 +1393,7 @@ void LLViewerMediaImpl::navigateForward() { if (mMediaSource) { - if(mMediaSource->pluginSupportsMediaTime()) - { - F64 step_scale = 0.02; // temp , can be changed - F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale); - if(forward_step > mMediaSource->getDuration()) - { - forward_step = mMediaSource->getDuration(); - } - mMediaSource->seek(forward_step); - //mMediaSource->start(2.0); - } - else - { - mMediaSource->browse_forward(); - } + mMediaSource->browse_forward(); } } @@ -1294,6 +1423,8 @@ void LLViewerMediaImpl::unload() ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type, bool rediscover_type, bool server_request) { + cancelMimeTypeProbe(); + if(mMediaURL != url) { // Don't carry media play state across distinct URLs. @@ -1336,6 +1467,12 @@ void LLViewerMediaImpl::navigateInternal() // Helpful to have media urls in log file. Shouldn't be spammy. llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl; + if(mMimeTypeProbe != NULL) + { + llwarns << "MIME type probe already in progress -- bailing out." << llendl; + return; + } + if(mNavigateServerRequest) { setNavState(MEDIANAVSTATE_SERVER_SENT); @@ -1368,7 +1505,7 @@ void LLViewerMediaImpl::navigateInternal() if(scheme.empty() || "http" == scheme || "https" == scheme) { - LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this)); + LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f); } else if("data" == scheme || "file" == scheme || "about" == scheme) { @@ -1405,7 +1542,6 @@ void LLViewerMediaImpl::navigateStop() { mMediaSource->browse_stop(); } - } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1499,7 +1635,19 @@ void LLViewerMediaImpl::update() { if(mMediaSource == NULL) { - if(mPriority != LLPluginClassMedia::PRIORITY_UNLOADED) + if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED) + { + // This media source should not be loaded. + } + else if(mPriority <= LLPluginClassMedia::PRIORITY_SLIDESHOW) + { + // Don't load new instances that are at PRIORITY_SLIDESHOW or below. They're just kept around to preserve state. + } + else if(mMimeTypeProbe != NULL) + { + // this media source is doing a MIME type probe -- don't try loading it again. + } + else { // This media may need to be loaded. if(sMediaCreateTimer.hasExpired()) @@ -1622,7 +1770,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage() // MEDIAOPT: seems insane that we actually have to make an imageraw then // immediately discard it LLPointer<LLImageRaw> raw = new LLImageRaw(texture_width, texture_height, texture_depth); - raw->clear(0x0f, 0x0f, 0x0f, 0xff); + raw->clear(0x00, 0x00, 0x00, 0xff); int discard_level = 0; // ask media source for correct GL image format constants @@ -1723,7 +1871,7 @@ bool LLViewerMediaImpl::isMediaPaused() ////////////////////////////////////////////////////////////////////////////////////////// // -bool LLViewerMediaImpl::hasMedia() +bool LLViewerMediaImpl::hasMedia() const { return mMediaSource != NULL; } @@ -1757,6 +1905,31 @@ bool LLViewerMediaImpl::isForcedUnloaded() const return false; } +////////////////////////////////////////////////////////////////////////////////////////// +// +bool LLViewerMediaImpl::isPlayable() const +{ + if(isForcedUnloaded()) + { + // All of the forced-unloaded criteria also imply not playable. + return false; + } + + if(hasMedia()) + { + // Anything that's already playing is, by definition, playable. + return true; + } + + if(!mMediaURL.empty()) + { + // If something has navigated the instance, it's ready to be played. + return true; + } + + return false; +} + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event) { @@ -1965,6 +2138,15 @@ void LLViewerMediaImpl::calculateInterest() mInterest = 0.0f; } + // Calculate distance from the avatar, for use in the proximity calculation. + mProximityDistance = 0.0f; + 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(); + mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same. + } + if(mNeedsMuteCheck) { // Check all objects this instance is associated with, and those objects' owners, against the mute list @@ -2001,7 +2183,13 @@ F64 LLViewerMediaImpl::getApproximateTextureInterest() result = mMediaSource->getFullWidth(); result *= mMediaSource->getFullHeight(); } - + else + { + // No media source is loaded -- all we have to go on is the texture size that has been set on the impl, if any. + result = mMediaWidth; + result *= mMediaHeight; + } + return result; } @@ -2042,7 +2230,7 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority) { if(mPriority != priority) { - LL_INFOS("PluginPriority") + LL_DEBUGS("PluginPriority") << "changing priority of media id " << mTextureId << " from " << LLPluginClassMedia::priorityToString(mPriority) << " to " << LLPluginClassMedia::priorityToString(priority) @@ -2098,6 +2286,21 @@ void LLViewerMediaImpl::setNavState(EMediaNavState state) } } +void LLViewerMediaImpl::cancelMimeTypeProbe() +{ + if(mMimeTypeProbe != NULL) + { + // There doesn't seem to be a way to actually cancel an outstanding request. + // Simulate it by telling the LLMimeDiscoveryResponder not to write back any results. + mMimeTypeProbe->cancelRequest(); + + // The above should already have set mMimeTypeProbe to NULL. + if(mMimeTypeProbe != NULL) + { + llerrs << "internal error: mMimeTypeProbe is not NULL after cancelling request." << llendl; + } + } +} void LLViewerMediaImpl::addObject(LLVOVolume* obj) { diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 3f5f3ca746c1a0979f2a961f66c775237505ab97..ac12112ed416d2d5a052ac63d8069907ccc3b754 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -48,6 +48,7 @@ class LLUUID; class LLViewerMediaTexture; class LLMediaEntry; class LLVOVolume ; +class LLMimeDiscoveryResponder; typedef LLPointer<LLViewerMediaImpl> viewer_media_t; /////////////////////////////////////////////////////////////////////////////// @@ -73,6 +74,9 @@ class LLViewerMedia LOG_CLASS(LLViewerMedia); public: + // String to get/set media autoplay in gSavedSettings + static const char *AUTO_PLAY_MEDIA_SETTING; + typedef std::vector<LLViewerMediaImpl*> impl_list; // Special case early init for just web browser component @@ -145,6 +149,8 @@ class LLViewerMediaImpl void pause(); void start(); void seek(F32 time); + void skipBack(F32 step_scale); + void skipForward(F32 step_scale); void setVolume(F32 volume); void updateVolume(); F32 getVolume(); @@ -190,7 +196,7 @@ class LLViewerMediaImpl bool isMediaPlaying(); bool isMediaPaused(); - bool hasMedia(); + bool hasMedia() const; bool isMediaFailed() const { return mMediaSourceFailed; }; void resetPreviousMediaState(); @@ -200,6 +206,9 @@ class LLViewerMediaImpl // returns true if this instance should not be loaded (disabled, muted object, crashed, etc.) bool isForcedUnloaded() const; + // 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; }; @@ -263,6 +272,7 @@ class LLViewerMediaImpl F64 getInterest() const { return mInterest; }; F64 getApproximateTextureInterest(); S32 getProximity() const { return mProximity; }; + F64 getProximityDistance() const { return mProximityDistance; }; // Mark this object as being used in a UI panel instead of on a prim // This will be used as part of the interest sorting algorithm. @@ -294,6 +304,7 @@ class LLViewerMediaImpl EMediaNavState getNavState() { return mMediaNavState; } void setNavState(EMediaNavState state); + void cancelMimeTypeProbe(); public: // a single media url with some data and an impl. LLPluginClassMedia* mMediaSource; @@ -331,7 +342,9 @@ class LLViewerMediaImpl bool mIsDisabled; bool mIsParcelMedia; S32 mProximity; - + F64 mProximityDistance; + LLMimeDiscoveryResponder *mMimeTypeProbe; + private: BOOL mIsUpdated ; std::list< LLVOVolume* > mObjectList ; diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 70a7d835a36da1b256496b40a771f60a7a78cf32..fd74c9c2fcad2a2436a15fbe4114bc06a0ad3fea 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -120,10 +120,20 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac // We must do this before processing the media HUD zoom, or it may zoom to the wrong face. update(); - if(mMediaControls.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom()) + if(mMediaControls.get()) { - mMediaControls.get()->resetZoomLevel(); - mMediaControls.get()->nextZoomLevel(); + if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom()) + { + // Zoom in on this face + mMediaControls.get()->resetZoomLevel(); + mMediaControls.get()->nextZoomLevel(); + } + else + { + // Reset the controls' zoom level without moving the camera. + // This fixes the case where clicking focus between two non-autozoom faces doesn't change the zoom-out button back to a zoom-in button. + mMediaControls.get()->resetZoomLevel(false); + } } } else @@ -132,7 +142,8 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac { if(mMediaControls.get()) { - mMediaControls.get()->resetZoomLevel(); + // Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom. + mMediaControls.get()->resetZoomLevel(false); } } @@ -292,6 +303,15 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent) if (key == KEY_ESCAPE) { + // Reset camera zoom in this case. + if(mFocusedImplID.notNull()) + { + if(mMediaControls.get()) + { + mMediaControls.get()->resetZoomLevel(true); + } + } + clearFocus(); } } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 97879046a055e547419e5f2abd0481495a3314ff..8bcf2c62815445a9f8b449c8ed73b1514375ca48 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -415,7 +415,7 @@ class LLMenuParcelObserver : public LLParcelObserver static LLMenuParcelObserver* gMenuParcelObserver = NULL; -static LLUIListener sUIListener("UI"); +static LLUIListener sUIListener; LLMenuParcelObserver::LLMenuParcelObserver() { @@ -1879,7 +1879,9 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t { bool handleEvent(const LLSD& userdata) { +#ifndef LL_RELEASE_FOR_DOWNLOAD handle_debug_avatar_textures(NULL); +#endif return true; } }; @@ -1893,7 +1895,9 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t { bool handleEvent(const LLSD& userdata) { +#ifndef LL_RELEASE_FOR_DOWNLOAD handle_dump_avatar_local_textures(NULL); +#endif return true; } }; @@ -2729,15 +2733,26 @@ bool enable_object_edit() // there. Eventually this needs to be replaced with code that only // lets you edit objects if you have permission to do so (edit perms, // group edit, god). See also lltoolbar.cpp. JC - bool enable = true; + bool enable = false; if (gAgent.inPrelude()) { - enable = LLViewerParcelMgr::getInstance()->agentCanBuild() + enable = LLViewerParcelMgr::getInstance()->allowAgentBuild() || LLSelectMgr::getInstance()->getSelection()->isAttachment(); + } + else if (LLSelectMgr::getInstance()->selectGetModify()) + { + enable = true; } + return enable; } +// mutually exclusive - show either edit option or build in menu +bool enable_object_build() +{ + return !enable_object_edit(); +} + class LLSelfRemoveAllAttachments : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -3797,7 +3812,7 @@ class LLViewDefaultUISize : public view_listener_t { gSavedSettings.setF32("UIScaleFactor", 1.0f); gSavedSettings.setBOOL("UIAutoScale", FALSE); - gViewerWindow->reshape(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); + gViewerWindow->reshape(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); return true; } }; @@ -3875,8 +3890,7 @@ void god_force_inv_owner_permissive(LLViewerObject* object, InventoryObjectList::const_iterator inv_end = inventory->end(); for ( ; inv_it != inv_end; ++inv_it) { - if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY) - && ((*inv_it)->getType() != LLAssetType::AT_ROOT_CATEGORY)) + if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY)) { LLInventoryObject* obj = *inv_it; LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj); @@ -5186,7 +5200,7 @@ void show_debug_menus() gMenuBarView->setItemEnabled("Develop", qamode); // Server ('Admin') menu hidden when not in godmode. - const bool show_server_menu = debug && (gAgent.getGodLevel() > GOD_NOT || gAgent.getAdminOverride()); + const bool show_server_menu = (gAgent.getGodLevel() > GOD_NOT || (debug && gAgent.getAdminOverride())); gMenuBarView->setItemVisible("Admin", show_server_menu); gMenuBarView->setItemEnabled("Admin", show_server_menu); } @@ -5664,6 +5678,16 @@ class LLFloaterVisible : public view_listener_t } }; +class LLShowSidetrayPanel : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string panel_name = userdata.asString(); + LLSideTray::getInstance()->showPanel(panel_name, LLSD()); + return true; + } +}; + bool callback_show_url(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); @@ -6082,7 +6106,7 @@ class LLAttachmentEnableDrop : public view_listener_t { bool handleEvent(const LLSD& userdata) { - BOOL can_build = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->agentCanBuild()); + BOOL can_build = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->allowAgentBuild()); //Add an inventory observer to only allow dropping the newly attached item //once it exists in your inventory. Look at Jira 2422. @@ -6420,13 +6444,13 @@ void handle_selected_texture_info(void*) void handle_test_male(void*) { - LLAppearanceManager::wearOutfitByName("Male Shape & Outfit"); + LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit"); //gGestureList.requestResetFromServer( TRUE ); } void handle_test_female(void*) { - LLAppearanceManager::wearOutfitByName("Female Shape & Outfit"); + LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit"); //gGestureList.requestResetFromServer( FALSE ); } @@ -7860,10 +7884,8 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedCheckDebugCharacterVis(), "Advanced.CheckDebugCharacterVis"); view_listener_t::addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments"); view_listener_t::addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures"); - #ifndef LL_RELEASE_FOR_DOWNLOAD view_listener_t::addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures"); view_listener_t::addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures"); - #endif // Advanced > Network view_listener_t::addMenu(new LLAdvancedEnableMessageLog(), "Advanced.EnableMessageLog"); view_listener_t::addMenu(new LLAdvancedDisableMessageLog(), "Advanced.DisableMessageLog"); @@ -8022,9 +8044,12 @@ void initialize_menus() visible.add("VisiblePayObject", boost::bind(&enable_pay_object)); enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar)); enable.add("EnableEdit", boost::bind(&enable_object_edit)); + visible.add("VisibleBuild", boost::bind(&enable_object_build)); + visible.add("VisibleEdit", boost::bind(&enable_object_edit)); visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit)); view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible"); + view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel"); 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/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d17c7e486feab21400b49b85d475103565eb3b46..753acab172b84a21d8e16eba388516ef52855bf1 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -404,8 +404,8 @@ class LLFileTakeSnapshotToDisk : public view_listener_t { LLPointer<LLImageRaw> raw = new LLImageRaw; - S32 width = gViewerWindow->getWindowDisplayWidth(); - S32 height = gViewerWindow->getWindowDisplayHeight(); + S32 width = gViewerWindow->getWindowWidthRaw(); + S32 height = gViewerWindow->getWindowHeightRaw(); if (gSavedSettings.getBOOL("HighResSnapshot")) { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ea1097c47794aa8c03956684e35f75a66c9a8e0b..adad06dc6f1b52e5b260ff2ce4dffe4b71765a13 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -43,7 +43,7 @@ #include "llfloaterbump.h" #include "llassetstorage.h" #include "llcachename.h" -#include "llchat.h" + #include "lldbstrings.h" #include "lleconomy.h" #include "llfilepicker.h" @@ -89,6 +89,7 @@ #include "llhudeffecttrail.h" #include "llhudmanager.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llmenugl.h" @@ -100,6 +101,7 @@ #include "llpanelgrouplandmoney.h" #include "llpanelplaces.h" #include "llrecentpeople.h" +#include "llscriptfloater.h" #include "llselectmgr.h" #include "llsidetray.h" #include "llstartup.h" @@ -115,6 +117,7 @@ #include "llui.h" // for make_ui_sound #include "lluploaddialog.h" #include "llviewercamera.h" +#include "llviewerchat.h" #include "llviewergenericmessage.h" #include "llviewerinventory.h" #include "llviewermenu.h" @@ -167,7 +170,6 @@ static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds extern BOOL gDebugClicks; // function prototypes -void open_offer(const std::vector<LLUUID>& items, const std::string& from_name); bool check_offer_throttle(const std::string& from_name, bool check_only); //inventory offer throttle globals @@ -724,7 +726,7 @@ class LLOpenAgentOffer : public LLInventoryFetchObserver LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {} /*virtual*/ void done() { - open_offer(mComplete, mFromName); + open_inventory_offer(mComplete, mFromName); gInventory.removeObserver(this); delete this; } @@ -742,7 +744,7 @@ class LLOpenTaskOffer : public LLInventoryAddedObserver protected: /*virtual*/ void done() { - open_offer(mAdded, ""); + open_inventory_offer(mAdded, ""); mAdded.clear(); } }; @@ -873,7 +875,7 @@ bool check_offer_throttle(const std::string& from_name, bool check_only) } } -void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) +void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name) { std::vector<LLUUID>::const_iterator it = items.begin(); std::vector<LLUUID>::const_iterator end = items.end(); @@ -937,6 +939,11 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) !from_name.empty()) { view = LLFloaterInventory::showAgentInventory(); + //TODO:this should be moved to the end of method after all the checks, + //but first decide what to do with active inventory if any (EK) + LLSD key; + key["select"] = item->getUUID(); + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); } else { @@ -1058,12 +1065,60 @@ LLSD LLOfferInfo::asLLSD() return sd; } +void LLOfferInfo::send_auto_receive_response(void) +{ + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ImprovedInstantMessage); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_MessageBlock); + msg->addBOOLFast(_PREHASH_FromGroup, FALSE); + msg->addUUIDFast(_PREHASH_ToAgentID, mFromID); + msg->addU8Fast(_PREHASH_Offline, IM_ONLINE); + msg->addUUIDFast(_PREHASH_ID, mTransactionID); + msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary + std::string name; + LLAgentUI::buildFullname(name); + msg->addStringFast(_PREHASH_FromAgentName, name); + msg->addStringFast(_PREHASH_Message, ""); + msg->addU32Fast(_PREHASH_ParentEstateID, 0); + msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); + msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); + + // Auto Receive Message. The math for the dialog works, because the accept + // for inventory_offered, task_inventory_offer or + // group_notice_inventory is 1 greater than the offer integer value. + // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, + // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED + msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1)); + msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData), + sizeof(mFolderID.mData)); + // send the message + msg->sendReliable(mHost); + + if(IM_INVENTORY_OFFERED == mIM) + { + // add buddy to recent people list + LLRecentPeople::instance().add(mFromID); + } +} + bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response) - { +{ LLChat chat; std::string log_message; S32 button = LLNotification::getSelectedOption(notification, response); - + + LLInventoryObserver* opener = NULL; + LLViewerInventoryCategory* catp = NULL; + catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID); + LLViewerInventoryItem* itemp = NULL; + if(!catp) + { + itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID); + } + // For muting, we need to add the mute, then decline the offer. // This must be done here because: // * callback may be called immediately, @@ -1074,6 +1129,136 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback); } + std::string from_string; // Used in the pop-up. + std::string chatHistory_string; // Used in chat history. + + // TODO: when task inventory offers can also be handled the new way, migrate the code that sets these strings here: + from_string = chatHistory_string = mFromName; + + bool busy=FALSE; + + switch(button) + { + case IOR_SHOW: + // we will want to open this item when it comes back. + LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID + << LL_ENDL; + switch (mIM) + { + case IM_INVENTORY_OFFERED: + { + // 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())) + { + open_agent_offer->done(); + } + else + { + opener = open_agent_offer; + } + } + break; + case IM_TASK_INVENTORY_OFFERED: + case IM_GROUP_NOTICE: + case IM_GROUP_NOTICE_REQUESTED: + // This is an offer from a task or group. + // We don't use a new instance of an opener + // We instead use the singular observer gOpenTaskOffer + // Since it already exists, we don't need to actually do anything + break; + default: + LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL; + break; + } // end switch (mIM) + + // Show falls through to accept. + + case IOR_ACCEPT: + //don't spam them if they are getting flooded + if (check_offer_throttle(mFromName, true)) + { + log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); + chat.mText = log_message; + LLFloaterChat::addChatHistory(chat); + } + break; + + case IOR_BUSY: + //Busy falls through to decline. Says to make busy message. + busy=TRUE; + case IOR_MUTE: + // MUTE falls through to decline + case IOR_DECLINE: + { + log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; + chat.mText = log_message; + if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269 + { + chat.mMuted = TRUE; + } + 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())) + { + discard_agent_offer->done(); + } + else + { + opener = discard_agent_offer; + } + + + if (busy && (!mFromGroup && !mFromObject)) + { + busy_message(gMessageSystem, mFromID); + } + break; + } + default: + // close button probably + // The item has already been fetched and is in your inventory, we simply won't highlight it + // OR delete it if the notification gets killed, since we don't want that to be a vector for + // losing inventory offers. + break; + } + + if(opener) + { + gInventory.addObserver(opener); + } + + delete this; + return false; +} + +bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const LLSD& response) +{ + LLChat chat; + std::string log_message; + S32 button = LLNotification::getSelectedOption(notification, response); + + // For muting, we need to add the mute, then decline the offer. + // This must be done here because: + // * callback may be called immediately, + // * adding the mute sends a message, + // * we can't build two messages at once. + if (2 == button) + { + gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback); + } + LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_ImprovedInstantMessage); msg->nextBlockFast(_PREHASH_AgentData); @@ -1100,7 +1285,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& { itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID); } - + std::string from_string; // Used in the pop-up. std::string chatHistory_string; // Used in chat history. if (mFromObject == TRUE) @@ -1111,16 +1296,16 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& if (gCacheName->getGroupName(mFromID, group_name)) { from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" - + mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup") - + " "+ "'" + group_name + "'"; + + mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup") + + " "+ "'" + group_name + "'"; chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByGroup") - + " " + group_name + "'"; + + " " + group_name + "'"; } else { from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" - + mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup"); + + mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup"); chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownGroup"); } } @@ -1130,13 +1315,13 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& if (gCacheName->getName(mFromID, first_name, last_name)) { from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName - + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name; + + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name; chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name; } else { from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+LLTrans::getString("'") - + mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser"); + + mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser"); chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownUser"); } } @@ -1150,137 +1335,90 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& switch(button) { - case IOR_ACCEPT: - // ACCEPT. The math for the dialog works, because the accept - // for inventory_offered, task_inventory_offer or - // group_notice_inventory is 1 greater than the offer integer value. - // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, - // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED - msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1)); - msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData), - sizeof(mFolderID.mData)); - // send the message - msg->sendReliable(mHost); - - //don't spam them if they are getting flooded - if (check_offer_throttle(mFromName, true)) - { - log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); - chat.mText = log_message; - LLFloaterChat::addChatHistory(chat); - } - - // we will want to open this item when it comes back. - LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID - << LL_ENDL; - switch (mIM) - { - case IM_INVENTORY_OFFERED: - { - // 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())) + case IOR_ACCEPT: + // ACCEPT. The math for the dialog works, because the accept + // for inventory_offered, task_inventory_offer or + // group_notice_inventory is 1 greater than the offer integer value. + // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, + // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED + msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1)); + msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData), + sizeof(mFolderID.mData)); + // send the message + msg->sendReliable(mHost); + + //don't spam them if they are getting flooded + if (check_offer_throttle(mFromName, true)) { - open_agent_offer->done(); + log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); + chat.mText = log_message; + LLFloaterChat::addChatHistory(chat); } - else + + // we will want to open this item when it comes back. + LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID + << LL_ENDL; + switch (mIM) + { + case IM_TASK_INVENTORY_OFFERED: + case IM_GROUP_NOTICE: + case IM_GROUP_NOTICE_REQUESTED: { - opener = open_agent_offer; + // This is an offer from a task or group. + // We don't use a new instance of an opener + // We instead use the singular observer gOpenTaskOffer + // Since it already exists, we don't need to actually do anything } - } + break; + default: + LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL; + break; + } // end switch (mIM) break; - case IM_TASK_INVENTORY_OFFERED: - case IM_GROUP_NOTICE: - case IM_GROUP_NOTICE_REQUESTED: - { - // This is an offer from a task or group. - // We don't use a new instance of an opener - // We instead use the singular observer gOpenTaskOffer - // Since it already exists, we don't need to actually do anything - } - break; + + case IOR_BUSY: + //Busy falls through to decline. Says to make busy message. + busy=TRUE; + case IOR_MUTE: + // MUTE falls through to decline + case IOR_DECLINE: + // DECLINE. The math for the dialog works, because the decline + // for inventory_offered, task_inventory_offer or + // group_notice_inventory is 2 greater than the offer integer value. + // Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED, + // or IM_GROUP_NOTICE_INVENTORY_DECLINED default: - LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL; - break; - } // end switch (mIM) - break; - - case IOR_BUSY: - //Busy falls through to decline. Says to make busy message. - busy=TRUE; - case IOR_MUTE: - // MUTE falls through to decline - case IOR_DECLINE: - // DECLINE. The math for the dialog works, because the decline - // for inventory_offered, task_inventory_offer or - // group_notice_inventory is 2 greater than the offer integer value. - // Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED, - // or IM_GROUP_NOTICE_INVENTORY_DECLINED - default: - // close button probably (or any of the fall-throughs from above) - msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2)); - msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE); - // send the message - msg->sendReliable(mHost); - - log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; - chat.mText = log_message; - if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269 - { - chat.mMuted = TRUE; - } - LLFloaterChat::addChatHistory(chat); - - // If it's from an agent, we have to fetch the item to throw - // it away. If it's from a task or group, just denying the - // request will suffice to discard the item. - if(IM_INVENTORY_OFFERED == mIM) - { - 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())) + // close button probably (or any of the fall-throughs from above) + msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2)); + msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE); + // send the message + msg->sendReliable(mHost); + + log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; + chat.mText = log_message; + if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269 { - discard_agent_offer->done(); + chat.mMuted = TRUE; } - else + LLFloaterChat::addChatHistory(chat); + + if (busy && (!mFromGroup && !mFromObject)) { - opener = discard_agent_offer; + busy_message(msg,mFromID); } - - } - if (busy && (!mFromGroup && !mFromObject)) - { - busy_message(msg,mFromID); - } - break; - } - - if(IM_INVENTORY_OFFERED == mIM) - { - // add buddy to recent people list - LLRecentPeople::instance().add(mFromID); + break; } - + if(opener) { gInventory.addObserver(opener); } - + delete this; return false; } - -void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) +void inventory_offer_handler(LLOfferInfo* info) { //Until throttling is implmented, busy mode should reject inventory instead of silently //accepting it. SEE SL-39554 @@ -1366,19 +1504,46 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) payload["from_id"] = info->mFromID; args["OBJECTFROMNAME"] = info->mFromName; args["NAME"] = info->mFromName; + args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about"); + std::string verb = "select?name=" + msg; + args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str()); LLNotification::Params p("ObjectGiveItem"); - p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); - if (from_task) + // Object -> Agent Inventory Offer + if (info->mFromObject) { + // 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"; } - else + else // Agent -> Agent Inventory Offer { + // Note: sets inventory_offer_callback as the callback + p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); 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()) + { + fetch_item->done(); + } + else + { + gInventory.addObserver(fetch_item); + } + + // In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages). + info->send_auto_receive_response(); } - + + // Pop up inv offer notification and let the user accept (keep), or reject (and silently delete) the inventory. LLNotifications::instance().add(p); } @@ -1431,6 +1596,17 @@ bool goto_url_callback(const LLSD& notification, const LLSD& response) } static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_url_callback); +bool inspect_remote_object_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + if (0 == option) + { + LLFloaterReg::showInstance("inspect_remote_object", notification["payload"]); + } + return false; +} +static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback); + void process_improved_im(LLMessageSystem *msg, void **user_data) { if (gNoRender) @@ -1498,15 +1674,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } std::string separator_string(": "); - int message_offset = 0; - - //Handle IRC styled /me messages. - std::string prefix = message.substr(0, 4); - if (prefix == "/me " || prefix == "/me'") - { - separator_string = ""; - message_offset = 3; - } LLSD args; switch(dialog) @@ -1558,7 +1725,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // now store incoming IM in chat history - buffer = message.substr(message_offset); + buffer = message; LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; @@ -1576,7 +1743,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) true); // pretend this is chat generated by self, so it does not show up on screen - chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset); + chat.mText = std::string("IM: ") + name + separator_string + message; LLFloaterChat::addChat( chat, TRUE, TRUE ); } else if (from_id.isNull()) @@ -1596,7 +1763,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // Treat like a system message and put in chat history. // Claim to be from a local agent so it doesn't go into // console. - chat.mText = name + separator_string + message.substr(message_offset); + chat.mText = name + separator_string + message; LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); if(nearby_chat) @@ -1612,7 +1779,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); } - buffer = saved + message.substr(message_offset); + buffer = saved + message; LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; @@ -1634,7 +1801,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) region_id, position, true); - chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); + chat.mText = std::string("IM: ") + name + separator_string + saved + message; BOOL local_agent = FALSE; LLFloaterChat::addChat( chat, TRUE, local_agent ); @@ -1872,7 +2039,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } else { - inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED); + inventory_offer_handler(info); } } break; @@ -1922,7 +2089,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); } - buffer = saved + message.substr(message_offset); + buffer = saved + message; BOOL is_this_agent = FALSE; if(from_id == gAgentID) { @@ -1940,7 +2107,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) position, true); - chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); + chat.mText = std::string("IM: ") + name + separator_string + saved + message; LLFloaterChat::addChat(chat, TRUE, is_this_agent); } break; @@ -1952,9 +2119,23 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) return; } + // Build a link to open the object IM info window. + std::string location = ll_safe_string((char*)binary_bucket, binary_bucket_size-1); + LLSD substitutions; - substitutions["MSG"] = message.substr(message_offset); - LLNotifications::instance().add("ServerObjectMessage", substitutions); + substitutions["NAME"] = name; + substitutions["MSG"] = message; + + LLSD payload; + payload["object_id"] = session_id; + payload["owner_id"] = from_id; + payload["slurl"] = location; + payload["name"] = name; + if (from_group) + { + payload["groupowned"] = "true"; + } + LLNotifications::instance().add("ServerObjectMessage", substitutions, payload); } break; case IM_FROM_TASK_AS_ALERT: @@ -1978,7 +2159,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) else { // TODO: after LLTrans hits release, get "busy response" into translatable file - buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.substr(message_offset).c_str()); + buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.c_str()); gIMMgr->addMessage(session_id, from_id, name, buffer); } break; @@ -2090,7 +2271,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) send_generic_message("requestonlinenotification", strings); args["NAME"] = name; - LLNotifications::instance().add("FriendshipAccepted", args); + LLSD payload; + payload["from_id"] = from_id; + LLNotifications::instance().add("FriendshipAccepted", args, payload); } break; @@ -2232,7 +2415,7 @@ void process_decline_callingcard(LLMessageSystem* msg, void**) void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) { - LLChat chat; + LLChat chat; std::string mesg; std::string from_name; U8 source_temp; @@ -2323,14 +2506,14 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) std::string prefix = mesg.substr(0, 4); if (prefix == "/me " || prefix == "/me'") { - chat.mText = from_name; - chat.mText += mesg.substr(3); +// chat.mText = from_name; +// chat.mText += mesg.substr(3); ircstyle = TRUE; } - else - { +// else +// { chat.mText = mesg; - } +// } // Look for the start of typing so we can put "..." in the bubbles. if (CHAT_TYPE_START == chat.mChatType) @@ -2356,19 +2539,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) return; } - // We have a real utterance now, so can stop showing "..." and proceed. - if (chatter && chatter->isAvatar()) - { - LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE); - ((LLVOAvatar*)chatter)->stopTyping(); - - if (!is_muted && !is_busy) - { - visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles"); - ((LLVOAvatar*)chatter)->addChat(chat); - } - } - // Look for IRC-style emotes if (ircstyle) { @@ -2408,6 +2578,23 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) chat.mText += mesg; } + // We have a real utterance now, so can stop showing "..." and proceed. + if (chatter && chatter->isAvatar()) + { + LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE); + ((LLVOAvatar*)chatter)->stopTyping(); + + if (!is_muted && !is_busy) + { + visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles"); + std::string formated_msg = ""; + LLViewerChat::formatChatMsg(chat, formated_msg); + LLChat chat_bubble = chat; + chat_bubble.mText = formated_msg; + ((LLVOAvatar*)chatter)->addChat(chat_bubble); + } + } + if (chatter) { chat.mPosAgent = chatter->getPositionAgent(); @@ -2832,7 +3019,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) // Chat the "back" SLURL. (DEV-4907) LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL()); chat.mSourceType = CHAT_SOURCE_SYSTEM; - LLFloaterChat::addChatHistory(chat); + LLFloaterChat::addChatHistory(chat); // Set the new position avatarp->setPositionAgent(agent_pos); @@ -4338,7 +4525,7 @@ void process_alert_core(const std::string& message, BOOL modal) std::string snap_filename = gDirUtilp->getLindenUserDir(); snap_filename += gDirUtilp->getDirDelimiter(); snap_filename += SCREEN_HOME_FILENAME; - gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, FALSE); + gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, FALSE); } const std::string ALERT_PREFIX("ALERT: "); @@ -4604,7 +4791,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp if (caution) { LLChat chat(notice.getString()); - LLFloaterChat::addChat(chat, FALSE, FALSE); + // LLFloaterChat::addChat(chat, FALSE, FALSE); } } } @@ -4817,8 +5004,7 @@ void container_inventory_arrived(LLViewerObject* object, InventoryObjectList::const_iterator end = inventory->end(); for ( ; it != end; ++it) { - if ((*it)->getType() != LLAssetType::AT_CATEGORY && - (*it)->getType() != LLAssetType::AT_ROOT_CATEGORY) + if ((*it)->getType() != LLAssetType::AT_CATEGORY) { LLInventoryObject* obj = (LLInventoryObject*)(*it); LLInventoryItem* item = (LLInventoryItem*)(obj); @@ -4853,8 +5039,7 @@ void container_inventory_arrived(LLViewerObject* object, // one actual object InventoryObjectList::iterator it = inventory->begin(); - if ((*it)->getType() == LLAssetType::AT_CATEGORY || - (*it)->getType() == LLAssetType::AT_ROOT_CATEGORY) + if ((*it)->getType() == LLAssetType::AT_CATEGORY) { ++it; } @@ -5350,6 +5535,17 @@ void process_script_dialog(LLMessageSystem* msg, void**) notification = LLNotifications::instance().add( LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD())); } + + // "ScriptDialog" and "ScriptDialogGroup" are handles by LLScriptFloaterManager. + // We want to inform user that there is a script floater, lets add "ScriptToast" + LLNotification::Params p("ScriptToast"); + p.substitutions(args).payload(payload).functor.function(boost::bind( + LLScriptFloaterManager::onToastButtonClick, _1, _2)); + + notification = LLNotifications::instance().add(p); + + LLScriptFloaterManager::getInstance()->setNotificationToastId( + object_id, notification->getID()); } //--------------------------------------------------------------------------- diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index e24da2013d19c6b4189413230c96248258468065..1a98828010f8e1ac2f0bb6e7b32589139cc29a0f 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -59,7 +59,8 @@ enum InventoryOfferResponse IOR_ACCEPT, IOR_DECLINE, IOR_MUTE, - IOR_BUSY + IOR_BUSY, + IOR_SHOW }; BOOL can_afford_transaction(S32 cost); @@ -197,6 +198,7 @@ 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); struct LLOfferInfo { @@ -218,7 +220,9 @@ struct LLOfferInfo LLHost mHost; LLSD asLLSD(); + void send_auto_receive_response(void); bool inventory_offer_callback(const LLSD& notification, const LLSD& response); + bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response); }; diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 336d7f684e6f9731a7bf2ad06b7cfbb7738ad24f..f61dbb1b391e87d9893969a5cbcb8cabd42004a5 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -218,7 +218,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel) LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL; // Delete the old one first so they don't fight over the texture. - sMediaImpl->stop(); + sMediaImpl = NULL; sMediaImpl = LLViewerMedia::newMediaImpl( placeholder_texture_id, @@ -261,8 +261,7 @@ void LLViewerParcelMedia::stop() // We need to remove the media HUD if it is up. LLViewerMediaFocus::getInstance()->clearFocus(); - // This will kill the media instance. - sMediaImpl->stop(); + // This will unload & kill the media instance. sMediaImpl = NULL; } @@ -324,10 +323,36 @@ std::string LLViewerParcelMedia::getMimeType() { return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none"; } + +//static +std::string LLViewerParcelMedia::getURL() +{ + std::string url; + if(sMediaImpl.notNull()) + url = sMediaImpl->getMediaURL(); + + if (url.empty()) + url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL(); + + if (url.empty()) + url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL(); + + return url; +} + +//static +std::string LLViewerParcelMedia::getName() +{ + if(sMediaImpl.notNull()) + return sMediaImpl->getName(); + return ""; +} + viewer_media_t LLViewerParcelMedia::getParcelMedia() { return sMediaImpl; } + ////////////////////////////////////////////////////////////////////////////////////////// // static void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** ) diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h index 3f7f8983569a888b9ba2c4437d7f48cdf229061b..19e1ef78d43c30db888061415c6f7c50dd8bcbf1 100644 --- a/indra/newview/llviewerparcelmedia.h +++ b/indra/newview/llviewerparcelmedia.h @@ -71,6 +71,8 @@ class LLViewerParcelMedia : public LLViewerMediaObserver static LLPluginClassMediaOwner::EMediaStatus getStatus(); static std::string getMimeType(); + static std::string getURL(); + static std::string getName(); static viewer_media_t getParcelMedia(); static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** ); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index aa0987aa7d1223635a663a09366f20d002f12302..fcaf49c88493951764f08045512741d3a067e395 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -650,7 +650,7 @@ LLParcel *LLViewerParcelMgr::getAgentParcel() const } // Return whether the agent can build on the land they are on -bool LLViewerParcelMgr::agentCanBuild() const +bool LLViewerParcelMgr::allowAgentBuild() const { if (mAgentParcel) { @@ -664,19 +664,47 @@ bool LLViewerParcelMgr::agentCanBuild() const } } -BOOL LLViewerParcelMgr::agentCanTakeDamage() const +bool LLViewerParcelMgr::allowAgentVoice() const { - return mAgentParcel->getAllowDamage(); + LLViewerRegion* region = gAgent.getRegion(); + return region && region->isVoiceEnabled() + && mAgentParcel && mAgentParcel->getParcelFlagAllowVoice(); } -BOOL LLViewerParcelMgr::agentCanFly() const +bool LLViewerParcelMgr::allowAgentFly() const { - return TRUE; + LLViewerRegion* region = gAgent.getRegion(); + return region && !region->getBlockFly() + && mAgentParcel && mAgentParcel->getAllowFly(); } -F32 LLViewerParcelMgr::agentDrawDistance() const +// Can the agent be pushed around by LLPushObject? +bool LLViewerParcelMgr::allowAgentPush() const { - return 512.f; + LLViewerRegion* region = gAgent.getRegion(); + return region && !region->getRestrictPushObject() + && mAgentParcel && !mAgentParcel->getRestrictPushObject(); +} + +bool LLViewerParcelMgr::allowAgentScripts() const +{ + LLViewerRegion* region = gAgent.getRegion(); + // *NOTE: This code does not take into account group-owned parcels + // and the flag to allow group-owned scripted objects to run. + // This mirrors the traditional menu bar parcel icon code, but is not + // technically correct. + return region + && !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) + && !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) + && mAgentParcel + && mAgentParcel->getAllowOtherScripts(); +} + +bool LLViewerParcelMgr::allowAgentDamage() const +{ + LLViewerRegion* region = gAgent.getRegion(); + return region && region->getAllowDamage() + && mAgentParcel && mAgentParcel->getAllowDamage(); } BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 1c8fe23dba125ed08ca0414935d84988f68ae7f3..379190789b09e98e64e61129d12bde672a15ee07 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -56,9 +56,6 @@ class LLViewerRegion; // | EAST_MASK // | WEST_MASK); -const F32 PARCEL_POST_HEIGHT = 0.666f; -//const F32 PARCEL_POST_HEIGHT = 20.f; - // Specify the type of land transfer taking place //enum ELandTransferType //{ @@ -171,10 +168,29 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr> LLParcel* getCollisionParcel() const; - BOOL agentCanTakeDamage() const; - BOOL agentCanFly() const; - F32 agentDrawDistance() const; - bool agentCanBuild() const; + // Can this agent build on the parcel he is on? + // Used for parcel property icons in nav bar. + bool allowAgentBuild() const; + + // Can this agent speak on the parcel he is on? + // Used for parcel property icons in nav bar. + bool allowAgentVoice() const; + + // Can this agent start flying on this parcel? + // Used for parcel property icons in nav bar. + bool allowAgentFly() const; + + // Can this agent be pushed by llPushObject() on this parcel? + // Used for parcel property icons in nav bar. + bool allowAgentPush() const; + + // Can scripts written by non-parcel-owners run on the agent's current + // parcel? Used for parcel property icons in nav bar. + bool allowAgentScripts() const; + + // Can the agent be damaged here? + // Used for parcel property icons in nav bar. + bool allowAgentDamage() const; F32 getHoverParcelWidth() const { return F32(mHoverEastNorth.mdV[VX] - mHoverWestSouth.mdV[VX]); } diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index caa94dba381252b8369484d446968428d09ae007..939d5e3970dff8b12f36ae38f81b68ead2bde7e1 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -822,8 +822,8 @@ void send_stats() // Screen size so the UI team can figure out how big the widgets // appear and use a "typical" size for end user tests. - S32 window_width = gViewerWindow->getWindowDisplayWidth(); - S32 window_height = gViewerWindow->getWindowDisplayHeight(); + S32 window_width = gViewerWindow->getWindowWidthRaw(); + S32 window_height = gViewerWindow->getWindowHeightRaw(); S32 window_size = (window_width * window_height) / 1024; misc["string_1"] = llformat("%d", window_size); // misc["string_2"] = diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 9923c9ac74fcc1e35182848bb0237346f7614ced..0d29efaedf5acd27bacb941c43b26723380f3d43 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -206,33 +206,31 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture( const LLUUID &image_id, BOOL usemipmaps, - S32 boost_priority, + LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, LLGLint internal_format, LLGLenum primary_format, LLHost request_from_host) { - llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ; return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; } LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile( const std::string& filename, BOOL usemipmaps, - S32 boost_priority, + LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, LLGLint internal_format, LLGLenum primary_format, const LLUUID& force_id) { - llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ; return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; } //static LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url, BOOL usemipmaps, - S32 boost_priority, + LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, LLGLint internal_format, LLGLenum primary_format, @@ -1485,9 +1483,8 @@ F32 LLViewerFetchedTexture::calcDecodePriority() if ( mBoostLevel > BOOST_HIGH) { priority += 10000000.f; - } - - if(mAdditionalDecodePriority > 0.0f) + } + else if(mAdditionalDecodePriority > 0.0f) { // 1-9 S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round @@ -2124,10 +2121,11 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level) llassert_always(mGLTexturep.notNull()) ; llassert_always(discard_level >= 0); llassert_always(mComponents > 0); + if (mRawImage.notNull()) { - llerrs << "called with existing mRawImage" << llendl; - mRawImage = NULL; + //mRawImage is in use by somebody else, do not delete it. + return NULL ; } if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level) @@ -3147,8 +3145,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize() if(mNeedsResetMaxVirtualSize) { - mMaxVirtualSize = 0.f ;//reset - mNeedsResetMaxVirtualSize = FALSE ; + addTextureStats(0.f, FALSE) ;//reset } if(mIsPlaying) //media is playing diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index bde87d1dd5726d7105a15669bc2ce634a8743723..141979052d7636ca1d48cb28f0a0df3fbb8f65b4 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -107,12 +107,11 @@ class LLViewerTexture : public LLTexture enum EBoostLevel { - //skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers. - BOOST_NONE = 2, - BOOST_AVATAR_BAKED = 3, - BOOST_AVATAR = 4, - BOOST_CLOUDS = 5, - BOOST_SCULPTED = 6, + BOOST_NONE = 0, + BOOST_AVATAR_BAKED = 1, + BOOST_AVATAR = 2, + BOOST_CLOUDS = 3, + BOOST_SCULPTED = 4, BOOST_HIGH = 10, BOOST_TERRAIN = 11, // has to be high priority for minimap / low detail @@ -668,7 +667,7 @@ class LLViewerTextureManager static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id, BOOL usemipmap = TRUE, - S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -677,7 +676,7 @@ class LLViewerTextureManager static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename, BOOL usemipmap = TRUE, - S32 boost_priority = LLViewerTexture::BOOST_NONE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -686,7 +685,7 @@ class LLViewerTextureManager static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url, BOOL usemipmap = TRUE, - S32 boost_priority = LLViewerTexture::BOOST_NONE, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 081b7cc4831e0676803a8d2a0a04b80faf41dd5b..dbcf5630102c514dc6653c912f8cba0c8934c57d 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -325,7 +325,7 @@ void LLViewerTextureList::restoreGL() LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename, BOOL usemipmaps, - S32 boost_priority, + LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, LLGLint internal_format, LLGLenum primary_format, @@ -345,7 +345,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url, BOOL usemipmaps, - S32 boost_priority, + LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, LLGLint internal_format, LLGLenum primary_format, @@ -411,7 +411,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, BOOL usemipmaps, - S32 boost_priority, + LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, LLGLint internal_format, LLGLenum primary_format, @@ -441,7 +441,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, //when this function is called, there is no such texture in the gTextureList with image_id. LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, BOOL usemipmaps, - S32 boost_priority, + LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, LLGLint internal_format, LLGLenum primary_format, @@ -1346,7 +1346,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority) const BOOL use_mips = FALSE; const LLRect scale_rect = LLRect::null; - return loadUIImageByID(image_id, use_mips, scale_rect, priority); + return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority); } LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority) @@ -1360,21 +1360,27 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori const BOOL use_mips = FALSE; const LLRect scale_rect = LLRect::null; - return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority); + return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority); } LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, - BOOL use_mips, const LLRect& scale_rect, S32 boost_priority ) + BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority ) { - if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI; + if (boost_priority == LLViewerTexture::BOOST_NONE) + { + boost_priority = LLViewerTexture::BOOST_UI; + } LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority); return loadUIImage(imagep, name, use_mips, scale_rect); } LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, - BOOL use_mips, const LLRect& scale_rect, S32 boost_priority) + BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority) { - if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI; + if (boost_priority == LLViewerTexture::BOOST_NONE) + { + boost_priority = LLViewerTexture::BOOST_UI; + } LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority); return loadUIImage(imagep, id.asString(), use_mips, scale_rect); } @@ -1461,14 +1467,14 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration> Mandatory<std::string> name; Optional<std::string> file_name; Optional<bool> preload; - Optional<LLRect> scale_rect; + Optional<LLRect> scale; Optional<bool> use_mips; UIImageDeclaration() : name("name"), file_name("file_name"), preload("preload", false), - scale_rect("scale"), + scale("scale"), use_mips("use_mips", false) {} }; @@ -1558,7 +1564,7 @@ bool LLUIImageList::initFromFile() { continue; } - preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale_rect); + preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale); } if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload")) diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 3c9c81a689a50f36191220c3024d9631027a982f..028f8441ab0a44f48dadbe2dd38f580ca8ad5018 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -130,7 +130,7 @@ class LLViewerTextureList LLViewerFetchedTexture * getImage(const LLUUID &image_id, BOOL usemipmap = TRUE, - S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -139,7 +139,7 @@ class LLViewerTextureList LLViewerFetchedTexture * getImageFromFile(const std::string& filename, BOOL usemipmap = TRUE, - S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -148,7 +148,7 @@ class LLViewerTextureList LLViewerFetchedTexture* getImageFromUrl(const std::string& url, BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -157,7 +157,7 @@ class LLViewerTextureList LLViewerFetchedTexture* createImage(const LLUUID &image_id, BOOL usemipmap = TRUE, - S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -228,9 +228,11 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); private: LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename, - BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0); + BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); LLUIImagePtr loadUIImageByID(const LLUUID& id, - BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0); + BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, + LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 7873b4061edadaaa29b59b110098c1555e0ca87c..e30c8ab346bed1d4a61749ee24227f0691da2c85 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -315,7 +315,7 @@ class LLDebugText mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f ); // Draw stuff growing up from right lower corner of screen - U32 xpos = mWindow->getWindowWidth() - 350; + U32 xpos = mWindow->getWindowWidthScaled() - 350; U32 ypos = 64; const U32 y_inc = 20; @@ -600,8 +600,8 @@ void LLViewerWindow::updateDebugText() BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down) { - std::string buttonname; - std::string buttonstatestr; + const char* buttonname = ""; + const char* buttonstatestr = ""; BOOL handled = FALSE; S32 x = pos.mX; S32 y = pos.mY; @@ -1015,7 +1015,10 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated) } // SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues - gAgent.changeCameraToDefault(); + if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) + { + gAgent.changeCameraToDefault(); + } send_agent_pause(); @@ -1196,9 +1199,9 @@ LLViewerWindow::LLViewerWindow( mActive(TRUE), mWantFullscreen(fullscreen), mShowFullscreenProgress(FALSE), - mWindowRect(0, height, width, 0), - mVirtualWindowRect(0, height, width, 0), - mWorldViewRect(0, height, width, 0), + mWindowRectRaw(0, height, width, 0), + mWindowRectScaled(0, height, width, 0), + mWorldViewRectRaw(0, height, width, 0), mLeftMouseDown(FALSE), mMiddleMouseDown(FALSE), mRightMouseDown(FALSE), @@ -1212,7 +1215,7 @@ LLViewerWindow::LLViewerWindow( mStatesDirty(false), mIsFullscreenChecked(false), mCurrResolutionIndex(0), - mViewerWindowListener(new LLViewerWindowListener("LLViewerWindow", this)) + mViewerWindowListener(new LLViewerWindowListener(this)) { LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert")); LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal")); @@ -1267,8 +1270,8 @@ LLViewerWindow::LLViewerWindow( { LLCoordWindow size; mWindow->getSize(&size); - mWindowRect.set(0, size.mY, size.mX, 0); - mVirtualWindowRect.set(0, llround((F32)size.mY / mDisplayScale.mV[VY]), llround((F32)size.mX / mDisplayScale.mV[VX]), 0); + mWindowRectRaw.set(0, size.mY, size.mX, 0); + mWindowRectScaled.set(0, llround((F32)size.mY / mDisplayScale.mV[VY]), llround((F32)size.mX / mDisplayScale.mV[VX]), 0); } LLFontManager::initClass(); @@ -1324,15 +1327,15 @@ LLViewerWindow::LLViewerWindow( // Create container for all sub-views LLView::Params rvp; rvp.name("root"); - rvp.rect(mVirtualWindowRect); + rvp.rect(mWindowRectScaled); rvp.mouse_opaque(false); rvp.follows.flags(FOLLOWS_NONE); mRootView = LLUICtrlFactory::create<LLRootView>(rvp); LLUI::setRootView(mRootView); // Make avatar head look forward at start - mCurrentMousePoint.mX = getWindowWidth() / 2; - mCurrentMousePoint.mY = getWindowHeight() / 2; + mCurrentMousePoint.mX = getWindowWidthScaled() / 2; + mCurrentMousePoint.mY = getWindowHeightScaled() / 2; gShowOverlayTitle = gSavedSettings.getBOOL("ShowOverlayTitle"); mOverlayTitle = gSavedSettings.getString("OverlayTitle"); @@ -1344,6 +1347,7 @@ LLViewerWindow::LLViewerWindow( mDebugText = new LLDebugText(this); + mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale); } void LLViewerWindow::initGLDefaults() @@ -1383,8 +1387,8 @@ struct MainPanel : public LLPanel void LLViewerWindow::initBase() { - S32 height = getWindowHeight(); - S32 width = getWindowWidth(); + S32 height = getWindowHeightScaled(); + S32 width = getWindowWidthScaled(); LLRect full_window(0, height, width, 0); @@ -1563,8 +1567,6 @@ void LLViewerWindow::initWorldUI() LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"); LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance(); - panel_stand_stop_flying->setShape(panel_ssf_container->getLocalRect()); - panel_stand_stop_flying->setFollowsAll(); panel_ssf_container->addChild(panel_stand_stop_flying); panel_ssf_container->setVisible(TRUE); @@ -1572,7 +1574,8 @@ void LLViewerWindow::initWorldUI() LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container"); LLSideTray* sidetrayp = LLSideTray::getInstance(); sidetrayp->setShape(side_tray_container->getLocalRect()); - sidetrayp->setFollowsAll(); + // don't follow right edge to avoid spurious resizes, since we are using a fixed width layout + sidetrayp->setFollows(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_BOTTOM); side_tray_container->addChild(sidetrayp); side_tray_container->setVisible(FALSE); @@ -1709,8 +1712,8 @@ void LLViewerWindow::sendShapeToSim() msg->addU32Fast(_PREHASH_CircuitCode, gMessageSystem->mOurCircuitCode); msg->nextBlockFast(_PREHASH_HeightWidthBlock); msg->addU32Fast(_PREHASH_GenCounter, 0); - U16 height16 = (U16) mWorldViewRect.getHeight(); - U16 width16 = (U16) mWorldViewRect.getWidth(); + U16 height16 = (U16) mWorldViewRectRaw.getHeight(); + U16 width16 = (U16) mWorldViewRectRaw.getWidth(); msg->addU16Fast(_PREHASH_Height, height16); msg->addU16Fast(_PREHASH_Width, width16); gAgent.sendReliableMessage(); @@ -1732,14 +1735,14 @@ void LLViewerWindow::reshape(S32 width, S32 height) } // update our window rectangle - mWindowRect.mRight = mWindowRect.mLeft + width; - mWindowRect.mTop = mWindowRect.mBottom + height; + mWindowRectRaw.mRight = mWindowRectRaw.mLeft + width; + mWindowRectRaw.mTop = mWindowRectRaw.mBottom + height; //glViewport(0, 0, width, height ); if (height > 0) { - LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRect.getHeight() ); + LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() ); LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() ); } @@ -1749,8 +1752,8 @@ void LLViewerWindow::reshape(S32 width, S32 height) LLUI::setScaleFactor(mDisplayScale); // update our window rectangle - mVirtualWindowRect.mRight = mVirtualWindowRect.mLeft + llround((F32)width / mDisplayScale.mV[VX]); - mVirtualWindowRect.mTop = mVirtualWindowRect.mBottom + llround((F32)height / mDisplayScale.mV[VY]); + mWindowRectScaled.mRight = mWindowRectScaled.mLeft + llround((F32)width / mDisplayScale.mV[VX]); + mWindowRectScaled.mTop = mWindowRectScaled.mBottom + llround((F32)height / mDisplayScale.mV[VY]); setup2DViewport(); @@ -1892,7 +1895,7 @@ void LLViewerWindow::draw() if (!gSavedSettings.getBOOL("RenderUIBuffer")) { - LLUI::sDirtyRect = this->getWindowRect(); + LLUI::sDirtyRect = this->getWindowRectRaw(); } // HACK for timecode debugging @@ -1906,8 +1909,8 @@ void LLViewerWindow::draw() microsecondsToTimecodeString(gFrameTime,text); const LLFontGL* font = LLFontGL::getFontSansSerif(); font->renderUTF8(text, 0, - llround((getWindowWidth()/2)-100.f), - llround((getWindowHeight()-60.f)), + llround((getWindowWidthScaled()/2)-100.f), + llround((getWindowHeightScaled()-60.f)), LLColor4( 1.f, 1.f, 1.f, 1.f ), LLFontGL::LEFT, LLFontGL::TOP); } @@ -1930,8 +1933,8 @@ void LLViewerWindow::draw() int pos_y = sub_region / llceil(zoom_factor); int pos_x = sub_region - (pos_y*llceil(zoom_factor)); // offset for this tile - glTranslatef((F32)getWindowWidth() * -(F32)pos_x, - (F32)getWindowHeight() * -(F32)pos_y, + glTranslatef((F32)getWindowWidthScaled() * -(F32)pos_x, + (F32)getWindowHeightScaled() * -(F32)pos_y, 0.f); glScalef(zoom_factor, zoom_factor, 1.f); LLUI::sGLScaleFactor *= zoom_factor; @@ -1976,8 +1979,8 @@ void LLViewerWindow::draw() const S32 DIST_FROM_TOP = 20; LLFontGL::getFontSansSerifBig()->renderUTF8( mOverlayTitle, 0, - llround( getWindowWidth() * 0.5f), - getWindowHeight() - DIST_FROM_TOP, + llround( getWindowWidthScaled() * 0.5f), + getWindowHeightScaled() - DIST_FROM_TOP, LLColor4(1, 1, 1, 0.4f), LLFontGL::HCENTER, LLFontGL::TOP); } @@ -2277,7 +2280,7 @@ void LLViewerWindow::handleScrollWheel(S32 clicks) // Zoom the camera in and out behavior - if(top_ctrl == 0 && mWorldViewRect.pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) ) + if(top_ctrl == 0 && getWorldViewRectScaled().pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) ) gAgent.handleScrollWheel(clicks); return; @@ -2285,8 +2288,8 @@ void LLViewerWindow::handleScrollWheel(S32 clicks) void LLViewerWindow::moveCursorToCenter() { - S32 x = mWorldViewRect.getWidth() / 2; - S32 y = mWorldViewRect.getHeight() / 2; + S32 x = getWorldViewWidthScaled() / 2; + S32 y = getWorldViewHeightScaled() / 2; //on a forced move, all deltas get zeroed out to prevent jumping mCurrentMousePoint.set(x,y); @@ -2302,13 +2305,13 @@ void LLViewerWindow::moveCursorToCenter() // Hover handlers // -void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg) +void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params) { if (viewp) { - if (!tool_tip_msg.empty()) + if (!params.styled_message().empty()) { - tool_tip_msg.append("\n---------\n"); + params.styled_message.add().text("\n---------\n"); } LLView::root_to_view_iterator_t end_tooltip_it = viewp->endRootToView(); // NOTE: we skip "root" since it is assumed @@ -2318,15 +2321,16 @@ void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg) { LLView* viewp = *tooltip_it; - tool_tip_msg.append(viewp->getName()); + params.styled_message.add().text(viewp->getName()); + LLPanel* panelp = dynamic_cast<LLPanel*>(viewp); if (panelp && !panelp->getXMLFilename().empty()) { - tool_tip_msg.append("("); - tool_tip_msg.append(panelp->getXMLFilename()); - tool_tip_msg.append(")"); + params.styled_message.add() + .text("(" + panelp->getXMLFilename() + ")") + .style.color(LLColor4(0.7f, 0.7f, 1.f, 1.f)); } - tool_tip_msg.append("/"); + params.styled_message.add().text("/"); } } } @@ -2567,6 +2571,8 @@ void LLViewerWindow::updateUI() 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) @@ -2599,20 +2605,20 @@ void LLViewerWindow::updateUI() // NOTE: this emulates visiting only the leaf nodes that meet our criteria if (!viewp->hasAncestor(tooltip_view)) { - append_xui_tooltip(tooltip_view, tool_tip_msg); + append_xui_tooltip(tooltip_view, params); screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); } tooltip_view = viewp; } } - append_xui_tooltip(tooltip_view, tool_tip_msg); + append_xui_tooltip(tooltip_view, params); screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); - LLToolTipMgr::instance().show(LLToolTip::Params() - .message(tool_tip_msg) - .sticky_rect(screen_sticky_rect) - .max_width(400)); + 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) @@ -2724,8 +2730,8 @@ void LLViewerWindow::updateMouseDelta() mWindow->getCursorPosition(&mouse_pos); if (mouse_pos.mX < 0 || mouse_pos.mY < 0 || - mouse_pos.mX > mWindowRect.getWidth() || - mouse_pos.mY > mWindowRect.getHeight()) + mouse_pos.mX > mWindowRectRaw.getWidth() || + mouse_pos.mY > mWindowRectRaw.getHeight()) { mMouseInWindow = FALSE; } @@ -2846,7 +2852,7 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window) LLFastTimer ft(FTM_UPDATE_WORLD_VIEW); // start off using whole window to render world - LLRect new_world_rect = mWindowRect; + LLRect new_world_rect = mWindowRectRaw; if (use_full_window == false && mWorldViewPlaceholder.get()) { @@ -2854,17 +2860,26 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window) // clamp to at least a 1x1 rect so we don't try to allocate zero width gl buffers new_world_rect.mTop = llmax(new_world_rect.mTop, new_world_rect.mBottom + 1); new_world_rect.mRight = llmax(new_world_rect.mRight, new_world_rect.mLeft + 1); + + new_world_rect.mLeft = llround((F32)new_world_rect.mLeft * mDisplayScale.mV[VX]); + new_world_rect.mRight = llround((F32)new_world_rect.mRight * mDisplayScale.mV[VX]); + new_world_rect.mBottom = llround((F32)new_world_rect.mBottom * mDisplayScale.mV[VY]); + new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]); } - if (mWorldViewRect != new_world_rect) + if (mWorldViewRectRaw != new_world_rect) { - // sending a signal with a new WorldView rect - mOnWorldViewRectUpdated(mWorldViewRect, new_world_rect); - - mWorldViewRect = new_world_rect; + LLRect old_world_rect = mWorldViewRectRaw; + mWorldViewRectRaw = new_world_rect; gResizeScreenTexture = TRUE; - LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRect.getHeight() ); + LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() ); LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() ); + + 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); } } @@ -2876,9 +2891,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point) { mCurrentMousePoint.mX = 0; } - else if (point.mX > getWindowWidth()) + else if (point.mX > getWindowWidthScaled()) { - mCurrentMousePoint.mX = getWindowWidth(); + mCurrentMousePoint.mX = getWindowWidthScaled(); } else { @@ -2889,9 +2904,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point) { mCurrentMousePoint.mY = 0; } - else if (point.mY > getWindowHeight() ) + else if (point.mY > getWindowHeightScaled() ) { - mCurrentMousePoint.mY = getWindowHeight(); + mCurrentMousePoint.mY = getWindowHeightScaled(); } else { @@ -3136,10 +3151,10 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback { mPickScreenRegion.setCenterAndSize(x, y_from_bot, PICK_DIAMETER, PICK_DIAMETER); - if (mPickScreenRegion.mLeft < mWorldViewRect.mLeft) mPickScreenRegion.translate(mWorldViewRect.mLeft - mPickScreenRegion.mLeft, 0); - if (mPickScreenRegion.mBottom < mWorldViewRect.mBottom) mPickScreenRegion.translate(0, mWorldViewRect.mBottom - mPickScreenRegion.mBottom); - if (mPickScreenRegion.mRight > mWorldViewRect.mRight ) mPickScreenRegion.translate(mWorldViewRect.mRight - mPickScreenRegion.mRight, 0); - if (mPickScreenRegion.mTop > mWorldViewRect.mTop ) mPickScreenRegion.translate(0, mWorldViewRect.mTop - mPickScreenRegion.mTop); + if (mPickScreenRegion.mLeft < mWorldViewRectScaled.mLeft) mPickScreenRegion.translate(mWorldViewRectScaled.mLeft - mPickScreenRegion.mLeft, 0); + if (mPickScreenRegion.mBottom < mWorldViewRectScaled.mBottom) mPickScreenRegion.translate(0, mWorldViewRectScaled.mBottom - mPickScreenRegion.mBottom); + if (mPickScreenRegion.mRight > mWorldViewRectScaled.mRight ) mPickScreenRegion.translate(mWorldViewRectScaled.mRight - mPickScreenRegion.mRight, 0); + if (mPickScreenRegion.mTop > mWorldViewRectScaled.mTop ) mPickScreenRegion.translate(0, mWorldViewRectScaled.mTop - mPickScreenRegion.mTop); } // set frame buffer region for picking results @@ -3345,11 +3360,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const F32 fov = LLViewerCamera::getInstance()->getView(); // find world view center in scaled ui coordinates - F32 center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX]; - F32 center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY]; + F32 center_x = getWorldViewRectScaled().getCenterX(); + F32 center_y = getWorldViewRectScaled().getCenterY(); // calculate pixel distance to screen - F32 distance = ((F32)getWorldViewHeight() / (mDisplayScale.mV[VY] * 2.f)) / (tan(fov / 2.f)); + F32 distance = ((F32)getWorldViewHeightScaled() * 0.5f) / (tan(fov / 2.f)); // calculate click point relative to middle of screen F32 click_x = x - center_x; @@ -3368,11 +3383,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const LLVector3 LLViewerWindow::mousePointHUD(const S32 x, const S32 y) const { // find screen resolution - S32 height = llround((F32)getWorldViewHeight() / mDisplayScale.mV[VY]); + S32 height = getWorldViewHeightScaled(); // find world view center - F32 center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX]; - F32 center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY]; + F32 center_x = getWorldViewRectScaled().getCenterX(); + F32 center_y = getWorldViewRectScaled().getCenterY(); // remap with uniform scale (1/height) so that top is -0.5, bottom is +0.5 F32 hud_x = -((F32)x - center_x) / height; @@ -3390,12 +3405,12 @@ LLVector3 LLViewerWindow::mouseDirectionCamera(const S32 x, const S32 y) const F32 fov_width = fov_height * LLViewerCamera::getInstance()->getAspect(); // find screen resolution - S32 height = llround((F32)getWorldViewHeight() / mDisplayScale.mV[VY]); - S32 width = llround((F32)getWorldViewWidth() / mDisplayScale.mV[VX]); + S32 height = getWorldViewHeightScaled(); + S32 width = getWorldViewWidthScaled(); // find world view center - F32 center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX]; - F32 center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY]; + F32 center_x = getWorldViewRectScaled().getCenterX(); + F32 center_y = getWorldViewRectScaled().getCenterY(); // calculate click point relative to middle of screen F32 click_x = (((F32)x - center_x) / (F32)width) * fov_width * -1.f; @@ -3635,8 +3650,8 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height) ||(size.mY != new_height + BORDERHEIGHT)) { // use actual display dimensions, not virtual UI dimensions - S32 x = gViewerWindow->getWindowDisplayWidth(); - S32 y = gViewerWindow->getWindowDisplayHeight(); + S32 x = gViewerWindow->getWindowWidthRaw(); + S32 y = gViewerWindow->getWindowHeightRaw(); BORDERWIDTH = size.mX - x; BORDERHEIGHT = size.mY- y; LLCoordScreen new_size(new_width + BORDERWIDTH, @@ -3734,9 +3749,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p S32 w = preview_width ; S32 h = preview_height ; LLVector2 display_scale = mDisplayScale ; - mDisplayScale.setVec((F32)w / mWindowRect.getWidth(), (F32)h / mWindowRect.getHeight()) ; - LLRect window_rect = mWindowRect; - mWindowRect.set(0, h, w, 0); + mDisplayScale.setVec((F32)w / mWindowRectRaw.getWidth(), (F32)h / mWindowRectRaw.getHeight()) ; + LLRect window_rect = mWindowRectRaw; + mWindowRectRaw.set(0, h, w, 0); gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; @@ -3748,7 +3763,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p LLHUDText::setDisplayText(FALSE) ; if (type == SNAPSHOT_TYPE_OBJECT_ID) { - gObjectList.renderPickList(gViewerWindow->getVirtualWindowRect(), FALSE, FALSE); + gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE); } else { @@ -3801,7 +3816,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p LLFontGL::setFontDisplay(TRUE) ; LLHUDText::setDisplayText(TRUE) ; mDisplayScale.setVec(display_scale) ; - mWindowRect = window_rect; + mWindowRectRaw = window_rect; setup3DRender(); gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; @@ -3869,12 +3884,12 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // Copy screen to a buffer // crop sides or top and bottom, if taking a snapshot of different aspect ratio // from window - S32 snapshot_width = mWindowRect.getWidth(); - S32 snapshot_height = mWindowRect.getHeight(); + S32 snapshot_width = mWindowRectRaw.getWidth(); + S32 snapshot_height = mWindowRectRaw.getHeight(); // SNAPSHOT - S32 window_width = mWindowRect.getWidth(); - S32 window_height = mWindowRect.getHeight(); - LLRect window_rect = mWindowRect; + S32 window_width = mWindowRectRaw.getWidth(); + S32 window_height = mWindowRectRaw.getHeight(); + LLRect window_rect = mWindowRectRaw; BOOL use_fbo = FALSE; LLRenderTarget target; @@ -3905,7 +3920,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei window_width = snapshot_width; window_height = snapshot_height; scale_factor = 1.f; - mWindowRect.set(0, snapshot_height, snapshot_width, 0); + mWindowRectRaw.set(0, snapshot_height, snapshot_width, 0); target.bindTarget(); } } @@ -3938,7 +3953,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei return FALSE ; } - BOOL high_res = scale_factor > 1.f; + BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher if (high_res) { send_agent_pause(); @@ -3973,7 +3988,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei LLViewerCamera::getInstance()->setZoomParameters(scale_factor, subimage_x+(subimage_y*llceil(scale_factor))); setup3DRender(); - gObjectList.renderPickList(gViewerWindow->getVirtualWindowRect(), FALSE, FALSE); + gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE); } else { @@ -4052,7 +4067,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei if (use_fbo) { - mWindowRect = window_rect; + mWindowRectRaw = window_rect; target.flush(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } @@ -4126,30 +4141,20 @@ void LLViewerWindow::drawMouselookInstructions() { // Draw instructions for mouselook ("Press ESC to return to World View" partially transparent at the bottom of the screen.) const std::string instructions = LLTrans::getString("LeaveMouselook"); - const LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Huge", LLFontGL::BOLD)); + const LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Large", LLFontGL::BOLD)); //to be on top of Bottom bar when it is opened const S32 INSTRUCTIONS_PAD = 50; font->renderUTF8( instructions, 0, - getVirtualWorldViewRect().getCenterX(), - getVirtualWorldViewRect().mBottom + INSTRUCTIONS_PAD, + getWorldViewRectScaled().getCenterX(), + getWorldViewRectScaled().mBottom + INSTRUCTIONS_PAD, LLColor4( 1.0f, 1.0f, 1.0f, 0.5f ), LLFontGL::HCENTER, LLFontGL::TOP, LLFontGL::NORMAL,LLFontGL::DROP_SHADOW); } -S32 LLViewerWindow::getWindowHeight() const -{ - return mVirtualWindowRect.getHeight(); -} - -S32 LLViewerWindow::getWindowWidth() const -{ - return mVirtualWindowRect.getWidth(); -} - void* LLViewerWindow::getPlatformWindow() const { return mWindow->getPlatformWindow(); @@ -4170,49 +4175,65 @@ LLRootView* LLViewerWindow::getRootView() const return mRootView; } -LLRect LLViewerWindow::getVirtualWorldViewRect() const +LLRect LLViewerWindow::getWorldViewRectScaled() const { - LLRect world_view_rect = mWorldViewRect; - world_view_rect.mLeft = llround((F32)world_view_rect.mLeft / mDisplayScale.mV[VX]); - world_view_rect.mRight = llround((F32)world_view_rect.mRight / mDisplayScale.mV[VX]); - world_view_rect.mBottom = llround((F32)world_view_rect.mBottom / mDisplayScale.mV[VY]); - world_view_rect.mTop = llround((F32)world_view_rect.mTop / mDisplayScale.mV[VY]); - return world_view_rect; + return mWorldViewRectScaled; } -S32 LLViewerWindow::getWorldViewHeight() const +S32 LLViewerWindow::getWorldViewHeightScaled() const { - return mWorldViewRect.getHeight(); + return mWorldViewRectScaled.getHeight(); } -S32 LLViewerWindow::getWorldViewWidth() const +S32 LLViewerWindow::getWorldViewWidthScaled() const { - return mWorldViewRect.getWidth(); + return mWorldViewRectScaled.getWidth(); } -S32 LLViewerWindow::getWindowDisplayHeight() const + +S32 LLViewerWindow::getWorldViewHeightRaw() const +{ + return mWorldViewRectRaw.getHeight(); +} + +S32 LLViewerWindow::getWorldViewWidthRaw() const +{ + return mWorldViewRectRaw.getWidth(); +} + +S32 LLViewerWindow::getWindowHeightScaled() const { - return mWindowRect.getHeight(); + return mWindowRectScaled.getHeight(); } -S32 LLViewerWindow::getWindowDisplayWidth() const +S32 LLViewerWindow::getWindowWidthScaled() const { - return mWindowRect.getWidth(); + return mWindowRectScaled.getWidth(); +} + +S32 LLViewerWindow::getWindowHeightRaw() const +{ + return mWindowRectRaw.getHeight(); +} + +S32 LLViewerWindow::getWindowWidthRaw() const +{ + return mWindowRectRaw.getWidth(); } void LLViewerWindow::setup2DRender() { // setup ortho camera - gl_state_for_2d(mWindowRect.getWidth(), mWindowRect.getHeight()); + gl_state_for_2d(mWindowRectRaw.getWidth(), mWindowRectRaw.getHeight()); setup2DViewport(); } void LLViewerWindow::setup2DViewport(S32 x_offset, S32 y_offset) { - gGLViewport[0] = mWindowRect.mLeft + x_offset; - gGLViewport[1] = mWindowRect.mBottom + y_offset; - gGLViewport[2] = mWindowRect.getWidth(); - gGLViewport[3] = mWindowRect.getHeight(); + gGLViewport[0] = mWindowRectRaw.mLeft + x_offset; + gGLViewport[1] = mWindowRectRaw.mBottom + y_offset; + gGLViewport[2] = mWindowRectRaw.getWidth(); + gGLViewport[3] = mWindowRectRaw.getHeight(); glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); } @@ -4220,7 +4241,7 @@ void LLViewerWindow::setup2DViewport(S32 x_offset, S32 y_offset) void LLViewerWindow::setup3DRender() { // setup perspective camera - LLViewerCamera::getInstance()->setPerspective(NOT_FOR_SELECTION, mWorldViewRect.mLeft, mWorldViewRect.mBottom, mWorldViewRect.getWidth(), mWorldViewRect.getHeight(), FALSE, LLViewerCamera::getInstance()->getNear(), MAX_FAR_CLIP*2.f); + LLViewerCamera::getInstance()->setPerspective(NOT_FOR_SELECTION, mWorldViewRectRaw.mLeft, mWorldViewRectRaw.mBottom, mWorldViewRectRaw.getWidth(), mWorldViewRectRaw.getHeight(), FALSE, LLViewerCamera::getInstance()->getNear(), MAX_FAR_CLIP*2.f); setup3DViewport(); } @@ -4228,17 +4249,17 @@ void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset) { if (LLRenderTarget::getCurrentBoundTarget() != NULL) { - // don't use translation component of mWorldViewRect, as we are already in a properly sized render target + // don't use translation component of mWorldViewRectRaw, as we are already in a properly sized render target gGLViewport[0] = x_offset; gGLViewport[1] = y_offset; } else { - gGLViewport[0] = mWorldViewRect.mLeft + x_offset; - gGLViewport[1] = mWorldViewRect.mBottom + y_offset; + gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset; + gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset; } - gGLViewport[2] = mWorldViewRect.getWidth(); - gGLViewport[3] = mWorldViewRect.getHeight(); + gGLViewport[2] = mWorldViewRectRaw.getWidth(); + gGLViewport[3] = mWorldViewRectRaw.getHeight(); glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); } @@ -4449,8 +4470,8 @@ void LLViewerWindow::getTargetWindow(BOOL& fullscreen, S32& width, S32& height) if (mWindow && mWindow->getFullscreen() == mWantFullscreen) { - width = getWindowDisplayWidth(); - height = getWindowDisplayHeight(); + width = getWindowWidthRaw(); + height = getWindowHeightRaw(); } else if (mWantFullscreen) { @@ -4497,7 +4518,7 @@ BOOL LLViewerWindow::checkSettings() getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio")); } - reshape(getWindowDisplayWidth(), getWindowDisplayHeight()); + reshape(getWindowWidthRaw(), getWindowHeightRaw()); // force aspect ratio if (mIsFullscreenChecked) @@ -4723,8 +4744,8 @@ F32 LLViewerWindow::getDisplayAspectRatio() const F32 LLViewerWindow::getWorldViewAspectRatio() const { - F32 world_aspect = (F32)mWorldViewRect.getWidth() / (F32)mWorldViewRect.getHeight(); - //F32 window_aspect = (F32)mWindowRect.getWidth() / (F32)mWindowRect.getHeight(); + 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(); @@ -4740,7 +4761,7 @@ 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)mWindowRect.getHeight() / display_scale.mV[VY]) / 768.f : 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); @@ -4758,8 +4779,8 @@ void LLViewerWindow::calcDisplayScale() if (mWindow->getFullscreen()) { - display_scale.mV[0] = llround(display_scale.mV[0], 2.0f/(F32) mWindowRect.getWidth()); - display_scale.mV[1] = llround(display_scale.mV[1], 2.0f/(F32) mWindowRect.getHeight()); + 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) @@ -4772,6 +4793,18 @@ void LLViewerWindow::calcDisplayScale() } } +//static +LLRect LLViewerWindow::calcScaledRect(const LLRect & rect, const LLVector2& display_scale) +{ + LLRect res = rect; + res.mLeft = llround((F32)res.mLeft / display_scale.mV[VX]); + res.mRight = llround((F32)res.mRight / display_scale.mV[VX]); + res.mBottom = llround((F32)res.mBottom / display_scale.mV[VY]); + res.mTop = llround((F32)res.mTop / display_scale.mV[VY]); + + return res; +} + S32 LLViewerWindow::getChatConsoleBottomPad() { S32 offset = 0; @@ -4784,7 +4817,7 @@ S32 LLViewerWindow::getChatConsoleBottomPad() LLRect LLViewerWindow::getChatConsoleRect() { - LLRect full_window(0, getWindowHeight(), getWindowWidth(), 0); + LLRect full_window(0, getWindowHeightScaled(), getWindowWidthScaled(), 0); LLRect console_rect = full_window; const S32 CONSOLE_PADDING_TOP = 24; @@ -4806,7 +4839,7 @@ LLRect LLViewerWindow::getChatConsoleRect() { // Make console rect somewhat narrow so having inventory open is // less of a problem. - console_rect.mRight = console_rect.mLeft + 2 * getWindowWidth() / 3; + console_rect.mRight = console_rect.mLeft + 2 * getWindowWidthScaled() / 3; } return console_rect; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index d8f0a99a49c855f89db232ea3aa60804b4675f53..747fd3b2536907b5e9ab32fb424f0af9e1a43f36 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -210,21 +210,25 @@ class LLViewerWindow : public LLWindowCallbacks // LLRootView* getRootView() const; + // 3D world area in scaled pixels (via UI scale), use for most UI computations + LLRect getWorldViewRectScaled() const; + S32 getWorldViewHeightScaled() const; + S32 getWorldViewWidthScaled() const; + + // 3D world area, in raw unscaled pixels + LLRect getWorldViewRectRaw() const { return mWorldViewRectRaw; } + S32 getWorldViewHeightRaw() const; + S32 getWorldViewWidthRaw() const; + + // Window in scaled pixels (via UI scale), use for most UI computations + LLRect getWindowRectScaled() const { return mWindowRectScaled; } + S32 getWindowHeightScaled() const; + S32 getWindowWidthScaled() const; + // Window in raw pixels as seen on screen. - const LLRect& getWindowRect() const { return mWindowRect; }; - // portion of window that shows 3d world - const LLRect& getWorldViewRect() const { return mWorldViewRect; }; - LLRect getVirtualWorldViewRect() const; - S32 getWorldViewHeight() const; - S32 getWorldViewWidth() const; - S32 getWindowDisplayHeight() const; - S32 getWindowDisplayWidth() const; - - // Window in scaled pixels (via UI scale), use this for - // UI elements checking size. - const LLRect& getVirtualWindowRect() const { return mVirtualWindowRect; }; - S32 getWindowHeight() const; - S32 getWindowWidth() const; + LLRect getWindowRectRaw() const { return mWindowRectRaw; } + S32 getWindowHeightRaw() const; + S32 getWindowWidthRaw() const; LLWindow* getWindow() const { return mWindow; } void* getPlatformWindow() const; @@ -387,6 +391,7 @@ class LLViewerWindow : public LLWindowCallbacks F32 getWorldViewAspectRatio() const; const LLVector2& getDisplayScale() const { return mDisplayScale; } void calcDisplayScale(); + static LLRect calcScaledRect(const LLRect & rect, const LLVector2& display_scale); private: bool shouldShowToolTipFor(LLMouseHandler *mh); @@ -409,10 +414,12 @@ class LLViewerWindow : public LLWindowCallbacks BOOL mActive; BOOL mWantFullscreen; BOOL mShowFullscreenProgress; - LLRect mWindowRect; - LLRect mVirtualWindowRect; - LLRect mWorldViewRect; // specifies area of screen where we render the 3D world - LLRootView* mRootView; // a view of size mWindowRect, containing all child views + + LLRect mWindowRectRaw; // whole window, including UI + LLRect mWindowRectScaled; // whole window, scaled by UI size + LLRect mWorldViewRectRaw; // area of screen for 3D world + LLRect mWorldViewRectScaled; // area of screen for 3D world scaled by UI size + LLRootView* mRootView; // a view of size mWindowRectRaw, containing all child views LLVector2 mDisplayScale; LLCoordGL mCurrentMousePoint; // last mouse position in GL coords diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index 317e361c804d5ca93d16fe880f42307973bfe248..de5778827112fa732d9ba75e61b562ddc6ac0291 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -20,8 +20,9 @@ // other Linden headers #include "llviewerwindow.h" -LLViewerWindowListener::LLViewerWindowListener(const std::string& pumpname, LLViewerWindow* llviewerwindow): - LLDispatchListener(pumpname, "op"), +LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow): + LLEventAPI("LLViewerWindow", + "LLViewerWindow listener to (e.g.) save a screenshot"), mViewerWindow(llviewerwindow) { // add() every method we want to be able to invoke via this event API. @@ -34,8 +35,15 @@ LLViewerWindowListener::LLViewerWindowListener(const std::string& pumpname, LLVi // saveSnapshotArgs["showui"] = LLSD::Boolean(); // saveSnapshotArgs["rebuild"] = LLSD::Boolean(); // saveSnapshotArgs["type"] = LLSD::String(); - add("saveSnapshot", &LLViewerWindowListener::saveSnapshot, saveSnapshotArgs); - add("requestReshape", &LLViewerWindowListener::requestReshape); + add("saveSnapshot", + "Save screenshot: [\"filename\"], [\"width\"], [\"height\"], [\"showui\"], [\"rebuild\"], [\"type\"]\n" + "type: \"COLOR\", \"DEPTH\", \"OBJECT_ID\"\n" + "Post on [\"reply\"] an event containing [\"ok\"]", + &LLViewerWindowListener::saveSnapshot, + saveSnapshotArgs); + add("requestReshape", + "Resize the window: [\"w\"], [\"h\"]", + &LLViewerWindowListener::requestReshape); } void LLViewerWindowListener::saveSnapshot(const LLSD& event) const @@ -50,8 +58,8 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const #undef tp // Our add() call should ensure that the incoming LLSD does in fact // contain our required arguments. Deal with the optional ones. - S32 width (mViewerWindow->getWindowDisplayWidth()); - S32 height(mViewerWindow->getWindowDisplayHeight()); + S32 width (mViewerWindow->getWindowWidthRaw()); + S32 height(mViewerWindow->getWindowHeightRaw()); if (event.has("width")) width = event["width"].asInteger(); if (event.has("height")) diff --git a/indra/newview/llviewerwindowlistener.h b/indra/newview/llviewerwindowlistener.h index 59c636ecec85b5b683019d3d7475b45dbe7673d4..699f7907af2ef682a88ba5e4c6eff3d58733b06b 100644 --- a/indra/newview/llviewerwindowlistener.h +++ b/indra/newview/llviewerwindowlistener.h @@ -12,18 +12,17 @@ #if ! defined(LL_LLVIEWERWINDOWLISTENER_H) #define LL_LLVIEWERWINDOWLISTENER_H -#include "lleventdispatcher.h" +#include "lleventapi.h" class LLViewerWindow; class LLSD; /// Listen on an LLEventPump with specified name for LLViewerWindow request events. -class LLViewerWindowListener: public LLDispatchListener +class LLViewerWindowListener: public LLEventAPI { public: - /// Specify the pump name on which to listen, and bind the LLViewerWindow - /// instance to use (e.g. gViewerWindow). - LLViewerWindowListener(const std::string& pumpname, LLViewerWindow* llviewerwindow); + /// Bind the LLViewerWindow instance to use (e.g. gViewerWindow). + LLViewerWindowListener(LLViewerWindow* llviewerwindow); private: void saveSnapshot(const LLSD& event) const; diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index 999701ece1656d7d504659e41e03c9f52039b29f..6340189c934daaa32ac1acfb2392fb4e530991da 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -287,17 +287,22 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, min_dim /= 2; } - mDetailTextures[i]->reloadRawImage(ddiscard) ; + BOOL delete_raw = (mDetailTextures[i]->reloadRawImage(ddiscard) != NULL) ; if(mDetailTextures[i]->getRawImageLevel() != ddiscard)//raw iamge is not ready, will enter here again later. { - mDetailTextures[i]->destroyRawImage() ; + if(delete_raw) + { + mDetailTextures[i]->destroyRawImage() ; + } lldebugs << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << llendl; return FALSE; } mRawImages[i] = mDetailTextures[i]->getRawImage() ; - mDetailTextures[i]->destroyRawImage() ; - + if(delete_raw) + { + mDetailTextures[i]->destroyRawImage() ; + } if (mDetailTextures[i]->getWidth(ddiscard) != BASE_SIZE || mDetailTextures[i]->getHeight(ddiscard) != BASE_SIZE || mDetailTextures[i]->getComponents() != 3) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 16bd74f7989a9af73f5a7398bfbec9ea7805a3c7..75e35e5221459d2534707b105d92e4315bba5c21 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -624,7 +624,6 @@ F32 LLVOAvatar::sGreyUpdateTime = 0.f; // Helper functions //----------------------------------------------------------------------------- static F32 calc_bouncy_animation(F32 x); -static U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures); //----------------------------------------------------------------------------- // LLVOAvatar() @@ -647,7 +646,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mWindFreq(0.f), mRipplePhase( 0.f ), mBelowWater(FALSE), - mAppearanceAnimSetByUser(FALSE), mLastAppearanceBlendTime(0.f), mAppearanceAnimating(FALSE), mNameString(), @@ -2436,7 +2434,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation() { if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) { - param->stopAnimating(mAppearanceAnimSetByUser); + param->stopAnimating(FALSE); } } updateVisualParams(); @@ -2459,7 +2457,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation() { if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) { - param->animate(morph_amt, mAppearanceAnimSetByUser); + param->animate(morph_amt, FALSE); } } } @@ -5372,11 +5370,11 @@ void LLVOAvatar::updateShadowFaces() //----------------------------------------------------------------------------- // updateSexDependentLayerSets() //----------------------------------------------------------------------------- -void LLVOAvatar::updateSexDependentLayerSets( BOOL set_by_user ) +void LLVOAvatar::updateSexDependentLayerSets( BOOL upload_bake ) { - invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user ); - invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user ); - invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user ); + invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake ); + invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake ); + invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake ); } //----------------------------------------------------------------------------- @@ -5741,7 +5739,7 @@ LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const } // virtual -void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user ) +void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result ) { } @@ -5754,18 +5752,18 @@ void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b ) { } -void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user ) +void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake ) { if (global_color == mTexSkinColor) { - invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user ); - invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user ); - invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user ); + invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake ); + invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake ); + invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake ); } else if (global_color == mTexHairColor) { - invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user ); - invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, set_by_user ); + invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake ); + invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, upload_bake ); // ! BACKWARDS COMPATIBILITY ! // Fix for dealing with avatars from viewers that don't bake hair. @@ -5781,7 +5779,7 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL else if (global_color == mTexEyeColor) { // llinfos << "invalidateComposite cause: onGlobalColorChanged( eyecolor )" << llendl; - invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet, set_by_user ); + invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet, upload_bake ); } updateMeshTextures(); } @@ -6239,14 +6237,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name ) return TRUE; } -void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL set_by_user ) +void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL upload_bake ) { U32 param_name[3]; if( teToColorParams( te, param_name ) ) { - setVisualParamWeight( param_name[0], new_color.mV[VX], set_by_user ); - setVisualParamWeight( param_name[1], new_color.mV[VY], set_by_user ); - setVisualParamWeight( param_name[2], new_color.mV[VZ], set_by_user ); + setVisualParamWeight( param_name[0], new_color.mV[VX], upload_bake ); + setVisualParamWeight( param_name[1], new_color.mV[VY], upload_bake ); + setVisualParamWeight( param_name[2], new_color.mV[VZ], upload_bake ); } } @@ -6269,7 +6267,7 @@ LLColor4 LLVOAvatar::getDummyColor() return DUMMY_COLOR; } -void LLVOAvatar::dumpAvatarTEs( const std::string& context ) +void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const { /* const char* te_name[] = { "TEX_HEAD_BODYPAINT ", @@ -6592,7 +6590,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) { if (interp_params) { - startAppearanceAnimation(FALSE, FALSE); + startAppearanceAnimation(); } updateVisualParams(); @@ -6977,11 +6975,10 @@ void LLVOAvatar::cullAvatarsByPixelArea() } } -void LLVOAvatar::startAppearanceAnimation(BOOL set_by_user, BOOL play_sound) +void LLVOAvatar::startAppearanceAnimation() { if(!mAppearanceAnimating) { - mAppearanceAnimSetByUser = set_by_user; mAppearanceAnimating = TRUE; mAppearanceMorphTimer.reset(); mLastAppearanceBlendTime = 0.f; @@ -7639,9 +7636,17 @@ void LLVOAvatar::idleUpdateRenderCost() return; } - U32 shame = 1; + U32 shame = 0; - std::set<LLUUID> textures; + for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) + { + const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); + ETextureIndex tex_index = baked_dict->mTextureIndex; + if (isTextureVisible(tex_index)) + { + shame +=20; + } + } for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); @@ -7662,15 +7667,13 @@ void LLVOAvatar::idleUpdateRenderCost() const LLVOVolume* volume = drawable->getVOVolume(); if (volume) { - shame += calc_shame(volume, textures); + shame += volume->getRenderCost(); } } } } } - shame += textures.size() * 5; - setDebugText(llformat("%d", shame)); F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f); F32 red = llmin((F32) shame/1024.f, 1.f); @@ -7715,110 +7718,6 @@ const std::string LLVOAvatar::getBakedStatusForPrintout() const } -U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures) -{ - if (!volume) - { - return 0; - } - - U32 shame = 0; - - U32 invisi = 0; - U32 shiny = 0; - U32 glow = 0; - U32 alpha = 0; - U32 flexi = 0; - U32 animtex = 0; - U32 particles = 0; - U32 scale = 0; - U32 bump = 0; - U32 planar = 0; - - if (volume->isFlexible()) - { - flexi = 1; - } - if (volume->isParticleSource()) - { - particles = 1; - } - - const LLVector3& sc = volume->getScale(); - scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; - - const LLDrawable* drawablep = volume->mDrawable; - - if (volume->isSculpted()) - { - const LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLUUID sculpt_id = sculpt_params->getSculptTexture(); - textures.insert(sculpt_id); - } - - for (S32 i = 0; i < drawablep->getNumFaces(); ++i) - { - const LLFace* face = drawablep->getFace(i); - const LLTextureEntry* te = face->getTextureEntry(); - const LLViewerTexture* img = face->getTexture(); - - textures.insert(img->getID()); - - if (face->getPoolType() == LLDrawPool::POOL_ALPHA) - { - alpha++; - } - else if (img->getPrimaryFormat() == GL_ALPHA) - { - invisi = 1; - } - - if (te) - { - if (te->getBumpmap()) - { - bump = 1; - } - if (te->getShiny()) - { - shiny = 1; - } - if (te->getGlow() > 0.f) - { - glow = 1; - } - if (face->mTextureMatrix != NULL) - { - animtex++; - } - if (te->getTexGen()) - { - planar++; - } - } - } - - shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; - - LLViewerObject::const_child_list_t& child_list = volume->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); - ++iter) - { - const LLViewerObject* child_objectp = *iter; - const LLDrawable* child_drawablep = child_objectp->mDrawable; - if (child_drawablep) - { - const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); - if (child_volumep) - { - shame += calc_shame(child_volumep, textures); - } - } - } - - return shame; -} //virtual S32 LLVOAvatar::getTexImageSize() const diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 173ad02808a4981359c27699495e20a529412bcd..4b3e850e7ac0703082d33e77e8d9ff4a0f4db06e 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -522,7 +522,7 @@ class LLVOAvatar : // Composites //-------------------------------------------------------------------- public: - virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user); + virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); virtual void invalidateAll(); virtual void setCompositeUpdatesEnabled(BOOL b); @@ -558,7 +558,7 @@ class LLVOAvatar : public: void updateMeshTextures(); - void updateSexDependentLayerSets(BOOL set_by_user); + void updateSexDependentLayerSets(BOOL upload_bake); void dirtyMesh(); // Dirty the avatar mesh void updateMeshData(); protected: @@ -591,7 +591,7 @@ class LLVOAvatar : public: void processAvatarAppearance(LLMessageSystem* mesgsys); void hideSkirt(); - void startAppearanceAnimation(BOOL set_by_user, BOOL play_sound); + void startAppearanceAnimation(); //-------------------------------------------------------------------- // Appearance morphing @@ -600,14 +600,13 @@ class LLVOAvatar : BOOL mAppearanceAnimating; private: LLFrameTimer mAppearanceMorphTimer; - BOOL mAppearanceAnimSetByUser; F32 mLastAppearanceBlendTime; //-------------------------------------------------------------------- // Clothing colors (convenience functions to access visual parameters) //-------------------------------------------------------------------- public: - void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL set_by_user); + void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake); LLColor4 getClothesColor(LLVOAvatarDefines::ETextureIndex te); static BOOL teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name); @@ -616,7 +615,7 @@ class LLVOAvatar : //-------------------------------------------------------------------- public: LLColor4 getGlobalColor(const std::string& color_name ) const; - void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user); + void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake); private: LLTexGlobalColor* mTexSkinColor; LLTexGlobalColor* mTexHairColor; @@ -890,7 +889,7 @@ class LLVOAvatar : static void dumpArchetypeXML(void*); static void dumpBakedStatus(); const std::string getBakedStatusForPrintout() const; - void dumpAvatarTEs(const std::string& context); + void dumpAvatarTEs(const std::string& context) const; static F32 sUnbakedTime; // Total seconds with >=1 unbaked avatars static F32 sUnbakedUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index a2203ba2ea89ba1e2af78eefe34d0028d9114d28..d9c5e932a2648f197862c5a0fd0f9e0a84fb83dd 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -487,18 +487,10 @@ BOOL LLVOAvatarSelf::buildMenus() } // add in requested order to pie menu, inserting separators as necessary - S32 cur_pie_slice = 0; for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin(); attach_it != attachment_pie_menu_map.end(); ++attach_it) { - S32 requested_pie_slice = attach_it->first; S32 attach_index = attach_it->second; - while (cur_pie_slice < requested_pie_slice) - { - gAttachBodyPartPieMenus[group]->addSeparator(); - gDetachBodyPartPieMenus[group]->addSeparator(); - cur_pie_slice++; - } LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL); if (attachment) @@ -520,7 +512,6 @@ BOOL LLVOAvatarSelf::buildMenus() item_params.on_enable.parameter = attach_index; item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params); gDetachBodyPartPieMenus[group]->addChild(item); - cur_pie_slice++; } } } @@ -633,33 +624,33 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) return LLVOAvatar::getJoint(name); } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user ) +/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake ) { if (!which_param) { return FALSE; } LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(which_param->getID()); - return setParamWeight(param,weight,set_by_user); + return setParamWeight(param,weight,upload_bake); } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user ) +/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake ) { if (!param_name) { return FALSE; } LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(param_name); - return setParamWeight(param,weight,set_by_user); + return setParamWeight(param,weight,upload_bake); } -/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user ) +/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake ) { LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index); - return setParamWeight(param,weight,set_by_user); + return setParamWeight(param,weight,upload_bake); } -BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user ) +BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake ) { if (!param) { @@ -675,12 +666,12 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL LLWearable *wearable = gAgentWearables.getWearable(type,count); if (wearable) { - wearable->setVisualParamWeight(param->getID(), weight, set_by_user); + wearable->setVisualParamWeight(param->getID(), weight, upload_bake); } } } - return LLCharacter::setVisualParamWeight(param,weight,set_by_user); + return LLCharacter::setVisualParamWeight(param,weight,upload_bake); } /*virtual*/ @@ -691,7 +682,7 @@ void LLVOAvatarSelf::updateVisualParams() LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type); if (wearable) { - wearable->writeToAvatar(FALSE, FALSE); + wearable->writeToAvatar(); } } @@ -702,7 +693,7 @@ void LLVOAvatarSelf::updateVisualParams() void LLVOAvatarSelf::idleUpdateAppearanceAnimation() { // Animate all top-level wearable visual parameters - gAgentWearables.animateAllWearableParams(calcMorphAmount(), mAppearanceAnimSetByUser); + gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE); // apply wearable visual params to avatar updateVisualParams(); @@ -737,8 +728,7 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id) } } -// virtual -void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index) +void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index) { if (te >= TEX_NUM_INDICES) { @@ -1040,7 +1030,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view if (attachment->isObjectAttached(viewer_object)) { const LLUUID& attachment_id = viewer_object->getItemID(); - LLAppearanceManager::registerAttachment(attachment_id); + LLAppearanceManager::instance().registerAttachment(attachment_id); } return attachment; @@ -1079,7 +1069,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) } else { - LLAppearanceManager::unregisterAttachment(attachment_id); + LLAppearanceManager::instance().unregisterAttachment(attachment_id); } return TRUE; @@ -1347,7 +1337,7 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const return false; } -void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user ) +void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result ) { if( !layerset || !layerset->getUpdatesEnabled() ) { @@ -1358,7 +1348,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_u layerset->requestUpdate(); layerset->invalidateMorphMasks(); - if( set_by_user ) + if( upload_result ) { llassert(isSelf()); @@ -1588,7 +1578,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const llinfos << "LocTex " << name << ": Baked " << getTEImage(baked_equiv)->getID() << llendl; #endif } - else if (local_tex_obj->getImage() != NULL) + else if (local_tex_obj && local_tex_obj->getImage() != NULL) { if (local_tex_obj->getImage()->getID() == IMG_DEFAULT_AVATAR) { @@ -1945,9 +1935,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**) if (layer_set) { llinfos << "TAT: rebake - matched entry " << (S32)index << llendl; - // Apparently set_by_user == force upload - BOOL set_by_user = TRUE; - self->invalidateComposite(layer_set, set_by_user); + self->invalidateComposite(layer_set, TRUE); found = TRUE; LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES); } @@ -1983,8 +1971,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug) layer_set->cancelUpload(); } - BOOL set_by_user = TRUE; - invalidateComposite(layer_set, set_by_user); + invalidateComposite(layer_set, TRUE); LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES); } else @@ -2047,7 +2034,6 @@ void LLVOAvatarSelf::onCustomizeEnd() if (avatarp) { avatarp->invalidateAll(); - avatarp->requestLayerSetUploads(); } } @@ -2084,11 +2070,53 @@ void LLVOAvatarSelf::setInvisible(BOOL newvalue) { setCompositeUpdatesEnabled(TRUE); invalidateAll(); - requestLayerSetUploads(); gAgent.sendAgentSetAppearance(); } } +// HACK: this will null out the avatar's local texture IDs before the TE message is sent +// to ensure local texture IDs are not sent to other clients in the area. +// this is a short-term solution. The long term solution will be to not set the texture +// IDs in the avatar object, and keep them only in the wearable. +// This will involve further refactoring that is too risky for the initial release of 2.0. +bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const +{ + LLUUID texture_id[TEX_NUM_INDICES]; + // pack away current TEs to make sure we don't send them out + for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); + iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + ++iter) + { + const ETextureIndex index = iter->first; + const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + if (!texture_dict->mIsBakedTexture) + { + LLTextureEntry* entry = getTE((U8) index); + texture_id[index] = entry->getID(); + entry->setID(IMG_DEFAULT_AVATAR); + } + } + + bool success = packTEMessage(mesgsys); + + // unpack TEs to make sure we don't re-trigger a bake + for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); + iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + ++iter) + { + const ETextureIndex index = iter->first; + const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + if (!texture_dict->mIsBakedTexture) + { + LLTextureEntry* entry = getTE((U8) index); + entry->setID(texture_id[index]); + } + } + + return success; +} + + //------------------------------------------------------------------------ // needsRenderBeam() //------------------------------------------------------------------------ diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 8a66422c445a14c021943af260cef88dfa53d1f7..a1cad82effaac3a627a4a0f7468d28978aa96d18 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -86,15 +86,15 @@ class LLVOAvatarSelf : /*virtual*/ void requestStopMotion(LLMotion* motion); /*virtual*/ LLJoint* getJoint(const std::string &name); - /*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE ); - /*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE ); - /*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE ); + /*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE ); + /*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE ); + /*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE ); /*virtual*/ void updateVisualParams(); /*virtual*/ void idleUpdateAppearanceAnimation(); private: // helper function. Passed in param is assumed to be in avatar's parameter list. - BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user = FALSE ); + BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE ); /** Initialization @@ -186,7 +186,7 @@ class LLVOAvatarSelf : BOOL getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const; LLViewerFetchedTexture* getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const; const LLUUID& getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const; - void setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index); + 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); @@ -228,7 +228,7 @@ class LLVOAvatarSelf : // Composites //-------------------------------------------------------------------- public: - /* virtual */ void invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user); + /* virtual */ void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result); /* virtual */ void invalidateAll(); /* virtual */ void setCompositeUpdatesEnabled(BOOL b); // only works for self void setupComposites(); @@ -310,6 +310,7 @@ class LLVOAvatarSelf : public: static void onChangeSelfInvisible(BOOL newvalue); void setInvisible(BOOL newvalue); + bool sendAppearanceMessage(LLMessageSystem *mesgsys) const; /** Appearance ** ** diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index cefc88ebee85249ec4bda34b0d70d113de31d4a6..8f63df8c293866a364327de11e5ffeaa39bcad0e 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" +#include "llfloatercall.h" #include "llfloaterreg.h" #include "llimview.h" #include "llnotifications.h" @@ -46,6 +47,7 @@ LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap; LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap; LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = NULL; LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL; +LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChangedSignal; BOOL LLVoiceChannel::sSuspended = FALSE; @@ -305,8 +307,10 @@ void LLVoiceChannel::activate() // activating the proximal channel between IM calls LLVoiceChannel* old_channel = sCurrentVoiceChannel; sCurrentVoiceChannel = this; + mCallDialogPayload["old_channel_name"] = ""; if (old_channel) { + mCallDialogPayload["old_channel_name"] = old_channel->getSessionName(); old_channel->deactivate(); } } @@ -320,6 +324,8 @@ void LLVoiceChannel::activate() { setState(STATE_CALL_STARTED); } + + sCurrentVoiceChannelChangedSignal(this->mSessionID); } void LLVoiceChannel::getChannelInfo() @@ -403,9 +409,14 @@ void LLVoiceChannel::doSetState(const EState& new_state) void LLVoiceChannel::toggleCallWindowIfNeeded(EState state) { + LLFloaterCall* floater = dynamic_cast<LLFloaterCall*>(LLFloaterReg::getInstance("voice_call", mSessionID)); + if (!floater) + return; + if (state == STATE_CONNECTED) { - LLFloaterReg::showInstance("voice_call", mSessionID); + floater->init(mSessionID); + floater->openFloater(mSessionID); } // By checking that current state is CONNECTED we make sure that the call window // has been shown, hence there's something to hide. This helps when user presses @@ -413,7 +424,8 @@ void LLVoiceChannel::toggleCallWindowIfNeeded(EState state) // *TODO: move this check to LLFloaterCall? else if (state == STATE_HUNG_UP && mState == STATE_CONNECTED) { - LLFloaterReg::hideInstance("voice_call", mSessionID); + floater->reset(); + floater->closeFloater(); } } @@ -742,6 +754,8 @@ 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; + // status updates switch(type) { @@ -865,16 +879,77 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s void LLVoiceChannelP2P::setState(EState state) { - // HACK: Open/close the call window if needed. + // *HACK: Open/close the call window if needed. toggleCallWindowIfNeeded(state); + + llinfos << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl; - // you only "answer" voice invites in p2p mode - // so provide a special purpose message here - if (mReceivedCall && state == STATE_RINGING) + if (mReceivedCall) // incoming call { - gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs); - doSetState(state); - return; + // you only "answer" voice invites in p2p mode + // so provide a special purpose message here + if (mReceivedCall && state == STATE_RINGING) + { + gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs); + doSetState(state); + return; + } } + else // outgoing call + { + mCallDialogPayload["session_id"] = mSessionID; + mCallDialogPayload["session_name"] = mSessionName; + mCallDialogPayload["other_user_id"] = mOtherUserID; + if (state == STATE_RINGING || + state == STATE_CALL_STARTED) + { + // *HACK: open outgoing call floater if needed, might be better done elsewhere. + // *TODO: should move this squirrelly ui-fudging crap into LLOutgoingCallDialog itself + if (!mSessionName.empty()) + { + LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); + if (ocd) + { + ocd->getChild<LLTextBox>("calling")->setVisible(true); + ocd->getChild<LLTextBox>("leaving")->setVisible(true); + ocd->getChild<LLTextBox>("connecting")->setVisible(false); + ocd->getChild<LLTextBox>("noanswer")->setVisible(false); + } + } + } + /*else if (state == STATE_CONNECTED) + { + LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); + if (ocd) + { + ocd->getChild<LLTextBox>("calling")->setVisible(false); + ocd->getChild<LLTextBox>("leaving")->setVisible(false); + ocd->getChild<LLTextBox>("connecting")->setVisible(true); + ocd->getChild<LLTextBox>("noanswer")->setVisible(false); + } + }*/ + else if (state == STATE_ERROR) + { + LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); + if (ocd) + { + ocd->getChild<LLTextBox>("calling")->setVisible(false); + ocd->getChild<LLTextBox>("leaving")->setVisible(false); + ocd->getChild<LLTextBox>("connecting")->setVisible(false); + ocd->getChild<LLTextBox>("noanswer")->setVisible(true); + } + } + else if (state == STATE_HUNG_UP || + state == STATE_CONNECTED) + { + // hide popup + LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); + if (ocd) + { + ocd->closeFloater(); + } + } + } + LLVoiceChannel::setState(state); } diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 8f1e9ff02d3c9807781b2e19425e408f2212440e..639585de559bed89c1756831f216471540e31c85 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -54,6 +54,13 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t; + // on current channel changed signal + typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; + typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t; + static channel_changed_signal_t sCurrentVoiceChannelChangedSignal; + static boost::signals2::connection setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb) { return sCurrentVoiceChannelChangedSignal.connect(cb); } + + LLVoiceChannel(const LLUUID& session_id, const std::string& session_name); virtual ~LLVoiceChannel(); @@ -102,6 +109,7 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver EState mState; std::string mSessionName; LLSD mNotifyArgs; + LLSD mCallDialogPayload; BOOL mIgnoreNextSessionLeave; LLHandle<LLPanel> mLoginNotificationHandle; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 39d4bb0c029396af530e18908570179de4ba5a45..479cf5a04d0ca8dd71612bacfed1d3ab4bcc1420 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1598,7 +1598,7 @@ void LLVoiceClient::stateMachine() } else { - LL_WARNS("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; + 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; } } } @@ -1867,7 +1867,7 @@ void LLVoiceClient::stateMachine() } else { - LL_WARNS("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL; + LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL; } } } @@ -4273,7 +4273,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent( if(incoming) { // Send the voice chat invite to the GUI layer - // TODO: Question: Should we correlate with the mute list here? + // *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()) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 5ac6dcce5a9d22c0167a554944c2be4e294b29e7..428af5380c759e02777934e6f8efda63d0b24e51 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -109,6 +109,7 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject { result = te->getMediaData()->asLLSD(); // XXX HACK: workaround bug in asLLSD() where whitelist is not set properly + // See DEV-41949 if (!result.has(LLMediaEntry::WHITELIST_KEY)) { result[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); @@ -139,6 +140,9 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject virtual std::string getCapabilityUrl(const std::string &name) const { return mObject->getRegion()->getCapability(name); } + virtual bool isDead() const + { return mObject->isDead(); } + private: LLPointer<LLVOVolume> mObject; }; @@ -182,6 +186,22 @@ LLVOVolume::~LLVOVolume() } } +void LLVOVolume::markDead() +{ + if (!mDead) + { + // TODO: tell LLMediaDataClient to remove this object from its queue + + // Detach all media impls from this object + for(U32 i = 0 ; i < mMediaImplList.size() ; i++) + { + removeMediaImpl(i); + } + } + + LLViewerObject::markDead(); +} + // static void LLVOVolume::initClass() @@ -1668,6 +1688,13 @@ void LLVOVolume::requestMediaDataUpdate() sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this)); } +bool LLVOVolume::isMediaDataBeingFetched() const +{ + // I know what I'm doing by const_casting this away: this is just + // a wrapper class that is only going to do a lookup. + return sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this))); +} + void LLVOVolume::cleanUpMediaImpls() { // Iterate through our TEs and remove any Impls that are no longer used @@ -1700,10 +1727,16 @@ void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array) void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool merge, bool ignore_agent) { + if(mDead) + { + // If the object has been marked dead, don't process media updates. + return; + } + LLTextureEntry *te = getTE(texture_index); - //llinfos << "BEFORE: texture_index = " << texture_index - // << " hasMedia = " << te->hasMedia() << " : " - // << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; + 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; std::string previous_url; LLMediaEntry* mep = te->getMediaData(); @@ -1743,9 +1776,9 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m removeMediaImpl(texture_index); } - //llinfos << "AFTER: texture_index = " << texture_index - // << " hasMedia = " << te->hasMedia() << " : " - // << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; + LL_DEBUGS("MediaOnAPrim") << "AFTER: texture_index = " << texture_index + << " hasMedia = " << te->hasMedia() << " : " + << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl; } void LLVOVolume::mediaNavigateBounceBack(U8 texture_index) @@ -1768,7 +1801,7 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index) } if (! url.empty()) { - LL_INFOS("LLMediaDataClient") << "bouncing back to URL: " << url << LL_ENDL; + LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL; impl->navigateTo(url, "", false, true); } } @@ -2533,6 +2566,107 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const return mDrawable->getWorldMatrix(); } +U32 LLVOVolume::getRenderCost() const +{ + U32 shame = 0; + + U32 invisi = 0; + U32 shiny = 0; + U32 glow = 0; + U32 alpha = 0; + U32 flexi = 0; + U32 animtex = 0; + U32 particles = 0; + U32 scale = 0; + U32 bump = 0; + U32 planar = 0; + + if (isFlexible()) + { + flexi = 1; + } + if (isParticleSource()) + { + particles = 1; + } + + const LLVector3& sc = getScale(); + scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2]; + + const LLDrawable* drawablep = mDrawable; + + if (isSculpted()) + { + const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT); + LLUUID sculpt_id = sculpt_params->getSculptTexture(); + shame += 5; + } + + for (S32 i = 0; i < drawablep->getNumFaces(); ++i) + { + const LLFace* face = drawablep->getFace(i); + const LLTextureEntry* te = face->getTextureEntry(); + const LLViewerTexture* img = face->getTexture(); + + shame += 5; + + if (face->getPoolType() == LLDrawPool::POOL_ALPHA) + { + alpha++; + } + else if (img->getPrimaryFormat() == GL_ALPHA) + { + invisi = 1; + } + + if (te) + { + if (te->getBumpmap()) + { + bump = 1; + } + if (te->getShiny()) + { + shiny = 1; + } + if (te->getGlow() > 0.f) + { + glow = 1; + } + if (face->mTextureMatrix != NULL) + { + animtex++; + } + if (te->getTexGen()) + { + planar++; + } + } + } + + shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; + + LLViewerObject::const_child_list_t& child_list = getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); + ++iter) + { + const LLViewerObject* child_objectp = *iter; + const LLDrawable* child_drawablep = child_objectp->mDrawable; + if (child_drawablep) + { + const LLVOVolume* child_volumep = child_drawablep->getVOVolume(); + if (child_volumep) + { + shame += child_volumep->getRenderCost(); + } + } + } + + return shame; + +} + //static void LLVOVolume::preUpdateGeom() { diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 784ef16ba363122795dab59529cef4e7ee1ab356..70d203daf2d2a1c2376cbfa272a1ca3ed247c5ac 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -100,6 +100,7 @@ class LLVOVolume : public LLViewerObject public: LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); + /*virtual*/ void markDead(); // Override (and call through to parent) to clean up media references /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); @@ -120,7 +121,7 @@ class LLVOVolume : public LLViewerObject const LLMatrix4& getRelativeXform() const { return mRelativeXform; } const LLMatrix3& getRelativeXformInvTrans() const { return mRelativeXformInvTrans; } /*virtual*/ const LLMatrix4 getRenderMatrix() const; - + U32 getRenderCost() const; /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face = -1, // which face to check, -1 = ALL_SIDES @@ -265,7 +266,10 @@ class LLVOVolume : public LLViewerObject bool hasMedia() const; LLVector3 getApproximateFaceNormal(U8 face_id); - + + // Returns 'true' iff the media data for this object is in flight + bool isMediaDataBeingFetched() const; + protected: S32 computeLODDetail(F32 distance, F32 radius); BOOL calcLOD(); diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 3185ee45bfe1ae2f69526a409e1a4a128ea06727..ced0b6489667db5ba608d0c4d73b96e42525a141 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -38,6 +38,7 @@ #include "lllocaltextureobject.h" #include "llviewertexturelist.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llviewerregion.h" #include "llvoavatar.h" #include "llvoavatarself.h" @@ -225,7 +226,13 @@ BOOL LLWearable::importFile( LLFILE* file ) return FALSE; } - if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion ) + + // Temoprary hack to allow wearables with definition version 24 to still load. + // This should only affect lindens and NDA'd testers who have saved wearables in 2.0 + // the extra check for version == 24 can be removed before release, once internal testers + // have loaded these wearables again. See hack pt 2 at bottom of function to ensure that + // these wearables get re-saved with version definition 22. + if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion && mDefinitionVersion != 24 ) { llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl; return FALSE; @@ -414,6 +421,18 @@ BOOL LLWearable::importFile( LLFILE* file ) // copy all saved param values to working params revertValues(); + // Hack pt 2. If the wearable we just loaded has definition version 24, + // then force a re-save of this wearable after slamming the version number to 22. + // This number was incorrectly incremented for internal builds before release, and + // this fix will ensure that the affected wearables are re-saved with the right version number. + // the versions themselves are compatible. This code can be removed before release. + if( mDefinitionVersion == 24 ) + { + mDefinitionVersion = 22; + U32 index = gAgentWearables.getWearableIndex(this); + gAgentWearables.saveWearable(mType,index,TRUE); + } + return TRUE; } @@ -602,7 +621,7 @@ void LLWearable::setTexturesToDefaults() } // Updates the user's avatar's appearance -void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater ) +void LLWearable::writeToAvatar() { LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); llassert( avatar ); @@ -622,24 +641,10 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater S32 param_id = param->getID(); F32 weight = getVisualParamWeight(param_id); - // only animate with user-originated changes - if (set_by_user) - { - param->setAnimationTarget(weight, set_by_user); - } - else - { - avatar->setVisualParamWeight( param_id, weight, set_by_user ); - } + avatar->setVisualParamWeight( param_id, weight, FALSE ); } } - // only interpolate with user-originated changes - if (set_by_user) - { - avatar->startAppearanceAnimation(TRUE, TRUE); - } - // Pull texture entries for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) { @@ -657,24 +662,17 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater } LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); // MULTI-WEARABLE: replace hard-coded 0 - avatar->setLocalTextureTE(te, image, set_by_user, 0); + avatar->setLocalTextureTE(te, image, 0); } } - - if( gFloaterCustomize && update_customize_floater ) - { - gFloaterCustomize->setWearable(mType, 0); - gFloaterCustomize->setCurrentWearableType( mType ); - } - ESex new_sex = avatar->getSex(); if( old_sex != new_sex ) { - avatar->updateSexDependentLayerSets( set_by_user ); + avatar->updateSexDependentLayerSets( FALSE ); } -// if( set_by_user ) +// if( upload_bake ) // { // gAgent.sendAgentSetAppearance(); // } @@ -683,7 +681,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater // Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values. // static -void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user ) +void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake ) { LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); llassert( avatar ); @@ -707,7 +705,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user ) if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) { S32 param_id = param->getID(); - avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user ); + avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake ); } } @@ -719,7 +717,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user ) avatar->updateVisualParams(); avatar->wearableUpdated(type); -// if( set_by_user ) +// if( upload_bake ) // { // gAgent.sendAgentSetAppearance(); // } @@ -852,6 +850,7 @@ void LLWearable::addVisualParam(LLVisualParam *param) } param->setIsDummy(FALSE); mVisualParamIndexMap[param->getID()] = param; + mSavedVisualParamMap[param->getID()] = param->getDefaultWeight(); } void LLWearable::setVisualParams() @@ -868,12 +867,12 @@ void LLWearable::setVisualParams() } -void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL set_by_user) +void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL upload_bake) { if( is_in_map(mVisualParamIndexMap, param_index ) ) { LLVisualParam *wearable_param = mVisualParamIndexMap[param_index]; - wearable_param->setWeight(value, set_by_user); + wearable_param->setWeight(value, upload_bake); } else { @@ -914,14 +913,14 @@ void LLWearable::getVisualParams(visual_param_vec_t &list) } } -void LLWearable::animateParams(F32 delta, BOOL set_by_user) +void LLWearable::animateParams(F32 delta, BOOL upload_bake) { for(visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); ++iter) { LLVisualParam *param = (LLVisualParam*) iter->second; - param->animate(delta, set_by_user); + param->animate(delta, upload_bake); } } @@ -939,14 +938,14 @@ LLColor4 LLWearable::getClothesColor(S32 te) const return color; } -void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user ) +void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake ) { U32 param_name[3]; if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) ) { for( U8 index = 0; index < 3; index++ ) { - setVisualParamWeight(param_name[index], new_color.mV[index], set_by_user); + setVisualParamWeight(param_name[index], new_color.mV[index], upload_bake); } } } @@ -954,11 +953,39 @@ void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by void LLWearable::revertValues() { //update saved settings so wearable is no longer dirty + // non-driver params first for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) { S32 id = iter->first; F32 value = iter->second; - setVisualParamWeight(id, value, TRUE); + LLVisualParam *param = getVisualParam(id); + if(param && !dynamic_cast<LLDriverParam*>(param) ) + { + setVisualParamWeight(id, value, TRUE); + } + } + + //then driver params + for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) + { + S32 id = iter->first; + F32 value = iter->second; + LLVisualParam *param = getVisualParam(id); + if(param && dynamic_cast<LLDriverParam*>(param) ) + { + setVisualParamWeight(id, value, TRUE); + } + } + + // make sure that saved values are sane + for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) + { + S32 id = iter->first; + LLVisualParam *param = getVisualParam(id); + if( param ) + { + mSavedVisualParamMap[id] = param->getWeight(); + } } syncImages(mSavedTEMap, mTEMap); @@ -1072,6 +1099,12 @@ void LLWearable::destroyTextures() mSavedTEMap.clear(); } + +void LLWearable::setLabelUpdated() const +{ + gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID()); +} + struct LLWearableSaveData { EWearableType mType; diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index 96631811c58cdec770637de31e049343d16d2cdb..0863adb7f56fa590fa411cb3ac6555b3ed191602 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -89,9 +89,9 @@ class LLWearable BOOL isDirty() const; BOOL isOldVersion() const; - void writeToAvatar( BOOL set_by_user, BOOL update_customize_floater = TRUE ); - void removeFromAvatar( BOOL set_by_user ) { LLWearable::removeFromAvatar( mType, set_by_user ); } - static void removeFromAvatar( EWearableType type, BOOL set_by_user ); + void writeToAvatar(); + void removeFromAvatar( BOOL upload_bake ) { LLWearable::removeFromAvatar( mType, upload_bake ); } + static void removeFromAvatar( EWearableType type, BOOL upload_bake ); BOOL exportFile(LLFILE* file) const; BOOL importFile(LLFILE* file); @@ -115,19 +115,21 @@ class LLWearable void setLocalTextureObject(S32 index, LLLocalTextureObject *lto); void addVisualParam(LLVisualParam *param); void setVisualParams(); - void setVisualParamWeight(S32 index, F32 value, BOOL set_by_user); + void setVisualParamWeight(S32 index, F32 value, BOOL upload_bake); F32 getVisualParamWeight(S32 index) const; LLVisualParam* getVisualParam(S32 index) const; void getVisualParams(visual_param_vec_t &list); - void animateParams(F32 delta, BOOL set_by_user); + void animateParams(F32 delta, BOOL upload_bake); LLColor4 getClothesColor(S32 te) const; - void setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user ); + void setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake ); void revertValues(); BOOL isOnTop() const; + // Something happened that requires the wearable's label to be updated (e.g. worn/unworn). + void setLabelUpdated() const; private: typedef std::map<S32, LLLocalTextureObject*> te_map_t; diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index 8d3165b98c65eb47d8d91759aee9cef25571d7bc..9897f40c4e96afbaa2b382f2abeaefa2f51847e3 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -196,7 +196,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 // END DEBUG //LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; - LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); img->setBoostLevel(LLViewerTexture::BOOST_MAP); // Return the smart pointer diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 136a0a27aad80bd55d8a62f701b9467ffe2a2479..e9ec52339655c86bce1086ad6f0e6e032e0a10f2 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -344,7 +344,12 @@ LLPipeline::LLPipeline() : mWLSkyPool(NULL), mLightMask(0), mLightMovingMask(0), - mLightingDetail(0) + mLightingDetail(0), + mScreenWidth(0), + mScreenHeight(0), + mViewportWidth(0), + mViewportHeight(0) + { mNoiseMap = 0; mTrueNoiseMap = 0; @@ -521,6 +526,24 @@ void LLPipeline::resizeScreenTexture() void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) { + bool screen_size_changed = resX != mScreenWidth || resY != mScreenHeight; + bool viewport_size_changed = viewport_width != mViewportWidth || viewport_height != mViewportHeight; + + if (!screen_size_changed + && !viewport_size_changed) + { + // nothing to do + return; + } + + // remember these dimensions + mScreenWidth = resX; + mScreenHeight = resY; + mViewportWidth = viewport_width; + mViewportHeight = viewport_height; + + llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl; + U32 samples = gSavedSettings.getU32("RenderFSAASamples"); U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor"); @@ -530,7 +553,8 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) resY /= res_mod; } - if (gSavedSettings.getBOOL("RenderUIBuffer")) + if (gSavedSettings.getBOOL("RenderUIBuffer") + && screen_size_changed) { mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); } @@ -538,27 +562,44 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) if (LLPipeline::sRenderDeferred) { //allocate deferred rendering color buffers - mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); - mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); - addDeferredAttachments(mDeferredScreen); - mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); - mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + if (screen_size_changed) + { + mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + addDeferredAttachments(mDeferredScreen); + } + // always set viewport to desired size, since allocate resets the viewport + + if (screen_size_changed) + { + mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + } for (U32 i = 0; i < 3; i++) { - mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + if (screen_size_changed) + { + mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + } } for (U32 i = 0; i < 2; i++) { - mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + if (screen_size_changed) + { + mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + } } F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale"); for (U32 i = 0; i < 4; i++) { - mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + if (screen_size_changed) + { + mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + } } @@ -567,36 +608,49 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) for (U32 i = 4; i < 6; i++) { - mShadow[i].allocate(width, height, 0, TRUE, FALSE); + if (screen_size_changed) + { + mShadow[i].allocate(width, height, 0, TRUE, FALSE); + } } width = nhpo2(resX)/2; height = nhpo2(resY)/2; - mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE); + if (screen_size_changed) + { + mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE); + } } else { - mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + if (screen_size_changed) + { + mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + } } if (gGLManager.mHasFramebufferMultisample && samples > 1) { - mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples); - mScreen.setSampleBuffer(&mSampleBuffer); - - if (LLPipeline::sRenderDeferred) + if (screen_size_changed) { - addDeferredAttachments(mSampleBuffer); - mDeferredScreen.setSampleBuffer(&mSampleBuffer); + mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples); + if (LLPipeline::sRenderDeferred) + { + addDeferredAttachments(mSampleBuffer); + mDeferredScreen.setSampleBuffer(&mSampleBuffer); + } } + mSampleBuffer.setViewport(viewport_width, viewport_height); + mScreen.setSampleBuffer(&mSampleBuffer); stop_glerror(); } - if (LLPipeline::sRenderDeferred) + if (LLPipeline::sRenderDeferred + && screen_size_changed) { //share depth buffer between deferred targets mDeferredScreen.shareDepthBuffer(mScreen); for (U32 i = 0; i < 3; i++) @@ -710,6 +764,9 @@ void LLPipeline::createGLBuffers() } allocateScreenBuffer(resX,resY); + mScreenWidth = 0; + mScreenHeight = 0; + } if (sRenderDeferred) @@ -3049,7 +3106,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PICKING)) { LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderForSelect"); - gObjectList.renderObjectsForSelect(camera, gViewerWindow->getVirtualWindowRect()); + gObjectList.renderObjectsForSelect(camera, gViewerWindow->getWindowRectScaled()); } else { @@ -5530,8 +5587,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor"); LLVector2 tc1(0,0); - LLVector2 tc2((F32) gViewerWindow->getWorldViewWidth()*2, - (F32) gViewerWindow->getWorldViewHeight()*2); + LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2, + (F32) gViewerWindow->getWorldViewHeightRaw()*2); if (res_mod > 1) { @@ -5731,14 +5788,14 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } - gGLViewport[0] = gViewerWindow->getWorldViewRect().mLeft; - gGLViewport[1] = gViewerWindow->getWorldViewRect().mBottom; - gGLViewport[2] = gViewerWindow->getWorldViewRect().getWidth(); - gGLViewport[3] = gViewerWindow->getWorldViewRect().getHeight(); + gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; + gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; + gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); + gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); - tc2.setVec((F32) gViewerWindow->getWorldViewWidth(), - (F32) gViewerWindow->getWorldViewHeight()); + tc2.setVec((F32) gViewerWindow->getWorldViewWidthRaw(), + (F32) gViewerWindow->getWorldViewHeightRaw()); gGL.flush(); @@ -8742,7 +8799,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) glClearStencil(0); // get the number of pixels per angle - F32 pa = gViewerWindow->getWindowDisplayHeight() / (RAD_TO_DEG * LLViewerCamera::getInstance()->getView()); + F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * LLViewerCamera::getInstance()->getView()); //get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing) U32 resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index ce50a3740503eb81c6e0eedfabb5741d30738152..8b6de5d546dfaa45f6850e1fae6b75ea743964e2 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -467,6 +467,11 @@ class LLPipeline static F32 sMinRenderSize; //screen texture + U32 mScreenWidth; + U32 mScreenHeight; + U32 mViewportWidth; + U32 mViewportHeight; + LLRenderTarget mScreen; LLRenderTarget mUIScreen; LLRenderTarget mDeferredScreen; diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 7e19a80c1096965d3aff5cd96bd96b43e1ed3fb3..eb8ec00bb95d0cab34d64851cc50505bd15c7c37 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -513,7 +513,7 @@ reference="White" /> <color name="ObjectChatColor" - reference="LtGray" /> + reference="0.7 0.8 0.9 1" /> <color name="OverdrivenColor" value="1 0 0 1" /> @@ -663,7 +663,10 @@ value="0.812 0.753 0.451 1" /> <color name="ToolTipTextColor" - value="0.749 0.749 0.749 1" /> + reference="DkGray2" /> + <color + name="InspectorTipTextColor" + reference="LtGray" /> <color name="UserChatColor" reference="LtGray" /> diff --git a/indra/newview/skins/default/html/da/loading/loading.html b/indra/newview/skins/default/html/da/loading/loading.html index 5f3426eb609306458ed1b8138b2cee9b5b23bee9..cdad5702b9851f457a48ed564a4533bb7ff5e33a 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 44a621b2164c6df52c8f42e513a2db51b24397bf..3eddbc24f5e9ae6510ed3cd31e133aa0c2ebd1a3 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 1c62d2f73e0e7ee72773a83e0437bfd62a4c0706..34e5c84c4d476b1e6a53db45664eef533017aea6 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 c4260b34c08cea4189b3ea5bed809364ad19d597..f03284ba8ca4d27794bf9217b1ab619ef5cb4c2a 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 b3953448e97ab1b65350fc922deec3b784369e70..23c0ef03bc4ee5a7a2b316455598fe0d430da1af 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 ab15a073bae471441748b9112fc1fa3e96903b9f..ade91f76c28b706a7617af45d4b32bcce7f8e96e 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 ab37e41f0453bacafde9c57af2ddd15dd57c40f5..0f9af31f6ef880ee8128ad7b19d1d276c594e047 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 35cf74a35f936d5afb971af79a9286cc6f92f6ef..069dc5d12fffac9f361599f97d127db049b12954 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 0215bd7e47228e86a3bf8fbb5796a9ef7f8b903b..39a8691f3f95053245cd4460d6bc017d3f1faf99 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 50f3dfb0c5b18b900f449807c2ee80a463ca1c3e..515890c2d5cad0801b487db19048d834a61cef85 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 a83e1123d0f6088510d21df187a13cd9424e1e52..635ea62406e12733ed1d6ef4a089b111a53787a7 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 892c0b9f7fb045d3c856b40ff7883d6950b702a6..dcc0d73c1acfd4e26fce52c806351ccc37ffcf20 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 1ac07bff3403b87bcff4f970c8a7b193a8a44a17..e7812e7c8e66e913fd9eeb9fcd8ce6bfea6eb548 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 3b5b8679b43d88c8342cba5aa0437eb4bfa91fbe..0f67994635083f8e43bcaa2f3ca13d209c55c697 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 d1d5d25c927538a41b42ee4eb01c6924bb652d8a..462ea291d9658b33fe6560ac511072b09b952ba3 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/bottomtray/Notices_Unread.png b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png index 98f1f04b9a70d6eeb129a0f0355d220518b03d33..aa3898ca99f816f86ecb763761d43d91a3d7420a 100644 Binary files a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png and b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png index a355917fcaf9b823436942abfd08af3726af2f9b..598342ea805b903d7e1b5bc9b25d86d41d2d9c96 100644 Binary files a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png and b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png differ diff --git a/indra/newview/skins/default/textures/icons/AudioMute_Off.png b/indra/newview/skins/default/textures/icons/AudioMute_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..938aaef491303fe1a5e1a65585c4f971c84a1d21 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/AudioMute_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/AudioMute_Over.png b/indra/newview/skins/default/textures/icons/AudioMute_Over.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd1b12aae62337ff22651320aef61acb324f302 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/AudioMute_Over.png differ diff --git a/indra/newview/skins/default/textures/icons/Audio_Off.png b/indra/newview/skins/default/textures/icons/Audio_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..ef746aab924c7da8e61199ecc3518d8c15b1946a Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Audio_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/Audio_Press.png b/indra/newview/skins/default/textures/icons/Audio_Press.png new file mode 100644 index 0000000000000000000000000000000000000000..25a669224a841e29359f502a8ce004097ebb1017 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Audio_Press.png differ diff --git a/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png b/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..69646ce473709df726453b1f221b968f79c3cdb9 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png b/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..75bd73cef1a3a49574463ab5aab0f705ce02228a Binary files /dev/null and b/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png differ diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Off.png b/indra/newview/skins/default/textures/icons/MinusItem_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..6f285f35462906c83fd74f5177f995f5ba7fda2c Binary files /dev/null and b/indra/newview/skins/default/textures/icons/MinusItem_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Press.png b/indra/newview/skins/default/textures/icons/MinusItem_Press.png new file mode 100644 index 0000000000000000000000000000000000000000..50f65765d5f705920468233ed5bd85e683600cff Binary files /dev/null and b/indra/newview/skins/default/textures/icons/MinusItem_Press.png differ diff --git a/indra/newview/skins/default/textures/icons/Pause_Off.png b/indra/newview/skins/default/textures/icons/Pause_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..77f6be569dbe2e9376208c6d1901bfd5e1eac80e Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Pause_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/Pause_Over.png b/indra/newview/skins/default/textures/icons/Pause_Over.png new file mode 100644 index 0000000000000000000000000000000000000000..580808bf7eb488469301f6ec6c0b2b3f1c032668 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Pause_Over.png differ diff --git a/indra/newview/skins/default/textures/icons/Pause_Press.png b/indra/newview/skins/default/textures/icons/Pause_Press.png new file mode 100644 index 0000000000000000000000000000000000000000..859db34cae57d51f19993e847d3b3736855739f8 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Pause_Press.png differ diff --git a/indra/newview/skins/default/textures/icons/Play_Off.png b/indra/newview/skins/default/textures/icons/Play_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..e594c1a4cb77b34eb8fa84065b804506e5cb2442 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Play_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/Play_Over.png b/indra/newview/skins/default/textures/icons/Play_Over.png new file mode 100644 index 0000000000000000000000000000000000000000..70ab94e8c23599c46e851874feddd4375b529a8f Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Play_Over.png differ diff --git a/indra/newview/skins/default/textures/icons/Play_Press.png b/indra/newview/skins/default/textures/icons/Play_Press.png new file mode 100644 index 0000000000000000000000000000000000000000..b52742c6da3ef4dea9c22ad20d80bcd41c06938a Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Play_Press.png differ diff --git a/indra/newview/skins/default/textures/icons/SkipBackward_Off.png b/indra/newview/skins/default/textures/icons/SkipBackward_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc10e6583e2928dd19f26678832d317e1668482 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/SkipBackward_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/SkipForward_Off.png b/indra/newview/skins/default/textures/icons/SkipForward_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..2892e3cfa92e314e37f2b63193cb79acb9455fdd Binary files /dev/null and b/indra/newview/skins/default/textures/icons/SkipForward_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/StopReload_Off.png b/indra/newview/skins/default/textures/icons/StopReload_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..698569a540337429cd3c7c570167ee47b379f4e8 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/StopReload_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/StopReload_Over.png b/indra/newview/skins/default/textures/icons/StopReload_Over.png new file mode 100644 index 0000000000000000000000000000000000000000..251b38630a418a057c650c51960c2a4532711f42 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/StopReload_Over.png differ diff --git a/indra/newview/skins/default/textures/icons/Zoom_Off.png b/indra/newview/skins/default/textures/icons/Zoom_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..d096720c9c26010f75347f14f12b27a32ffa63df Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Zoom_Off.png differ diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png new file mode 100644 index 0000000000000000000000000000000000000000..b5508423ebc0f6ae36b11d37fb0cf8697a727692 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png differ diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png new file mode 100644 index 0000000000000000000000000000000000000000..4813d37198356805ef1c67724adae778fec9a442 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png differ diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.png new file mode 100644 index 0000000000000000000000000000000000000000..41984c43e46f5f46913209821b219c9957c56121 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/parcel_color_M.png differ diff --git a/indra/newview/skins/default/textures/navbar/Flag.png b/indra/newview/skins/default/textures/navbar/Flag.png new file mode 100644 index 0000000000000000000000000000000000000000..df53c8922480451b49e14f87dfd7d42aa7d502b2 Binary files /dev/null and b/indra/newview/skins/default/textures/navbar/Flag.png differ diff --git a/indra/newview/skins/default/textures/navbar/Lock.png b/indra/newview/skins/default/textures/navbar/Lock.png new file mode 100644 index 0000000000000000000000000000000000000000..cf569d6ad29c42622f8cd7f4ccbec90cc864b26f Binary files /dev/null and b/indra/newview/skins/default/textures/navbar/Lock.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index fba8e0b06c57fff555ac5aefa64847b9e1caedb8..99f6fc5cb304478fa3093afe46841a994022cf05 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -1,3 +1,33 @@ +<!-- +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). +NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry +with the same filename but different name + +<texture + name="MyTexture" (mandatory) + - this is the name you reference the texture by in XUI. For example, <button image_unselected="MyTexture"/> + file_name="images/my_texture.png" (optional) + - this is the path to the actual file asset, relative to the current skins "textures" directory. + If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case. + NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly + preload="true" (optional, false by default) + - If true, we will attempt to load the image before displaying any UI. + If false, we will load in the background after initializing the UI. + use_mips="true" (currently unused) + scale.left="1" + scale.bottom="1" + scale.top="15" + scale.right="31" + - Specifies the segmentation for 9-slice image scaling. Specifically, the pixel offsets from the LOWER LEFT corner + that define the region of the image that is stretched to make the whole image fit in the required space. + In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up + and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left + corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required + region. +--> + <textures version="101"> <!-- Please add new files alphabetically to prevent merge conflicts. JC --> <texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" /> @@ -20,8 +50,20 @@ <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_Up" file_name="widgets/Arrow_Up.png" preload="true" /> - <texture name="Arrow_Down" file_name="widgets/Arrow_Down.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" /> + <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" /> + <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" /> + + <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="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" /> <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" /> @@ -30,6 +72,8 @@ <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" /> @@ -80,6 +124,7 @@ <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" /> <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <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" /> @@ -99,6 +144,10 @@ <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="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" /> <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" /> @@ -108,6 +157,8 @@ <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" /> + <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" /> <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" /> <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" /> @@ -115,7 +166,7 @@ <texture name="Generic_Group" 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="Generic_Object_Small" file_name="icons/ Generic_Object_Small.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" /> @@ -207,12 +258,17 @@ <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" /> <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="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" /> + <texture name="MinusItem_Off" file_name="icons/MinusItem_Off.png" preload="false" /> + <texture name="MinusItem_Press" file_name="icons/MinusItem_Press.png" preload="false" /> + <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" /> @@ -277,10 +333,16 @@ <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="parcel_color_EVRY" file_name="icons/parcel_color_EVRY.png" preload="false" /> + <texture name="parcel_color_EXP" file_name="icons/parcel_color_EXP.png" preload="false" /> + <texture name="parcel_color_M" file_name="icons/parcel_color_M.png" preload="false" /> + <texture name="parcel_drk_Build" file_name="icons/parcel_drk_Build.png" preload="false" /> <texture name="parcel_drk_BuildNo" file_name="icons/parcel_drk_BuildNo.png" preload="false" /> <texture name="parcel_drk_Damage" file_name="icons/parcel_drk_Damage.png" preload="false" /> <texture name="parcel_drk_DamageNo" file_name="icons/parcel_drk_DamageNo.png" preload="false" /> + <texture name="parcel_drk_EVRY" file_name="icons/parcel_drk_EVRY.png" preload="false" /> + <texture name="parcel_drk_EXP" file_name="icons/parcel_drk_EXP.png" preload="false" /> <texture name="parcel_drk_Fly" file_name="icons/parcel_drk_Fly.png" preload="false" /> <texture name="parcel_drk_FlyNo" file_name="icons/parcel_drk_FlyNo.png" preload="false" /> <texture name="parcel_drk_ForSale" file_name="icons/parcel_drk_ForSale.png" preload="false" /> @@ -299,6 +361,8 @@ <texture name="parcel_lght_BuildNo" file_name="icons/parcel_lght_BuildNo.png" preload="false" /> <texture name="parcel_lght_Damage" file_name="icons/parcel_lght_Damage.png" preload="false" /> <texture name="parcel_lght_DamageNo" file_name="icons/parcel_lght_DamageNo.png" preload="false" /> + <texture name="parcel_lght_EVRY" file_name="icons/parcel_lght_EVRY.png" preload="false" /> + <texture name="parcel_lght_EXP" file_name="icons/parcel_lght_EXP.png" preload="false" /> <texture name="parcel_lght_Fly" file_name="icons/parcel_lght_Fly.png" preload="false" /> <texture name="parcel_lght_FlyNo" file_name="icons/parcel_lght_FlyNo.png" preload="false" /> <texture name="parcel_lght_ForSale" file_name="icons/parcel_lght_ForSale.png" preload="false" /> @@ -313,6 +377,13 @@ <texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" /> <texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" /> + <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" /> + <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" /> + <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" /> + <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" /> + <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" /> @@ -364,9 +435,16 @@ <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="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" /> <texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> @@ -381,12 +459,20 @@ <texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> <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="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" /> <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" /> @@ -404,6 +490,10 @@ <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" /> <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" /> + <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" /> @@ -459,6 +549,9 @@ <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" scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" /> @@ -480,6 +573,8 @@ <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" /> <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" /> + <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" /> + <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" /> <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" /> <texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" /> @@ -493,6 +588,8 @@ <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="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" /> <texture name="Widget_UpArrow" file_name="icons/Widget_UpArrow.png" preload="true" /> @@ -507,6 +604,10 @@ <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" /> + <!--WARNING OLD ART *do not use*--> <texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" /> diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..2d624c377915f4622a4e4897c7099e147a7d8a10 Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png differ diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png new file mode 100644 index 0000000000000000000000000000000000000000..91c03c426e265431ed5cbf3136e61cac7ad3e50f Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png differ diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png new file mode 100644 index 0000000000000000000000000000000000000000..38aac0e5cabb91d65f455fc317c473281a870ffe Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png differ diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1d11dd0b5f981513643df7c7fe497295e8447c Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png differ diff --git a/indra/newview/skins/default/textures/widgets/Tooltip.png b/indra/newview/skins/default/textures/widgets/Tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..f989ac9083283cfeab4fdcfc93ebf9175152cf7b Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Tooltip.png differ diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index 8522a89ec1cc8a6fc543ff670b12a4ed2996ea8e..ea5c33b3c87563ac9b547172e3826a1bf8b8b420 100644 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="ÜBER [APP_NAME]"> - <tab_container name="about_tab"> - <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. - -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 - - - -Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant - </text_editor> - </panel> - <panel label="Lizenzen" 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) -expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. -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) -jpeglib Copyright (C) 1991-1998, Thomas G. Lane. -ogg/vorbis Copyright (C) 2001, Xiphophorus -OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. -SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga -SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) -xmlrpc-epi Copyright (C) 2000 Epinions, Inc. -zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. -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) - </text_editor> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="ÜBER [APP_NAME]"> + <tab_container name="about_tab"> + <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. + +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 + + + +Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant + </text_editor> + </panel> + <panel label="Lizenzen" 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) +expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. +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) +jpeglib Copyright (C) 1991-1998, Thomas G. Lane. +ogg/vorbis Copyright (C) 2001, Xiphophorus +OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. +SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga +SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +xmlrpc-epi Copyright (C) 2000 Epinions, Inc. +zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. +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) + </text_editor> + </panel> + </tab_container> +</floater> 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 ae0ad2af65dc1e5e370feb78411d3fb689049b35..d6d7434d58407255d3f05198c8e8446ca4b4b85e 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -1,475 +1,475 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="LAND-INFO"> - <floater.string name="Minutes"> - [MINUTES] Minuten - </floater.string> - <floater.string name="Minute"> - Minute - </floater.string> - <floater.string name="Seconds"> - [SECONDS] Sekunden - </floater.string> - <tab_container name="landtab"> - <panel label="Allgemein" name="land_general_panel"> - <panel.string name="new users only"> - Nur neue Benutzer - </panel.string> - <panel.string name="anyone"> - Jeder - </panel.string> - <panel.string name="area_text"> - Gebiet: - </panel.string> - <panel.string name="area_size_text"> - [AREA] qm. - </panel.string> - <panel.string name="auction_id_text"> - Auktions-ID: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Bestätigen Sie den Kauf, um dieses Land zu bearbeiten. - </panel.string> - <panel.string name="group_owned_text"> - (In Gruppenbesitz) - </panel.string> - <panel.string name="profile_text"> - Profil... - </panel.string> - <panel.string name="info_text"> - Info... - </panel.string> - <panel.string name="public_text"> - (öffentlich) - </panel.string> - <panel.string name="none_text"> - (keiner) - </panel.string> - <panel.string name="sale_pending_text"> - (Wird verkauft) - </panel.string> - <panel.string name="no_selection_text"> - Keine Parzelle ausgewählt. -Öffnen Sie „Welt“ > „Land-Info“ oder wählen Sie eine andere Parzelle aus, um Informationen darüber anzuzeigen. - </panel.string> - <text name="Name:"> - Name: - </text> - <text name="Description:"> - Beschreibung: - </text> - <text name="LandType"> - Typ: - </text> - <text name="LandTypeText"> - Mainland / Homestead - </text> - <text name="ContentRating"> - Einstufung: - </text> - <text name="ContentRatingText"> - Adult - </text> - <text name="Owner:"> - Eigentümer: - </text> - <text name="OwnerText"> - Leyla Linden - </text> - <button label="Profil..." label_selected="Profil..." name="Profile..."/> - <text name="Group:"> - Gruppe: - </text> - <button label="Einstellen..." label_selected="Einstellen..." name="Set..."/> - <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="Übertragen..." 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."/> - <text name="For Sale:"> - Zum Verkauf: - </text> - <text name="Not for sale."> - Nicht zu verkaufen. - </text> - <text name="For Sale: Price L$[PRICE]."> - Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.). - </text> - <text name="SalePending"/> - <button bottom="-222" label="Land verkaufen..." label_selected="Land verkaufen..." name="Sell Land..."/> - <text name="For sale to"> - Zum Verkauf an: [BUYER] - </text> - <text name="Sell with landowners objects in parcel." width="210"> - Objekte sind im Verkauf eingeschlossen. - </text> - <text name="Selling with no objects in parcel." width="237"> - Objekte sind im Verkauf nicht eingeschlossen. - </text> - <button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/> - <text name="Claimed:"> - Gekauft am: - </text> - <text name="DateClaimText"> - Dienstag, 15. Aug. 2006, 13:47:25 - </text> - <text name="PriceLabel"> - Gebiet: - </text> - <text name="PriceText"> - 4048 qm. - </text> - <text name="Traffic:"> - Traffic: - </text> - <text name="DwellText"> - 0 - </text> - <button label="Land kaufen..." label_selected="Land kaufen..." name="Buy Land..."/> - <button label="Für Gruppe kaufen..." label_selected="Für Gruppe kaufen..." name="Buy For Group..."/> - <button label="Pass kaufen..." label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/> - <button label="Land aufgeben..." label_selected="Land aufgeben..." name="Abandon Land..."/> - <button label="Land in Besitz nehmen..." label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/> - <button label="Linden-Verkauf..." label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/> - </panel> - <panel label="Vertrag" name="land_covenant_panel"> - <panel.string name="can_resell"> - Gekauftes Land in dieser Region kann wiederverkauft werden. - </panel.string> - <panel.string name="can_not_resell"> - 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. - </panel.string> - <panel.string name="can_not_change"> - Gekauftes Land in dieser Region kann nicht zusammengelegt -und geteilt werden. - </panel.string> - <text name="estate_section_lbl"> - Grundstück: - </text> - <text name="estate_name_lbl"> - Name: - </text> - <text name="estate_name_text"> - Mainland - </text> - <text name="estate_owner_lbl"> - Eigentümer: - </text> - <text name="estate_owner_text"> - (keiner) - </text> - <text_editor name="covenant_editor"> - Für dieses Grundstück fehlt der Vertrag. - </text_editor> - <text name="covenant_timestamp_text"> - Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00 - </text> - <text name="region_section_lbl"> - Region: - </text> - <text name="region_name_lbl"> - Name: - </text> - <text name="region_name_text"> - leyla - </text> - <text name="region_landtype_lbl"> - Typ: - </text> - <text name="region_landtype_text"> - Mainland / Homestead - </text> - <text name="region_maturity_lbl"> - Einstufung: - </text> - <text name="region_maturity_text"> - Adult - </text> - <text name="resellable_lbl"> - Wiederverkauf: - </text> - <text name="resellable_clause"> - Land in dieser Region kann nicht wiederverkauft werden. - </text> - <text name="changeable_lbl"> - Unterteilen: - </text> - <text name="changeable_clause"> - Land in dieser Region kann nicht zusammengelegt/geteilt -werden. - </text> - </panel> - <panel label="Objekte" name="land_objects_panel"> - <panel.string name="objects_available_text"> - [COUNT] von [MAX] ([AVAILABLE] verfügbar) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] von [MAX] ([DELETED] werden gelöscht) - </panel.string> - <text name="parcel_object_bonus"> - Objektbonusfaktor in Region: [BONUS] - </text> - <text name="Simulator primitive usage:"> - Primitive in Simulator: - </text> - <text name="objects_available"> - [COUNT] von [MAX] ([AVAILABLE] verfügbar) - </text> - <text name="Primitives parcel supports:" width="200"> - Von Parzelle unterstützte Primitiva: - </text> - <text left="204" name="object_contrib_text" width="152"> - [COUNT] - </text> - <text name="Primitives on parcel:"> - Primitiva auf Parzelle: - </text> - <text left="204" name="total_objects_text" width="48"> - [COUNT] - </text> - <text left="14" name="Owned by parcel owner:" width="200"> - Im Eigentum des Parzellenbesitzers: - </text> - <text left="204" name="owner_objects_text" width="48"> - [COUNT] - </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/> - <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Set to group:"> - Der Gruppe zugeordnet: - </text> - <text left="204" name="group_objects_text" width="48"> - [COUNT] - </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/> - <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Owned by others:" width="128"> - Im Eigentum anderer: - </text> - <text left="204" name="other_objects_text" width="48"> - [COUNT] - </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/> - <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Selected / sat upon:" width="140"> - Ausgewählt/gesessen auf: - </text> - <text left="204" name="selected_objects_text" width="48"> - [COUNT] - </text> - <text left="4" name="Autoreturn" width="380"> - Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus): - </text> - <line_editor name="clean other time" right="-10" width="56"/> - <text name="Object Owners:"> - Objekteigentümer: - </text> - <button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List"/> - <button label="Objekte zurückgeben..." label_selected="Objekte zurückgeben..." name="Return objects..."/> - <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> - </panel> - <panel label="Optionen" name="land_options_panel"> - <panel.string name="search_enabled_tooltip"> - Diese Parzelle in Suchergebnissen anzeigen. - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - Diese Option ist nicht aktiviert, da diese Parzelle nicht größer als 128 qm ist. -Nur große Parzellen können in der Suche aufgeführt werden. - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können. - </panel.string> - <panel.string name="mature_check_mature"> - Mature-Inhalt - </panel.string> - <panel.string name="mature_check_adult"> - Adult-Inhalt - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - Die Informationen oder Inhalte Ihrer Parzelle sind „Mature“. - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“. - </panel.string> - <panel.string name="landing_point_none"> - (keiner) - </panel.string> - <panel.string name="push_restrict_text"> - Kein Stoßen - </panel.string> - <panel.string name="push_restrict_region_text"> - Kein Stoßen (regional) - </panel.string> - <text name="allow_label"> - Anderen Einwohnern gestatten: - </text> - <check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/> - <check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/> - <text name="allow_label2"> - Objekte erstellen: - </text> - <check_box label="Alle Einwohner" name="edit objects check"/> - <check_box label="Gruppe" name="edit group objects check"/> - <text name="allow_label3"> - Objekteintritt: - </text> - <check_box label="Alle Einwohner" name="all object entry check"/> - <check_box label="Gruppe" name="group object entry check"/> - <text name="allow_label4"> - Skripts ausführen: - </text> - <check_box label="Alle Einwohner" name="check other scripts"/> - <check_box label="Gruppe" name="check group scripts"/> - <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="Ort in Suche anzeigen (30 L$/Woche) unter" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/> - <combo_box name="land category with adult"> - <combo_box.item label="Alle Kategorien" name="item0"/> - <combo_box.item label="Lindenort" name="item1"/> - <combo_box.item label="Adult" name="item2"/> - <combo_box.item label="Kunst & Kultur" name="item3"/> - <combo_box.item label="Business" name="item4"/> - <combo_box.item label="Bildung" name="item5"/> - <combo_box.item label="Spielen" name="item6"/> - <combo_box.item label="Treffpunkt" name="item7"/> - <combo_box.item label="Anfängergerecht" name="item8"/> - <combo_box.item label="Parks und Natur" name="item9"/> - <combo_box.item label="Wohngebiet" name="item10"/> - <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.item label="Alle Kategorien" name="item0"/> - <combo_box.item label="Lindenort" name="item1"/> - <combo_box.item label="Kunst und Kultur" name="item3"/> - <combo_box.item label="Business" name="item4"/> - <combo_box.item label="Bildung" name="item5"/> - <combo_box.item label="Spielen" name="item6"/> - <combo_box.item label="Treffpunkt" name="item7"/> - <combo_box.item label="Anfängergerecht" name="item8"/> - <combo_box.item label="Parks und Natur" name="item9"/> - <combo_box.item label="Wohngebiet" name="item10"/> - <combo_box.item label="Shopping" name="item11"/> - <combo_box.item label="Sonstige" name="item12"/> - </combo_box> - <check_box label="Mature-Inhalt" name="MatureCheck" tool_tip=""/> - <text name="Snapshot:"> - Foto: - </text> - <texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> - <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="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen." width="70"/> - <text name="Teleport Routing: "> - Teleport-Route: - </text> - <combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen."> - <combo_box.item label="Blockiert" name="Blocked"/> - <combo_box.item label="Landepunkt" name="LandingPoint"/> - <combo_box.item label="Überall" name="Anywhere"/> - </combo_box> - </panel> - <panel label="Medien" name="land_media_panel"> - <text name="with media:"> - Typ: - </text> - <combo_box name="media type" tool_tip="Geben Sie einen URL für den Film, die Webseite oder ein anderes Medium ein"/> - <text name="at URL:"> - Start URL: - </text> - <button label="Einstellen..." label_selected="Einstellen..." name="set_media_url"/> - <text name="CurrentURL:"> - Aktuelle URL: - </text> - <button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_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: - </text> - <line_editor name="url_description" tool_tip="Text, der neben der Abspielen/Laden-Schaltfläche angezeigt wird"/> - <text name="Media texture:"> - Textur -ersetzen: - </text> - <texture_picker label="" name="media texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> - <text name="replace_texture_help"> - Objekte, die diese Textur verwenden, werden den Film oder die Webseite anzeigen, nachdem Sie auf den Pfeil (Wiedergabe) klicken. - -Wählen Sie das kleine Bild aus, um eine andere Textur auszuwählen. - </text> - <check_box label="Automatisch skalieren" name="media_auto_scale" tool_tip="Aktivieren Sie diese Option, um den Inhalt für diese Parzelle automatisch zu skalieren. Dies ist eventuell langsamer und die Qualität ist schlechter, aber Sie müssen keine weitere Texturskalierung oder -anpassung vornehmen."/> - <text name="media_size" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."> - Größe: - </text> - <spinner name="media_size_width" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> - <spinner name="media_size_height" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> - <text name="pixels"> - Pixel - </text> - <text name="Options:"> - Optionen: - </text> - <check_box label="Schleife" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab. Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/> - </panel> - <panel label="Audio" name="land_audio_panel"> - <text name="MusicURL:"> - Musik-URL: - </text> - <text name="Sound:"> - Sound: - </text> - <check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/> - <text name="Voice settings:"> - 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"/> - </panel> - <panel label="Zugang" name="land_access_panel"> - <panel.string name="estate_override"> - Eine oder mehrere dieser Optionen gelten auf Grundstücksebene - </panel.string> - <text name="Limit access to this parcel to:"> - Zugang zu dieser Parzelle - </text> - <check_box label="Freien Zugang erlauben" name="public_access"/> - <text name="Only Allow"> - Zugang verweigern für: - </text> - <check_box label="Einwohner, die keine Zahlungsinformationen bei Linden Lab hinterlegt haben" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/> - <check_box label="Einwohner, die keine altersgeprüften Erwachsenen sind" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [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"> - <combo_box.item label="Jeden" name="Anyone"/> - <combo_box.item label="Gruppe" name="Group"/> - </combo_box> - <spinner label="Preis in L$:" name="PriceSpin"/> - <spinner label="Online-Zeit:" name="HoursSpin"/> - <text label="Immer erlauben" name="AllowedText"> - Zulässige Einwohner - </text> - <name_list name="AccessList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> - <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_allowed"/> - <button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/> - <text label="Verbannen" name="BanCheck"> - Verbannte Einwohner - </text> - <name_list name="BannedList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> - <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_banned"/> - <button label="Entfernen" label_selected="Entfernen" name="remove_banned"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterland" title="LAND-INFO"> + <floater.string name="Minutes"> + [MINUTES] Minuten + </floater.string> + <floater.string name="Minute"> + Minute + </floater.string> + <floater.string name="Seconds"> + [SECONDS] Sekunden + </floater.string> + <tab_container name="landtab"> + <panel label="Allgemein" name="land_general_panel"> + <panel.string name="new users only"> + Nur neue Benutzer + </panel.string> + <panel.string name="anyone"> + Jeder + </panel.string> + <panel.string name="area_text"> + Gebiet: + </panel.string> + <panel.string name="area_size_text"> + [AREA] qm. + </panel.string> + <panel.string name="auction_id_text"> + Auktions-ID: [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Bestätigen Sie den Kauf, um dieses Land zu bearbeiten. + </panel.string> + <panel.string name="group_owned_text"> + (In Gruppenbesitz) + </panel.string> + <panel.string name="profile_text"> + Profil... + </panel.string> + <panel.string name="info_text"> + Info... + </panel.string> + <panel.string name="public_text"> + (öffentlich) + </panel.string> + <panel.string name="none_text"> + (keiner) + </panel.string> + <panel.string name="sale_pending_text"> + (Wird verkauft) + </panel.string> + <panel.string name="no_selection_text"> + Keine Parzelle ausgewählt. +Öffnen Sie „Welt“ > „Land-Info“ oder wählen Sie eine andere Parzelle aus, um Informationen darüber anzuzeigen. + </panel.string> + <text name="Name:"> + Name: + </text> + <text name="Description:"> + Beschreibung: + </text> + <text name="LandType"> + Typ: + </text> + <text name="LandTypeText"> + Mainland / Homestead + </text> + <text name="ContentRating"> + Einstufung: + </text> + <text name="ContentRatingText"> + Adult + </text> + <text name="Owner:"> + Eigentümer: + </text> + <text name="OwnerText"> + Leyla Linden + </text> + <button label="Profil..." label_selected="Profil..." name="Profile..."/> + <text name="Group:"> + Gruppe: + </text> + <button label="Einstellen..." label_selected="Einstellen..." name="Set..."/> + <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="Übertragen..." 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."/> + <text name="For Sale:"> + Zum Verkauf: + </text> + <text name="Not for sale."> + Nicht zu verkaufen. + </text> + <text name="For Sale: Price L$[PRICE]."> + Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.). + </text> + <text name="SalePending"/> + <button bottom="-222" label="Land verkaufen..." label_selected="Land verkaufen..." name="Sell Land..."/> + <text name="For sale to"> + Zum Verkauf an: [BUYER] + </text> + <text name="Sell with landowners objects in parcel." width="210"> + Objekte sind im Verkauf eingeschlossen. + </text> + <text name="Selling with no objects in parcel." width="237"> + Objekte sind im Verkauf nicht eingeschlossen. + </text> + <button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/> + <text name="Claimed:"> + Gekauft am: + </text> + <text name="DateClaimText"> + Dienstag, 15. Aug. 2006, 13:47:25 + </text> + <text name="PriceLabel"> + Gebiet: + </text> + <text name="PriceText"> + 4048 qm. + </text> + <text name="Traffic:"> + Traffic: + </text> + <text name="DwellText"> + 0 + </text> + <button label="Land kaufen..." label_selected="Land kaufen..." name="Buy Land..."/> + <button label="Für Gruppe kaufen..." label_selected="Für Gruppe kaufen..." name="Buy For Group..."/> + <button label="Pass kaufen..." label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/> + <button label="Land aufgeben..." label_selected="Land aufgeben..." name="Abandon Land..."/> + <button label="Land in Besitz nehmen..." label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/> + <button label="Linden-Verkauf..." label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/> + </panel> + <panel label="Vertrag" name="land_covenant_panel"> + <panel.string name="can_resell"> + Gekauftes Land in dieser Region kann wiederverkauft werden. + </panel.string> + <panel.string name="can_not_resell"> + 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. + </panel.string> + <panel.string name="can_not_change"> + Gekauftes Land in dieser Region kann nicht zusammengelegt +und geteilt werden. + </panel.string> + <text name="estate_section_lbl"> + Grundstück: + </text> + <text name="estate_name_lbl"> + Name: + </text> + <text name="estate_name_text"> + Mainland + </text> + <text name="estate_owner_lbl"> + Eigentümer: + </text> + <text name="estate_owner_text"> + (keiner) + </text> + <text_editor name="covenant_editor"> + Für dieses Grundstück fehlt der Vertrag. + </text_editor> + <text name="covenant_timestamp_text"> + Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00 + </text> + <text name="region_section_lbl"> + Region: + </text> + <text name="region_name_lbl"> + Name: + </text> + <text name="region_name_text"> + leyla + </text> + <text name="region_landtype_lbl"> + Typ: + </text> + <text name="region_landtype_text"> + Mainland / Homestead + </text> + <text name="region_maturity_lbl"> + Einstufung: + </text> + <text name="region_maturity_text"> + Adult + </text> + <text name="resellable_lbl"> + Wiederverkauf: + </text> + <text name="resellable_clause"> + Land in dieser Region kann nicht wiederverkauft werden. + </text> + <text name="changeable_lbl"> + Unterteilen: + </text> + <text name="changeable_clause"> + Land in dieser Region kann nicht zusammengelegt/geteilt +werden. + </text> + </panel> + <panel label="Objekte" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] von [MAX] ([AVAILABLE] verfügbar) + </panel.string> + <panel.string name="objects_deleted_text"> + [COUNT] von [MAX] ([DELETED] werden gelöscht) + </panel.string> + <text name="parcel_object_bonus"> + Objektbonusfaktor in Region: [BONUS] + </text> + <text name="Simulator primitive usage:"> + Primitive in Simulator: + </text> + <text name="objects_available"> + [COUNT] von [MAX] ([AVAILABLE] verfügbar) + </text> + <text name="Primitives parcel supports:" width="200"> + Von Parzelle unterstützte Primitiva: + </text> + <text left="204" name="object_contrib_text" width="152"> + [COUNT] + </text> + <text name="Primitives on parcel:"> + Primitiva auf Parzelle: + </text> + <text left="204" name="total_objects_text" width="48"> + [COUNT] + </text> + <text left="14" name="Owned by parcel owner:" width="200"> + Im Eigentum des Parzellenbesitzers: + </text> + <text left="204" name="owner_objects_text" width="48"> + [COUNT] + </text> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/> + <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> + <text left="14" name="Set to group:"> + Der Gruppe zugeordnet: + </text> + <text left="204" name="group_objects_text" width="48"> + [COUNT] + </text> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/> + <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> + <text left="14" name="Owned by others:" width="128"> + Im Eigentum anderer: + </text> + <text left="204" name="other_objects_text" width="48"> + [COUNT] + </text> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/> + <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> + <text left="14" name="Selected / sat upon:" width="140"> + Ausgewählt/gesessen auf: + </text> + <text left="204" name="selected_objects_text" width="48"> + [COUNT] + </text> + <text left="4" name="Autoreturn" width="380"> + Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus): + </text> + <line_editor name="clean other time" right="-10" width="56"/> + <text name="Object Owners:"> + Objekteigentümer: + </text> + <button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List"/> + <button label="Objekte zurückgeben..." label_selected="Objekte zurückgeben..." name="Return objects..."/> + <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> + </panel> + <panel label="Optionen" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + Diese Parzelle in Suchergebnissen anzeigen. + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + Diese Option ist nicht aktiviert, da diese Parzelle nicht größer als 128 qm ist. +Nur große Parzellen können in der Suche aufgeführt werden. + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können. + </panel.string> + <panel.string name="mature_check_mature"> + Mature-Inhalt + </panel.string> + <panel.string name="mature_check_adult"> + Adult-Inhalt + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + Die Informationen oder Inhalte Ihrer Parzelle sind „Mature“. + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“. + </panel.string> + <panel.string name="landing_point_none"> + (keiner) + </panel.string> + <panel.string name="push_restrict_text"> + Kein Stoßen + </panel.string> + <panel.string name="push_restrict_region_text"> + Kein Stoßen (regional) + </panel.string> + <text name="allow_label"> + Anderen Einwohnern gestatten: + </text> + <check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/> + <check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/> + <text name="allow_label2"> + Objekte erstellen: + </text> + <check_box label="Alle Einwohner" name="edit objects check"/> + <check_box label="Gruppe" name="edit group objects check"/> + <text name="allow_label3"> + Objekteintritt: + </text> + <check_box label="Alle Einwohner" name="all object entry check"/> + <check_box label="Gruppe" name="group object entry check"/> + <text name="allow_label4"> + Skripts ausführen: + </text> + <check_box label="Alle Einwohner" name="check other scripts"/> + <check_box label="Gruppe" name="check group scripts"/> + <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="Ort in Suche anzeigen (30 L$/Woche) unter" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/> + <combo_box name="land category with adult"> + <combo_box.item label="Alle Kategorien" name="item0"/> + <combo_box.item label="Lindenort" name="item1"/> + <combo_box.item label="Adult" name="item2"/> + <combo_box.item label="Kunst & Kultur" name="item3"/> + <combo_box.item label="Business" name="item4"/> + <combo_box.item label="Bildung" name="item5"/> + <combo_box.item label="Spielen" name="item6"/> + <combo_box.item label="Treffpunkt" name="item7"/> + <combo_box.item label="Anfängergerecht" name="item8"/> + <combo_box.item label="Parks und Natur" name="item9"/> + <combo_box.item label="Wohngebiet" name="item10"/> + <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.item label="Alle Kategorien" name="item0"/> + <combo_box.item label="Lindenort" name="item1"/> + <combo_box.item label="Kunst und Kultur" name="item3"/> + <combo_box.item label="Business" name="item4"/> + <combo_box.item label="Bildung" name="item5"/> + <combo_box.item label="Spielen" name="item6"/> + <combo_box.item label="Treffpunkt" name="item7"/> + <combo_box.item label="Anfängergerecht" name="item8"/> + <combo_box.item label="Parks und Natur" name="item9"/> + <combo_box.item label="Wohngebiet" name="item10"/> + <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Sonstige" name="item12"/> + </combo_box> + <check_box label="Mature-Inhalt" name="MatureCheck" tool_tip=""/> + <text name="Snapshot:"> + Foto: + </text> + <texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <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="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen." width="70"/> + <text name="Teleport Routing: "> + Teleport-Route: + </text> + <combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen."> + <combo_box.item label="Blockiert" name="Blocked"/> + <combo_box.item label="Landepunkt" name="LandingPoint"/> + <combo_box.item label="Überall" name="Anywhere"/> + </combo_box> + </panel> + <panel label="Medien" name="land_media_panel"> + <text name="with media:"> + Typ: + </text> + <combo_box name="media type" tool_tip="Geben Sie einen URL für den Film, die Webseite oder ein anderes Medium ein"/> + <text name="at URL:"> + Start URL: + </text> + <button label="Einstellen..." label_selected="Einstellen..." name="set_media_url"/> + <text name="CurrentURL:"> + Aktuelle URL: + </text> + <button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_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: + </text> + <line_editor name="url_description" tool_tip="Text, der neben der Abspielen/Laden-Schaltfläche angezeigt wird"/> + <text name="Media texture:"> + Textur +ersetzen: + </text> + <texture_picker label="" name="media texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <text name="replace_texture_help"> + Objekte, die diese Textur verwenden, werden den Film oder die Webseite anzeigen, nachdem Sie auf den Pfeil (Wiedergabe) klicken. + +Wählen Sie das kleine Bild aus, um eine andere Textur auszuwählen. + </text> + <check_box label="Automatisch skalieren" name="media_auto_scale" tool_tip="Aktivieren Sie diese Option, um den Inhalt für diese Parzelle automatisch zu skalieren. Dies ist eventuell langsamer und die Qualität ist schlechter, aber Sie müssen keine weitere Texturskalierung oder -anpassung vornehmen."/> + <text name="media_size" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."> + Größe: + </text> + <spinner name="media_size_width" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> + <spinner name="media_size_height" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> + <text name="pixels"> + Pixel + </text> + <text name="Options:"> + Optionen: + </text> + <check_box label="Schleife" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab. Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/> + </panel> + <panel label="Audio" name="land_audio_panel"> + <text name="MusicURL:"> + Musik-URL: + </text> + <text name="Sound:"> + Sound: + </text> + <check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/> + <text name="Voice settings:"> + 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"/> + </panel> + <panel label="Zugang" name="land_access_panel"> + <panel.string name="estate_override"> + Eine oder mehrere dieser Optionen gelten auf Grundstücksebene + </panel.string> + <text name="Limit access to this parcel to:"> + Zugang zu dieser Parzelle + </text> + <check_box label="Freien Zugang erlauben" name="public_access"/> + <text name="Only Allow"> + Zugang verweigern für: + </text> + <check_box label="Einwohner, die keine Zahlungsinformationen bei Linden Lab hinterlegt haben" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/> + <check_box label="Einwohner, die keine altersgeprüften Erwachsenen sind" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [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"> + <combo_box.item label="Jeden" name="Anyone"/> + <combo_box.item label="Gruppe" name="Group"/> + </combo_box> + <spinner label="Preis in L$:" name="PriceSpin"/> + <spinner label="Online-Zeit:" name="HoursSpin"/> + <text label="Immer erlauben" name="AllowedText"> + Zulässige Einwohner + </text> + <name_list name="AccessList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> + <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_allowed"/> + <button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/> + <text label="Verbannen" name="BanCheck"> + Verbannte Einwohner + </text> + <name_list name="BannedList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> + <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_banned"/> + <button label="Entfernen" label_selected="Entfernen" name="remove_banned"/> + </panel> + </tab_container> +</floater> 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 0d56f1ef9f568b8c3c6af1d2f4a469955b12839a..33ce72855b2910e7783c3dca6c33d8d3f93df631 100644 --- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml @@ -1,184 +1,184 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Animation Preview" title=""> - <floater.string name="failed_to_initialize"> - Bewegung konnte nicht initialisiert werden - </floater.string> - <floater.string name="anim_too_long"> - Animationsdatei ist [LENGTH] Sekunden lang. - -Maximal erlaubt sind [MAX_LENGTH] Sekunden. - </floater.string> - <floater.string name="failed_file_read"> - Animationsdatei konnte nicht gelesen werden. - -[STATUS] - </floater.string> - <floater.string name="E_ST_OK"> - OK - </floater.string> - <floater.string name="E_ST_EOF"> - Unvollständige Datei - </floater.string> - <floater.string name="E_ST_NO_CONSTRAINT"> - Constraint-Definition kann nicht gelesen werden. - </floater.string> - <floater.string name="E_ST_NO_FILE"> - BVH-Datei kann nicht geöffnet werden - </floater.string> - <floater.string name="E_ST_NO_HIER"> - Ungültiger HIERARCHY-Titel. - </floater.string> - <floater.string name="E_ST_NO_JOINT"> - ROOT oder JOINT nicht gefunden. - </floater.string> - <floater.string name="E_ST_NO_NAME"> - JOINT-Name nicht erfasst. - </floater.string> - <floater.string name="E_ST_NO_OFFSET"> - VERSATZ nicht gefunden. - </floater.string> - <floater.string name="E_ST_NO_CHANNELS"> - CHANNELS nicht gefunden. - </floater.string> - <floater.string name="E_ST_NO_ROTATION"> - Kann Rotations-Reihenfolge nicht erfassen. - </floater.string> - <floater.string name="E_ST_NO_AXIS"> - Kann Rotations-Achse nicht erfassen. - </floater.string> - <floater.string name="E_ST_NO_MOTION"> - MOTION nicht gefunden. - </floater.string> - <floater.string name="E_ST_NO_FRAMES"> - Anzahl der Bilder kann nicht erfasst werden. - </floater.string> - <floater.string name="E_ST_NO_FRAME_TIME"> - Bildzeit kann nicht erfasst werden. - </floater.string> - <floater.string name="E_ST_NO_POS"> - Positions-Werte können nicht erfasst werden. - </floater.string> - <floater.string name="E_ST_NO_ROT"> - Kann Rotations-Werte nicht erfassen. - </floater.string> - <floater.string name="E_ST_NO_XLT_FILE"> - Datei kann nicht geöffnet werden - </floater.string> - <floater.string name="E_ST_NO_XLT_HEADER"> - Übersetzungstitel kann nicht gelesen werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_NAME"> - Übersetzungsnamen können nicht geladen werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_IGNORE"> - Ignorier-Wert kann nicht gelesen werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_RELATIVE"> - Übersetzungs-Wert kann nicht gelesen werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_OUTNAME"> - Outname-Wert kann nicht gelesen werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_MATRIX"> - Übersetzungsmatrix kann nicht geladen werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_MERGECHILD"> - Mergechild-Name nicht erfasst. - </floater.string> - <floater.string name="E_ST_NO_XLT_MERGEPARENT"> - Mergeparent-Name nicht erfasst. - </floater.string> - <floater.string name="E_ST_NO_XLT_PRIORITY"> - Prioritätswert kann nicht erfasst werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_LOOP"> - Loop-Wert kann nicht erfasst werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_EASEIN"> - Easeln-Wert kann nicht erfasst werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_EASEOUT"> - easeOut-Wert kann nicht erfasst werden. - </floater.string> - <floater.string name="E_ST_NO_XLT_HAND"> - Hand-Morph-Wert nicht erfasst. - </floater.string> - <floater.string name="E_ST_NO_XLT_EMOTE"> - Emote-Name kann nicht gelesen werden. - </floater.string> - <text name="name_label"> - Name: - </text> - <line_editor name="name_form"/> - <text name="description_label"> - Beschreibung: - </text> - <spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können."/> - <check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife."/> - <spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen."/> - <spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen."/> - <text name="hand_label"> - Handhaltung - </text> - <combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände."> - <combo_box.item label="Dehnen" name="Spread"/> - <combo_box.item label="Entspannt" name="Relaxed"/> - <combo_box.item label="Beide zeigen" name="PointBoth"/> - <combo_box.item label="Faust" name="Fist"/> - <combo_box.item label="Links entspannt" name="RelaxedLeft"/> - <combo_box.item label="Nach links zeigen" name="PointLeft"/> - <combo_box.item label="Linke Faust" name="FistLeft"/> - <combo_box.item label="Rechts entspannt" name="RelaxedRight"/> - <combo_box.item label="Nach rechts zeigen" name="PointRight"/> - <combo_box.item label="Rechte Faust" name="FistRight"/> - <combo_box.item label="Rechts salutieren" name="SaluteRight"/> - <combo_box.item label="Tippt" name="Typing"/> - <combo_box.item label="Friedensrecht" name="PeaceRight"/> - </combo_box> - <text name="emote_label"> - Ausdruck - </text> - <combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation."> - <combo_box.item label="Keine]" 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="Zurückgestoßen" 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"/> - </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="Fliegend" name="Flying"/> - </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="Ausblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/> - <button bottom_delta="-32" label="" name="play_btn" tool_tip="Animation stoppen/wiedergeben."/> - <button label="" name="stop_btn" tool_tip="Animation anhalten"/> - <slider label="" name="playback_slider"/> - <text name="bad_animation_text"> - Animationsdatei konnte nicht gelesen werden. - -Wir empfehlen exportierte BVH-Dateien aus Poser 4. - </text> - <button label="Abbrechen" name="cancel_btn"/> - <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Bewegung konnte nicht initialisiert werden + </floater.string> + <floater.string name="anim_too_long"> + Animationsdatei ist [LENGTH] Sekunden lang. + +Maximal erlaubt sind [MAX_LENGTH] Sekunden. + </floater.string> + <floater.string name="failed_file_read"> + Animationsdatei konnte nicht gelesen werden. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + OK + </floater.string> + <floater.string name="E_ST_EOF"> + Unvollständige Datei + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + Constraint-Definition kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_FILE"> + BVH-Datei kann nicht geöffnet werden + </floater.string> + <floater.string name="E_ST_NO_HIER"> + Ungültiger HIERARCHY-Titel. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + ROOT oder JOINT nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_NAME"> + JOINT-Name nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + VERSATZ nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + CHANNELS nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + Kann Rotations-Reihenfolge nicht erfassen. + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + Kann Rotations-Achse nicht erfassen. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + MOTION nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + Anzahl der Bilder kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + Bildzeit kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_POS"> + Positions-Werte können nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + Kann Rotations-Werte nicht erfassen. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + Datei kann nicht geöffnet werden + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Übersetzungstitel kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Übersetzungsnamen können nicht geladen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Ignorier-Wert kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Übersetzungs-Wert kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Outname-Wert kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Übersetzungsmatrix kann nicht geladen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Mergechild-Name nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Mergeparent-Name nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + Prioritätswert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + Loop-Wert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + Easeln-Wert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + easeOut-Wert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Hand-Morph-Wert nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + Emote-Name kann nicht gelesen werden. + </floater.string> + <text name="name_label"> + Name: + </text> + <line_editor name="name_form"/> + <text name="description_label"> + Beschreibung: + </text> + <spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können."/> + <check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife."/> + <spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen."/> + <spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen."/> + <text name="hand_label"> + Handhaltung + </text> + <combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände."> + <combo_box.item label="Dehnen" name="Spread"/> + <combo_box.item label="Entspannt" name="Relaxed"/> + <combo_box.item label="Beide zeigen" name="PointBoth"/> + <combo_box.item label="Faust" name="Fist"/> + <combo_box.item label="Links entspannt" name="RelaxedLeft"/> + <combo_box.item label="Nach links zeigen" name="PointLeft"/> + <combo_box.item label="Linke Faust" name="FistLeft"/> + <combo_box.item label="Rechts entspannt" name="RelaxedRight"/> + <combo_box.item label="Nach rechts zeigen" name="PointRight"/> + <combo_box.item label="Rechte Faust" name="FistRight"/> + <combo_box.item label="Rechts salutieren" name="SaluteRight"/> + <combo_box.item label="Tippt" name="Typing"/> + <combo_box.item label="Friedensrecht" name="PeaceRight"/> + </combo_box> + <text name="emote_label"> + Ausdruck + </text> + <combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation."> + <combo_box.item label="Keine]" 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="Zurückgestoßen" 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"/> + </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="Fliegend" name="Flying"/> + </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="Ausblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/> + <button bottom_delta="-32" label="" name="play_btn" tool_tip="Animation stoppen/wiedergeben."/> + <button label="" name="stop_btn" tool_tip="Animation anhalten"/> + <slider label="" name="playback_slider"/> + <text name="bad_animation_text"> + Animationsdatei konnte nicht gelesen werden. + +Wir empfehlen exportierte BVH-Dateien aus Poser 4. + </text> + <button label="Abbrechen" name="cancel_btn"/> + <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/> +</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 b95b6febd98477c1cc7580e5fd0ff957fa3042ef..a188a9fd9ea66899f7b2f84a59a7da55dac33958 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml @@ -1,43 +1,43 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN"> - <tab_container name="ResidentChooserTabs"> - <panel label="Suchen" name="SearchPanel"> - <text name="InstructSearchResidentName"> - 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"/> - </panel> - <panel label="Visitenkarten" name="CallingCardsPanel"> - <text name="InstructSelectCallingCard"> - Wählen Sie eine Visitenkarte: - </text> - </panel> - <panel label="In meiner Nähe" name="NearMePanel"> - <text name="InstructSelectResident"> - Wählen Sie eine Person aus, die sich in der Nähe befindet: - </text> - <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/> - <slider bottom_delta="-36" label="Bereich" name="near_me_range"/> - <text name="meters"> - Meter - </text> - <scroll_list bottom_delta="-169" height="159" name="NearMe"/> - </panel> - </tab_container> - <button label="OK" label_selected="OK" name="Select"/> - <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> - <string name="not_found"> - „[TEXT]“ nicht gefunden - </string> - <string name="no_one_near"> - Niemand in der Nähe - </string> - <string name="no_results"> - Keine Ergebnisse - </string> - <string name="searching"> - Suchen... - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN"> + <tab_container name="ResidentChooserTabs"> + <panel label="Suchen" name="SearchPanel"> + <text name="InstructSearchResidentName"> + 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"/> + </panel> + <panel label="Visitenkarten" name="CallingCardsPanel"> + <text name="InstructSelectCallingCard"> + Wählen Sie eine Visitenkarte: + </text> + </panel> + <panel label="In meiner Nähe" name="NearMePanel"> + <text name="InstructSelectResident"> + Wählen Sie eine Person aus, die sich in der Nähe befindet: + </text> + <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/> + <slider bottom_delta="-36" label="Bereich" name="near_me_range"/> + <text name="meters"> + Meter + </text> + <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + </panel> + </tab_container> + <button label="OK" label_selected="OK" name="Select"/> + <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> + <string name="not_found"> + „[TEXT]“ nicht gefunden + </string> + <string name="no_one_near"> + Niemand in der Nähe + </string> + <string name="no_results"> + Keine Ergebnisse + </string> + <string name="searching"> + Suchen... + </string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml index bfa3f6e4c93fb7b6414d7ff46bc86fe53a0671fb..f407ba6122c93754629e9c1fed35441f9716a307 100644 --- a/indra/newview/skins/default/xui/de/floater_beacons.xml +++ b/indra/newview/skins/default/xui/de/floater_beacons.xml @@ -1,21 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="BEACONS"> - <panel name="beacons_panel"> - <text name="label_show"> - Anzeigen: - </text> - <check_box label="Beacons" name="beacons"/> - <check_box label="Glanzlichter" name="highlights"/> - <text name="beacon_width_label" tool_tip="Beacon-Breite"> - Breite: - </text> - <text name="label_objects"> - Für diese Objekte: - </text> - <check_box label="Physisch" name="physical"/> - <check_box label="Skriptobjekte" name="scripted"/> - <check_box label="Nur berühren" name="touch_only"/> - <check_box label="Soundquellen" name="sounds"/> - <check_box label="Partikelquellen" name="particles"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="beacons" title="BEACONS"> + <panel name="beacons_panel"> + <text name="label_show"> + Anzeigen: + </text> + <check_box label="Beacons" name="beacons"/> + <check_box label="Glanzlichter" name="highlights"/> + <text name="beacon_width_label" tool_tip="Beacon-Breite"> + Breite: + </text> + <text name="label_objects"> + Für diese Objekte: + </text> + <check_box label="Physisch" name="physical"/> + <check_box label="Skriptobjekte" name="scripted"/> + <check_box label="Nur berühren" name="touch_only"/> + <check_box label="Soundquellen" name="sounds"/> + <check_box label="Partikelquellen" name="particles"/> + </panel> +</floater> 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 2f510cd75afec2ccfff8b0904b3c7bf0fd566de7..932ea160a95e3c462f9b7b684ae8ecdf0c18287a 100644 --- a/indra/newview/skins/default/xui/de/floater_build_options.xml +++ b/indra/newview/skins/default/xui/de/floater_build_options.xml @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="build options floater" title="RASTEROPTIONEN"> - <spinner label="Rastereinheit (Meter)" name="GridResolution"/> - <spinner label="Rastergröße (Meter)" name="GridDrawSize"/> - <check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/> - <check_box label="Querschnitte anzeigen" name="GridCrossSection"/> - <text name="grid_opacity_label" tool_tip="Rasterdeckkraft"> - Deckkraft: - </text> - <slider label="Rasterdeckkraft" name="GridOpacity"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="build options floater" title="RASTEROPTIONEN"> + <spinner label="Rastereinheit (Meter)" name="GridResolution"/> + <spinner label="Rastergröße (Meter)" name="GridDrawSize"/> + <check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/> + <check_box label="Querschnitte anzeigen" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Rasterdeckkraft"> + Deckkraft: + </text> + <slider label="Rasterdeckkraft" name="GridOpacity"/> +</floater> 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 1dceb1ad674bbf4ef15d61dc6ab913e120e8f047..6c0574dee48d9a5f15d4c9ed460992111fb363de 100644 --- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml @@ -1,53 +1,53 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Inhalt-Berechtigungen bearbeiten"> - <floater.string name="nothing_to_modify_text"> - Auswahl enthält keinen Inhalt, der bearbeitet werden kann. - </floater.string> - <floater.string name="status_text"> - Berechtigungen werden eingestellt auf [NAME] - </floater.string> - <floater.string name="start_text"> - Start: Anforderung auf Änderung der Berechtigung... - </floater.string> - <floater.string name="done_text"> - Ende: Anforderung auf Änderung der Berechtigung. - </floater.string> - <check_box label="Animation" name="check_animation"/> - <icon name="icon_animation" tool_tip="Animation"/> - <check_box label="Körperteile" name="check_bodypart"/> - <icon name="icon_bodypart" tool_tip="Körperteile"/> - <check_box label="Kleidung" name="check_clothing"/> - <icon name="icon_clothing" tool_tip="Kleidung"/> - <check_box label="Gesten" name="check_gesture"/> - <icon name="icon_gesture" tool_tip="Gesten"/> - <check_box label="Notizkarten" name="check_notecard"/> - <icon name="icon_notecard" tool_tip="Notizkarten"/> - <check_box label="Objekte" name="check_object"/> - <icon name="icon_object" tool_tip="Objekte"/> - <check_box label="Skripts" name="check_script"/> - <icon name="icon_script" tool_tip="Skripts"/> - <check_box label="Sounds" name="check_sound"/> - <icon name="icon_sound" tool_tip="Sounds"/> - <check_box label="Texturen" name="check_texture"/> - <button label="√ Alle" label_selected="Alle" name="check_all"/> - <button label="Löschen" label_selected="Keine" name="check_none"/> - <text name="newperms"> - Neue Inhalts-Berechtigungen - </text> - <text name="GroupLabel"> - Gruppe: - </text> - <check_box label="Freigeben" name="share_with_group"/> - <text name="AnyoneLabel"> - Jeder: - </text> - <check_box label="Kopieren" name="everyone_copy"/> - <text name="NextOwnerLabel"> - Nächster Eigentümer: - </text> - <check_box label="Bearbeiten" name="next_owner_modify"/> - <check_box label="Kopieren" name="next_owner_copy"/> - <check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> - <button label="OK" name="apply"/> - <button label="Abbrechen" name="close"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterbulkperms" title="Inhalt-Berechtigungen bearbeiten"> + <floater.string name="nothing_to_modify_text"> + Auswahl enthält keinen Inhalt, der bearbeitet werden kann. + </floater.string> + <floater.string name="status_text"> + Berechtigungen werden eingestellt auf [NAME] + </floater.string> + <floater.string name="start_text"> + Start: Anforderung auf Änderung der Berechtigung... + </floater.string> + <floater.string name="done_text"> + Ende: Anforderung auf Änderung der Berechtigung. + </floater.string> + <check_box label="Animation" name="check_animation"/> + <icon name="icon_animation" tool_tip="Animation"/> + <check_box label="Körperteile" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="Körperteile"/> + <check_box label="Kleidung" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="Kleidung"/> + <check_box label="Gesten" name="check_gesture"/> + <icon name="icon_gesture" tool_tip="Gesten"/> + <check_box label="Notizkarten" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="Notizkarten"/> + <check_box label="Objekte" name="check_object"/> + <icon name="icon_object" tool_tip="Objekte"/> + <check_box label="Skripts" name="check_script"/> + <icon name="icon_script" tool_tip="Skripts"/> + <check_box label="Sounds" name="check_sound"/> + <icon name="icon_sound" tool_tip="Sounds"/> + <check_box label="Texturen" name="check_texture"/> + <button label="√ Alle" label_selected="Alle" name="check_all"/> + <button label="Löschen" label_selected="Keine" name="check_none"/> + <text name="newperms"> + Neue Inhalts-Berechtigungen + </text> + <text name="GroupLabel"> + Gruppe: + </text> + <check_box label="Freigeben" name="share_with_group"/> + <text name="AnyoneLabel"> + Jeder: + </text> + <check_box label="Kopieren" name="everyone_copy"/> + <text name="NextOwnerLabel"> + Nächster Eigentümer: + </text> + <check_box label="Bearbeiten" name="next_owner_modify"/> + <check_box label="Kopieren" name="next_owner_copy"/> + <check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <button label="OK" name="apply"/> + <button label="Abbrechen" name="close"/> +</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 b1e4476207f5e5c6015390ff9f8fd00ff82476e8..e35212915f01ed67c8f559afea9e55eb136eb7fd 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml @@ -1,26 +1,26 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="OBJEKTKOPIE KAUFEN"> - <text name="contents_text"> - Inhalt: - </text> - <text name="buy_text"> - [AMOUNT] L$ von [NAME] kaufen? - </text> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/> - <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/> - <text name="title_buy_text"> - Kaufen - </text> - <string name="title_buy_copy_text"> - Kopie kaufen von - </string> - <text name="no_copy_text"> - (kein Kopieren) - </text> - <text name="no_modify_text"> - (kein Bearbeiten) - </text> - <text name="no_transfer_text"> - (kein Transferieren) - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="contents" title="OBJEKTKOPIE KAUFEN"> + <text name="contents_text"> + Inhalt: + </text> + <text name="buy_text"> + [AMOUNT] L$ von [NAME] kaufen? + </text> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/> + <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/> + <text name="title_buy_text"> + Kaufen + </text> + <string name="title_buy_copy_text"> + Kopie kaufen von + </string> + <text name="no_copy_text"> + (kein Kopieren) + </text> + <text name="no_modify_text"> + (kein Bearbeiten) + </text> + <text name="no_transfer_text"> + (kein Transferieren) + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml index a0cf6cbecf363b4770d6b5d8747e18b929442f66..131f077815f08d609c3c430611c21b280f1182ea 100644 --- a/indra/newview/skins/default/xui/de/floater_camera.xml +++ b/indra/newview/skins/default/xui/de/floater_camera.xml @@ -1,23 +1,23 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="camera_floater"> - <floater.string name="rotate_tooltip"> - Kamera um Fokus drehen - </floater.string> - <floater.string name="zoom_tooltip"> - Kamera auf Fokus zoomen - </floater.string> - <floater.string name="move_tooltip"> - Kamera nach oben, unten, links und rechts bewegen - </floater.string> - <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/> - <joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/> - <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus herum kreisen"/> - </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"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + Kamera um Fokus drehen + </floater.string> + <floater.string name="zoom_tooltip"> + Kamera auf Fokus zoomen + </floater.string> + <floater.string name="move_tooltip"> + Kamera nach oben, unten, links und rechts bewegen + </floater.string> + <panel name="controls"> + <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/> + <joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/> + <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus herum kreisen"/> + </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"/> + </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 4143f634aff406f351cb4011bf2f57fb6598a3fc..9221d1bcf7f0b9d24773146426b8d058e25f5c4c 100644 --- a/indra/newview/skins/default/xui/de/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="FARBAUSWAHL"> - <text name="r_val_text"> - Rot: - </text> - <text name="g_val_text"> - Grün: - </text> - <text name="b_val_text"> - Blau: - </text> - <text name="h_val_text"> - Farbton: - </text> - <text name="s_val_text"> - Sätt.: - </text> - <text name="l_val_text"> - Hell.: - </text> - <check_box label="Jetzt ü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="Auswählen" name="select_btn"/> - <text name="Current color:"> - Aktuelle Farbe: - </text> - <text name="(Drag below to save.)"> - (Nach unten ziehen, - um zu speichern) - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="ColorPicker" title="FARBAUSWAHL"> + <text name="r_val_text"> + Rot: + </text> + <text name="g_val_text"> + Grün: + </text> + <text name="b_val_text"> + Blau: + </text> + <text name="h_val_text"> + Farbton: + </text> + <text name="s_val_text"> + Sätt.: + </text> + <text name="l_val_text"> + Hell.: + </text> + <check_box label="Jetzt ü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="Auswählen" name="select_btn"/> + <text name="Current color:"> + Aktuelle Farbe: + </text> + <text name="(Drag below to save.)"> + (Nach unten ziehen, + um zu speichern) + </text> +</floater> 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 34ea18457e474939a8457aca931c7b66854f50e9..e790420efb60452de14c5ac9d73356417af73fec 100644 --- a/indra/newview/skins/default/xui/de/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml @@ -1,102 +1,102 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<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> - <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 wegteleportieren, 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="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"/> - <text name="estate id"> - Grundstücks-ID: - </text> - <text name="parent id"> - Parent ID: - </text> - <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück 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: "> - Auf Raster umleiten: - </text> - <line_editor left_delta="110" 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: - </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"/> - </panel> - <panel label="Objekte" name="objects"> - <panel.string name="no_target"> - (kein Ziel) - </panel.string> - <text name="Sim Name:" width="55"> - Sim-Name: - </text> - <text name="region name"> - Welsh - </text> - <check_box label="Skripts -deaktivieren" name="disable scripts" tool_tip="Skripts in dieser Region komplett abschalten"/> - <check_box label="Kollisionen -deaktivieren" name="disable collisions" tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten"/> - <check_box label="Physik deaktivieren" name="disable physics" tool_tip="Die Physik in dieser Region komplett abschalten"/> - <button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/> - <button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target" tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen."/> - <text name="target_avatar_name"> - (kein Ziel) - </text> - <button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen" name="Delete Target's Scripted Objects On Others Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> - <button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> - <button label="*ALLE* Objekte des Ziels löschen" label_selected="*ALLE* Objekte des Ziels löschen" name="Delete *ALL* Of Target's Objects" tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> - <button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte" name="Get Top Colliders" tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130"/> - <button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts" tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130"/> - <button label="Scripting-Übersicht" label_selected="Scripting-Übersicht" name="Scripts digest" tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130"/> - </panel> - <panel label="Anfrage" name="request"> - <text name="Destination:"> - Ziel: - </text> - <combo_box name="destination"> - <combo_box.item label="Auswahl" name="item1"/> - <combo_box.item label="Avatar-Region" name="item2"/> - </combo_box> - <text name="Request:"> - Anfrage: - </text> - <combo_box name="request"> - <combo_box.item label="Kollisionsobjekte <Schritte>" name="item1"/> - <combo_box.item label="Skripts <Zähler>,<Optionales Muster>" name="item2"/> - <combo_box.item label="Objekte <Muster>" name="item3"/> - <combo_box.item label="lt;asset_id> erstellen" name="item4"/> - </combo_box> - <text name="Parameter:"> - Parameter: - </text> - <button label="Anfrage" label_selected="Anfrage" name="Make Request"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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> + <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 wegteleportieren, 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="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"/> + <text name="estate id"> + Grundstücks-ID: + </text> + <text name="parent id"> + Parent ID: + </text> + <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück 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: "> + Auf Raster umleiten: + </text> + <line_editor left_delta="110" 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: + </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"/> + </panel> + <panel label="Objekte" name="objects"> + <panel.string name="no_target"> + (kein Ziel) + </panel.string> + <text name="Sim Name:" width="55"> + Sim-Name: + </text> + <text name="region name"> + Welsh + </text> + <check_box label="Skripts +deaktivieren" name="disable scripts" tool_tip="Skripts in dieser Region komplett abschalten"/> + <check_box label="Kollisionen +deaktivieren" name="disable collisions" tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten"/> + <check_box label="Physik deaktivieren" name="disable physics" tool_tip="Die Physik in dieser Region komplett abschalten"/> + <button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/> + <button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target" tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen."/> + <text name="target_avatar_name"> + (kein Ziel) + </text> + <button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen" name="Delete Target's Scripted Objects On Others Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> + <button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> + <button label="*ALLE* Objekte des Ziels löschen" label_selected="*ALLE* Objekte des Ziels löschen" name="Delete *ALL* Of Target's Objects" tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> + <button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte" name="Get Top Colliders" tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130"/> + <button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts" tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130"/> + <button label="Scripting-Übersicht" label_selected="Scripting-Übersicht" name="Scripts digest" tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130"/> + </panel> + <panel label="Anfrage" name="request"> + <text name="Destination:"> + Ziel: + </text> + <combo_box name="destination"> + <combo_box.item label="Auswahl" name="item1"/> + <combo_box.item label="Avatar-Region" name="item2"/> + </combo_box> + <text name="Request:"> + Anfrage: + </text> + <combo_box name="request"> + <combo_box.item label="Kollisionsobjekte <Schritte>" name="item1"/> + <combo_box.item label="Skripts <Zähler>,<Optionales Muster>" name="item2"/> + <combo_box.item label="Objekte <Muster>" name="item3"/> + <combo_box.item label="lt;asset_id> erstellen" name="item4"/> + </combo_box> + <text name="Parameter:"> + Parameter: + </text> + <button label="Anfrage" label_selected="Anfrage" name="Make Request"/> + </panel> + </tab_container> +</floater> 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 ba2269012fe7f20bff07220f8699bfaa3bb48099..2936688254c9a53ce872e6d0a3ebb5478498b3d4 100644 --- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml @@ -1,28 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN"> - <text name="Filtering:"> - Filtern: - </text> - <check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/> - <text name="Antialiasing:"> - Antialiasing: - </text> - <combo_box label="Antialiasing" name="fsaa"> - <combo_box.item label="Deaktiviert" 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)"> - (0 = Standard-Helligkeit, weniger = heller) - </text> - <text name="Enable VBO:"> - VBO aktivieren: - </text> - <check_box 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="GrapicsCardTextureMemory" 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> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN"> + <text name="Filtering:"> + Filtern: + </text> + <check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/> + <text name="Antialiasing:"> + Antialiasing: + </text> + <combo_box label="Antialiasing" name="fsaa"> + <combo_box.item label="Deaktiviert" 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)"> + (0 = Standard-Helligkeit, weniger = heller) + </text> + <text name="Enable VBO:"> + VBO aktivieren: + </text> + <check_box 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="GrapicsCardTextureMemory" 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_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml index 80c71d41f77bb3bf0c6f13e216881bc73d15c5c5..7f66234dab3c44805fd45ff9bcceac29d64dfbd6 100644 --- a/indra/newview/skins/default/xui/de/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_image_preview.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Image Preview" title=""> - <text name="name_label"> - Name: - </text> - <text name="description_label"> - Beschreibung: - </text> - <text name="preview_label"> - 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"/> - </combo_box> - <text name="bad_image_text"> - Bild kann nicht gelesen werden. - -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"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Image Preview" title=""> + <text name="name_label"> + Name: + </text> + <text name="description_label"> + Beschreibung: + </text> + <text name="preview_label"> + 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"/> + </combo_box> + <text name="bad_image_text"> + Bild kann nicht gelesen werden. + +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"/> +</floater> 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 b5e8ed0b6fee3fc0e41d02727f9d206841a22b6f..89771a52893c36ce2187f679d3b0dffac6b04f27 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 @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="INVENTAROBJEKT-EIGENSCHAFTEN"> - <floater.string name="unknown"> - (unbekannt) - </floater.string> - <floater.string name="public"> - (öffentlich) - </floater.string> - <floater.string name="you_can"> - Sie können: - </floater.string> - <floater.string name="owner_can"> - Eigentümer kann: - </floater.string> - <text name="LabelItemNameTitle"> - Name: - </text> - <text name="LabelItemDescTitle"> - Beschreibung: - </text> - <text name="LabelCreatorTitle"> - Ersteller: - </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> - <button label="Profil..." label_selected="" name="BtnCreator"/> - <text name="LabelOwnerTitle"> - Eigentümer: - </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> - <button label="Profil..." label_selected="" name="BtnOwner"/> - <text name="LabelAcquiredTitle"> - Erworben: - </text> - <text name="LabelAcquiredDate"> - Mittwoch, 24. Mai 2006, 12:50:46 - </text> - <text name="OwnerLabel"> - Sie: - </text> - <check_box label="Bearbeiten" name="CheckOwnerModify"/> - <check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/> - <check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/> - <text name="AnyoneLabel"> - Jeder: - </text> - <check_box label="Kopieren" name="CheckEveryoneCopy"/> - <text name="GroupLabel"> - Gruppe: - </text> - <check_box label="Teilen" name="CheckShareWithGroup"/> - <text name="NextOwnerLabel" width="150"> - Nächster Eigentümer: - </text> - <check_box label="Bearbeiten" name="CheckNextOwnerModify"/> - <check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/> - <check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/> - <check_box label="Zum Verkauf" name="CheckPurchase"/> - <combo_box name="combobox sale copy"> - <combo_box.item label="Kopieren" name="Copy"/> - <combo_box.item label="Original" name="Original"/> - </combo_box> - <spinner label="Preis: L$" name="Edit Cost"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="item properties" title="INVENTAROBJEKT-EIGENSCHAFTEN"> + <floater.string name="unknown"> + (unbekannt) + </floater.string> + <floater.string name="public"> + (öffentlich) + </floater.string> + <floater.string name="you_can"> + Sie können: + </floater.string> + <floater.string name="owner_can"> + Eigentümer kann: + </floater.string> + <text name="LabelItemNameTitle"> + Name: + </text> + <text name="LabelItemDescTitle"> + Beschreibung: + </text> + <text name="LabelCreatorTitle"> + Ersteller: + </text> + <text name="LabelCreatorName"> + Nicole Linden + </text> + <button label="Profil..." label_selected="" name="BtnCreator"/> + <text name="LabelOwnerTitle"> + Eigentümer: + </text> + <text name="LabelOwnerName"> + Thrax Linden + </text> + <button label="Profil..." label_selected="" name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + Erworben: + </text> + <text name="LabelAcquiredDate"> + Mittwoch, 24. Mai 2006, 12:50:46 + </text> + <text name="OwnerLabel"> + Sie: + </text> + <check_box label="Bearbeiten" name="CheckOwnerModify"/> + <check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/> + <check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Jeder: + </text> + <check_box label="Kopieren" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Gruppe: + </text> + <check_box label="Teilen" name="CheckShareWithGroup"/> + <text name="NextOwnerLabel" width="150"> + Nächster Eigentümer: + </text> + <check_box label="Bearbeiten" name="CheckNextOwnerModify"/> + <check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/> + <check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/> + <check_box label="Zum Verkauf" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Kopieren" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Preis: L$" name="Edit Cost"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_land_holdings.xml b/indra/newview/skins/default/xui/de/floater_land_holdings.xml index f258dc2f5d6d51a99acbd8c774d42a0276c68e40..c612f21a5bba465ded8f433f120763f786abd6dc 100644 --- a/indra/newview/skins/default/xui/de/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/de/floater_land_holdings.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="MEIN LAND"> - <scroll_list name="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="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zum Mittelpunkt dieses Landes teleportieren."/> - <button label="Karte" label_selected="Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/> - <text name="contrib_label"> - Beiträge zu Ihren Gruppen: - </text> - <scroll_list name="grant list"> - <column label="Gruppe" name="group"/> - <column label="Gebiet" name="area"/> - </scroll_list> - <text name="allowed_label"> - Zulässiger Landbesitz bei aktuellem Zahlungsplan: - </text> - <text name="allowed_text"> - [AREA] qm - </text> - <text name="current_label"> - Aktueller Landbesitz: - </text> - <text name="current_text"> - [AREA] qm - </text> - <text name="available_label"> - Für Landkäufe verfügbar: - </text> - <text name="available_text"> - [AREA] qm - </text> - <string name="area_string"> - [AREA] qm - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="land holdings floater" title="MEIN LAND"> + <scroll_list name="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="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zum Mittelpunkt dieses Landes teleportieren."/> + <button label="Karte" label_selected="Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/> + <text name="contrib_label"> + Beiträge zu Ihren Gruppen: + </text> + <scroll_list name="grant list"> + <column label="Gruppe" name="group"/> + <column label="Gebiet" name="area"/> + </scroll_list> + <text name="allowed_label"> + Zulässiger Landbesitz bei aktuellem Zahlungsplan: + </text> + <text name="allowed_text"> + [AREA] qm + </text> + <text name="current_label"> + Aktueller Landbesitz: + </text> + <text name="current_text"> + [AREA] qm + </text> + <text name="available_label"> + Für Landkäufe verfügbar: + </text> + <text name="available_text"> + [AREA] qm + </text> + <string name="area_string"> + [AREA] qm + </string> +</floater> 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 947a435f8ad13cbb34a5e89a6e44ce394625fd1b..52e6dccabaca829adcfb5a4cb8142b0460ab1232 100644 --- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml @@ -1,15 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="SKRIPT: NEUES SKRIPT"> - <floater.string name="not_allowed"> - Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung "kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. - </floater.string> - <floater.string name="script_running"> - Läuft - </floater.string> - <floater.string name="Title"> - Skript: [NAME] - </floater.string> - <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/> - <check_box initial_value="true" label="Läuft" name="running"/> - <check_box initial_value="true" label="Mono" name="mono"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script ed float" title="SKRIPT: NEUES SKRIPT"> + <floater.string name="not_allowed"> + Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung "kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. + </floater.string> + <floater.string name="script_running"> + Läuft + </floater.string> + <floater.string name="Title"> + Skript: [NAME] + </floater.string> + <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/> + <check_box initial_value="true" label="Läuft" name="running"/> + <check_box initial_value="true" label="Mono" name="mono"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml index 73737846734ec34b5f3666567399edca5a1bc3a7..b985d1d1879b1123ec93a8889ca9f6b469d6434b 100644 --- a/indra/newview/skins/default/xui/de/floater_map.xml +++ b/indra/newview/skins/default/xui/de/floater_map.xml @@ -1,54 +1,54 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> - <floater.string name="mini_map_north"> - N - </floater.string> - <floater.string name="mini_map_east"> - O - </floater.string> - <floater.string name="mini_map_west"> - W - </floater.string> - <floater.string name="mini_map_south"> - S - </floater.string> - <floater.string name="mini_map_southeast"> - SO - </floater.string> - <floater.string name="mini_map_northeast"> - NO - </floater.string> - <floater.string name="mini_map_southwest"> - SW - </floater.string> - <floater.string name="mini_map_northwest"> - NW - </floater.string> - <floater.string name="ToolTipMsg"> - [AGENT][REGION](Karte mit Doppelklick öffnen) - </floater.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="O" name="floater_map_east" text="O"> - O - </text> - <text label="W" name="floater_map_west" text="W"> - W - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SO" name="floater_map_southeast" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northeast" text="NO"> - NO - </text> - <text label="SW" name="floater_map_southwest" text="SW"> - SW - </text> - <text label="NW" name="floater_map_northwest" text="NW"> - NW - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Map"> + <floater.string name="mini_map_north"> + N + </floater.string> + <floater.string name="mini_map_east"> + O + </floater.string> + <floater.string name="mini_map_west"> + W + </floater.string> + <floater.string name="mini_map_south"> + S + </floater.string> + <floater.string name="mini_map_southeast"> + SO + </floater.string> + <floater.string name="mini_map_northeast"> + NO + </floater.string> + <floater.string name="mini_map_southwest"> + SW + </floater.string> + <floater.string name="mini_map_northwest"> + NW + </floater.string> + <floater.string name="ToolTipMsg"> + [AGENT][REGION](Karte mit Doppelklick öffnen) + </floater.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="O" name="floater_map_east" text="O"> + O + </text> + <text label="W" name="floater_map_west" text="W"> + W + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SO" name="floater_map_southeast" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northeast" text="NO"> + NO + </text> + <text label="SW" name="floater_map_southwest" text="SW"> + SW + </text> + <text label="NW" name="floater_map_northwest" text="NW"> + NW + </text> +</floater> 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 21bf7aa563038e672d7a63c24408d2d21f8b5b97..89cce0f6dc822ebb9535cd6b77b2296e23f2c089 100644 --- a/indra/newview/skins/default/xui/de/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml @@ -1,30 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="MEDIENBROWSER"> - <floater.string name="home_page_url"> - http://www.secondlife.com - </floater.string> - <floater.string name="support_page_url"> - http://support.secondlife.com - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="nav_controls"> - <button label="Zurück" name="back"/> - <button label="Weiter" name="forward"/> - <button label="Neu laden" name="reload"/> - <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="vorwärts" name="seek"/> - </layout_panel> - <layout_panel name="parcel_owner_controls"> - <button label="Aktuelle URL an Parzelle senden" name="assign"/> - </layout_panel> - <layout_panel name="external_controls"> - <button label="In meinem Browser öffnen" name="open_browser"/> - <check_box label="Immer in meinem Browser öffnen" name="open_always"/> - <button label="Schließen" name="close"/> - </layout_panel> - </layout_stack> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="MEDIENBROWSER"> + <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> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Zurück" name="back"/> + <button label="Weiter" name="forward"/> + <button label="Neu laden" name="reload"/> + <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="vorwärts" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Aktuelle URL an Parzelle senden" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="In meinem Browser öffnen" name="open_browser"/> + <check_box label="Immer in meinem Browser öffnen" name="open_always"/> + <button label="Schließen" name="close"/> + </layout_panel> + </layout_stack> +</floater> 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 72210aa750bde130737f678e2d38c5526adc55b9..bb40d0b85c03fad0fb98d1ca338453e8295503e7 100644 --- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml @@ -1,18 +1,18 @@ -<?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"/> - <text name="total_leaked_label"> - Aktueller Speicherverlust:[SIZE] KB - </text> - <text name="note_label_1"> - [NOTE1] - </text> - <text name="note_label_2"> - [NOTE2] - </text> - <button label="Start" name="start_btn"/> - <button label="Stopp" name="stop_btn"/> - <button label="Freigeben" name="release_btn"/> - <button label="Schließen" name="close_btn"/> -</floater> +<?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"/> + <text name="total_leaked_label"> + Aktueller Speicherverlust:[SIZE] KB + </text> + <text name="note_label_1"> + [NOTE1] + </text> + <text name="note_label_2"> + [NOTE2] + </text> + <button label="Start" name="start_btn"/> + <button label="Stopp" name="stop_btn"/> + <button label="Freigeben" name="release_btn"/> + <button label="Schließen" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml index af133b6bd79f27e5d4a752665c786c50d455e930..03930c8ed6b68e0d81cac57ea1d2d313635ba3aa 100644 --- a/indra/newview/skins/default/xui/de/floater_moveview.xml +++ b/indra/newview/skins/default/xui/de/floater_moveview.xml @@ -1,35 +1,35 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> - <string name="walk_forward_tooltip"> - Vorwärts gehen (Nach-oben-Pfeil oder W drücken) - </string> - <string name="walk_back_tooltip"> - Rückwärts gehen (Nach-Unten-Pfeil oder S drücken) - </string> - <string name="run_forward_tooltip"> - Vorwärts rennen (Nach-oben-Pfeil oder W drücken) - </string> - <string name="run_back_tooltip"> - Rückwärts rennen (Nach-Unten-Pfeil oder S drücken) - </string> - <string name="fly_forward_tooltip"> - Vorwärts fliegen (Nach-oben-Pfeil oder W drücken) - </string> - <string name="fly_back_tooltip"> - Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken) - </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)"/> - <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E" drücken"/> - <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C" drücken"/> - <joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/> - <joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/> - </panel> - <panel name="panel_modes"> - <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> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="move_floater"> + <string name="walk_forward_tooltip"> + Vorwärts gehen (Nach-oben-Pfeil oder W drücken) + </string> + <string name="walk_back_tooltip"> + Rückwärts gehen (Nach-Unten-Pfeil oder S drücken) + </string> + <string name="run_forward_tooltip"> + Vorwärts rennen (Nach-oben-Pfeil oder W drücken) + </string> + <string name="run_back_tooltip"> + Rückwärts rennen (Nach-Unten-Pfeil oder S drücken) + </string> + <string name="fly_forward_tooltip"> + Vorwärts fliegen (Nach-oben-Pfeil oder W drücken) + </string> + <string name="fly_back_tooltip"> + Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken) + </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)"/> + <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E" drücken"/> + <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C" drücken"/> + <joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/> + <joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/> + </panel> + <panel name="panel_modes"> + <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_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml index c224d85ac19401e658190c1a512fdd9d5ad7474b..ad7f4a94ab8606929b192dd333593271e063073d 100644 --- a/indra/newview/skins/default/xui/de/floater_pay.xml +++ b/indra/newview/skins/default/xui/de/floater_pay.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <text name="payee_label" width="130"> - Zahlen: - </text> - <icon name="icon_person" tool_tip="Person"/> - <text left="130" 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"/> - <text name="amount text"> - Oder Betrag auswählen: - </text> - <button label="Zahlen" label_selected="Zahlen" name="pay btn"/> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <text name="payee_label" width="130"> + Zahlen: + </text> + <icon name="icon_person" tool_tip="Person"/> + <text left="130" 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"/> + <text name="amount text"> + Oder Betrag auswählen: + </text> + <button label="Zahlen" label_selected="Zahlen" 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 32a026f7e89beffd1d2d75bbea9780c3a4041ea6..1bc721aabfd559da1394077693a68c0417ccf48c 100644 --- a/indra/newview/skins/default/xui/de/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml @@ -1,29 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <string name="payee_group" width="105"> - Gruppe bezahlen: - </string> - <string name="payee_resident" width="118"> - Einwohner bezahlen: - </string> - <icon name="icon_person" tool_tip="Person"/> - <text left="128" name="payee_name" width="168"> - [FIRST] [LAST] - </text> - <text halign="left" name="object_name_label"> - Über Objekt: - </text> - <icon name="icon_object" tool_tip="Objekte"/> - <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"/> - <text name="amount text"> - Oder Betrag auswählen: - </text> - <button label="Zahlen" label_selected="Zahlen" name="pay btn"/> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <string name="payee_group" width="105"> + Gruppe bezahlen: + </string> + <string name="payee_resident" width="118"> + Einwohner bezahlen: + </string> + <icon name="icon_person" tool_tip="Person"/> + <text left="128" name="payee_name" width="168"> + [FIRST] [LAST] + </text> + <text halign="left" name="object_name_label"> + Über Objekt: + </text> + <icon name="icon_object" tool_tip="Objekte"/> + <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"/> + <text name="amount text"> + Oder Betrag auswählen: + </text> + <button label="Zahlen" label_selected="Zahlen" 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_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml index c167427da9174c773956174c841c5691176e039b..ea2e64360166c9c8a1281769eb54007a00ea695c 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml @@ -1,12 +1,12 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview_anim"> - <floater.string name="Title"> - Animation: [NAME] - </floater.string> - <text name="desc txt"> - Beschreibung: - </text> - <line_editor left="98" name="desc" width="189"/> - <button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Gibt diese Animation so wieder, dass andere sie sehen können." width="116"/> - <button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Gibt diese Animation so wieder, dass nur Sie sie sehen." width="116"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_anim"> + <floater.string name="Title"> + Animation: [NAME] + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> + <line_editor left="98" name="desc" width="189"/> + <button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Gibt diese Animation so wieder, dass andere sie sehen können." width="116"/> + <button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Gibt diese Animation so wieder, dass nur Sie sie sehen." width="116"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_classified.xml b/indra/newview/skins/default/xui/de/floater_preview_classified.xml index e946f08b141bae3afef61d3919051bcd10dad79c..10f78207ebfa3cfe9389b1469a803d928e101536 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_classified.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="VERTRAULICHE INFORMATIONEN"> - <floater.string name="Title"> - Anzeige: [NAME] - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="classified_preview" title="VERTRAULICHE INFORMATIONEN"> + <floater.string name="Title"> + Anzeige: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_event.xml b/indra/newview/skins/default/xui/de/floater_preview_event.xml index fffcf7c1cf559764837208df188199799069fa16..44bccc8a06ca78b0cf1b316b4c5e60a4ce1a7f0a 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_event.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="EVENT-INFORMATIONEN"> - <floater.string name="Title"> - Veranstaltung: [NAME] - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="EVENT-INFORMATIONEN"> + <floater.string name="Title"> + Veranstaltung: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml index 9fbe8d869e6b67f468ee99bb45d3d715eda1bb05..3b86f4b3def8a4abd3f46f92c0ce5f4a4081c752 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="Gesten-Tastaturbefehl"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Gesten-Tastaturbefehl"/> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml index 9fbe8d869e6b67f468ee99bb45d3d715eda1bb05..3b86f4b3def8a4abd3f46f92c0ce5f4a4081c752 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="Gesten-Tastaturbefehl"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Gesten-Tastaturbefehl"/> diff --git a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml index 1887433b61747571d1a20d39abc8c78ba0d3eac1..a02a58ee0e2ad5a8366e9992fe8fd2d1444a8658 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml @@ -1,22 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="HINWEIS:"> - <floater.string name="no_object"> - Es wurde kein Objekt gefunden, das diese Notiz enthält. - </floater.string> - <floater.string name="not_allowed"> - Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte. - </floater.string> - <floater.string name="Title"> - Notizkarte: [NAME] - </floater.string> - <floater.string label="Speichern" label_selected="Speichern" name="Save"> - Speichern - </floater.string> - <text name="desc txt"> - Beschreibung: - </text> - <text_editor name="Notecard Editor"> - Wird geladen... - </text_editor> - <button label="Speichern" label_selected="Speichern" name="Save"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview notecard" title="HINWEIS:"> + <floater.string name="no_object"> + Es wurde kein Objekt gefunden, das diese Notiz enthält. + </floater.string> + <floater.string name="not_allowed"> + Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte. + </floater.string> + <floater.string name="Title"> + Notizkarte: [NAME] + </floater.string> + <floater.string label="Speichern" label_selected="Speichern" name="Save"> + Speichern + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> + <text_editor name="Notecard Editor"> + Wird geladen... + </text_editor> + <button label="Speichern" label_selected="Speichern" name="Save"/> +</floater> 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 397b417d44e557098256c58ed0b270db5ce32412..17419548bc3a487b6433aac0cf1d4c08bc1e6b03 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/de/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"> - Sound: [NAME] - </floater.string> - <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."/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_sound"> + <floater.string name="Title"> + Sound: [NAME] + </floater.string> + <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."/> +</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 c33e52dac8dad1f4bb994d24c9b22870e4e95dcc..9aa00e71725dfd11b7ac97961da5066120b3249c 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_texture.xml @@ -1,17 +1,17 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview_texture"> - <floater.string name="Title"> - Textur: [NAME] - </floater.string> - <floater.string name="Copy"> - In Inventar kopieren - </floater.string> - <text name="desc txt"> - Beschreibung: - </text> - <button label="Speichern" name="Keep"/> - <button label="Löschen" name="Discard"/> - <text name="dimensions"> - [WIDTH]px x [HEIGHT]px - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_texture"> + <floater.string name="Title"> + Textur: [NAME] + </floater.string> + <floater.string name="Copy"> + In Inventar kopieren + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> + <button label="Speichern" name="Keep"/> + <button label="Löschen" name="Discard"/> + <text name="dimensions"> + [WIDTH]px x [HEIGHT]px + </text> +</floater> 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 1e2872686132fd0b4de9a04d954a799bfe444cdc..84b80e2f6d23d3a6503da7cb10c8843359b84b67 100644 --- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml @@ -1,104 +1,104 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN"> - <floater.string name="Screenshot"> - Foto - </floater.string> - <check_box bottom_delta="-20" label="Dieses Foto verwenden" name="screen_check"/> - <text name="reporter_title"> - Melder: - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut - </text> - <text name="sim_title"> - Region: - </text> - <text name="sim_field"> - Name der Region - </text> - <text name="pos_title"> - Position: - </text> - <text name="pos_field"> - {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: - </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"> - Objekt: - </text> - <text name="object_name"> - Consetetur Sadipscing - </text> - <text name="owner_name_label"> - Eigentümer: - </text> - <text name="owner_name"> - Hendrerit Vulputate - </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> 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 > 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"/> - <combo_box.item label="Offenlegung > Abhören eines Chats aus der Ferne" name="Disclosure__Remotely_monitoring chat"/> - <combo_box.item label="Offenlegung > Second Life-Informationen/Chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/> - <combo_box.item label="Ruhestörung > Unfaire Nutzung von Regionsressourcen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> - <combo_box.item label="Ruhestörung > Exzessive Nutzung geskripteter Objekte" name="Disturbing_the_peace__Excessive_scripted_objects"/> - <combo_box.item label="Ruhestörung > Wildes Erzeugen von Objekten" name="Disturbing_the_peace__Object_littering"/> - <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 > 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"/> - <combo_box.item label="Belästigung > Diffamieren von Einzelpersonen/Gruppen" name="Harassment__Defaming_individuals_or_groups"/> - <combo_box.item label="Belästigung > Bewegungseinschränkung" name="Harassment__Impeding_movement"/> - <combo_box.item label="Belästigung > Sexuelle Belästigung" name="Harassment__Sexual_harassment"/> - <combo_box.item label="Belästigung > Anstiften Dritter zur Missachtung der Nutzungsbedingungen" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> - <combo_box.item label="Belästigung > Beschimpfung" name="Harassment__Verbal_abuse"/> - <combo_box.item label="Unanständigkeit > Anstößige Inhalte oder Handlungen in der Öffentlichkeit" name="Indecency__Broadly_offensive_content_or_conduct"/> - <combo_box.item label="Unanständigkeit > Anstößiger Avatarname" name="Indecency__Inappropriate_avatar_name"/> - <combo_box.item label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region" name="Indecency__Mature_content_in_PG_region"/> - <combo_box.item label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in Mature-Region" name="Indecency__Inappropriate_content_in_Mature_region"/> - <combo_box.item label="Urheberrechtsverletzung > Entfernen von Inhalten" name="Intellectual_property_infringement_Content_Removal"/> - <combo_box.item label="Urheberrechtsverletzung > CopyBot oder Berechtigungs-Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> - <combo_box.item label="Intoleranz" name="Intolerance"/> - <combo_box.item label="Land > Missbrauch der Sandbox-Ressourcen" name="Land__Abuse_of_sandbox_resources"/> - <combo_box.item label="Land > Unbefugte Nutzung > Objekte/Texturen" name="Land__Encroachment__Objects_textures"/> - <combo_box.item label="Land > Unbefugte Nutzung > Partikel" name="Land__Encroachment__Particles"/> - <combo_box.item label="Land > Unbefugte Nutzung > Bäume/Pflanzen" name="Land__Encroachment__Trees_plants"/> - <combo_box.item label="Wetten/Glücksspiel" name="Wagering_gambling"/> - <combo_box.item label="Sonstige" name="Other"/> - </combo_box> - <text name="abuser_name_title"> - Name des Beschuldigten: - </text> - <button label="Auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/> - <text name="abuser_name_title2"> - Ort des Missbrauchs: - </text> - <text name="sum_title"> - Zusammenfassung: - </text> - <text name="dscr_title"> - Details: - </text> - <text name="bug_aviso"> - Bitte beschreiben Sie so genau wie möglich. - </text> - <text_editor bottom_delta="-136" height="130" name="details_edit"/> - <text bottom_delta="-20" name="incomplete_title"> - Hinweis: Unvollständige Meldungen werden nicht bearbeitet. - </text> - <button label="Missbrauch melden" label_selected="Missbrauch melden" name="send_btn"/> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN"> + <floater.string name="Screenshot"> + Foto + </floater.string> + <check_box bottom_delta="-20" label="Dieses Foto verwenden" name="screen_check"/> + <text name="reporter_title"> + Melder: + </text> + <text name="reporter_field"> + Loremipsum Dolorsitamut + </text> + <text name="sim_title"> + Region: + </text> + <text name="sim_field"> + Name der Region + </text> + <text name="pos_title"> + Position: + </text> + <text name="pos_field"> + {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: + </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"> + Objekt: + </text> + <text name="object_name"> + Consetetur Sadipscing + </text> + <text name="owner_name_label"> + Eigentümer: + </text> + <text name="owner_name"> + Hendrerit Vulputate + </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> 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 > 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"/> + <combo_box.item label="Offenlegung > Abhören eines Chats aus der Ferne" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Offenlegung > Second Life-Informationen/Chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Ruhestörung > Unfaire Nutzung von Regionsressourcen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Ruhestörung > Exzessive Nutzung geskripteter Objekte" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Ruhestörung > Wildes Erzeugen von Objekten" name="Disturbing_the_peace__Object_littering"/> + <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 > 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"/> + <combo_box.item label="Belästigung > Diffamieren von Einzelpersonen/Gruppen" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="Belästigung > Bewegungseinschränkung" name="Harassment__Impeding_movement"/> + <combo_box.item label="Belästigung > Sexuelle Belästigung" name="Harassment__Sexual_harassment"/> + <combo_box.item label="Belästigung > Anstiften Dritter zur Missachtung der Nutzungsbedingungen" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="Belästigung > Beschimpfung" name="Harassment__Verbal_abuse"/> + <combo_box.item label="Unanständigkeit > Anstößige Inhalte oder Handlungen in der Öffentlichkeit" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Unanständigkeit > Anstößiger Avatarname" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in Mature-Region" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Urheberrechtsverletzung > Entfernen von Inhalten" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Urheberrechtsverletzung > CopyBot oder Berechtigungs-Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Intoleranz" name="Intolerance"/> + <combo_box.item label="Land > Missbrauch der Sandbox-Ressourcen" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="Land > Unbefugte Nutzung > Objekte/Texturen" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="Land > Unbefugte Nutzung > Partikel" name="Land__Encroachment__Particles"/> + <combo_box.item label="Land > Unbefugte Nutzung > Bäume/Pflanzen" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="Wetten/Glücksspiel" name="Wagering_gambling"/> + <combo_box.item label="Sonstige" name="Other"/> + </combo_box> + <text name="abuser_name_title"> + Name des Beschuldigten: + </text> + <button label="Auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/> + <text name="abuser_name_title2"> + Ort des Missbrauchs: + </text> + <text name="sum_title"> + Zusammenfassung: + </text> + <text name="dscr_title"> + Details: + </text> + <text name="bug_aviso"> + Bitte beschreiben Sie so genau wie möglich. + </text> + <text_editor bottom_delta="-136" height="130" name="details_edit"/> + <text bottom_delta="-20" name="incomplete_title"> + Hinweis: Unvollständige Meldungen werden nicht bearbeitet. + </text> + <button label="Missbrauch melden" label_selected="Missbrauch melden" name="send_btn"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml index fc805e879b8f9d1abe82601c3a784f0f8cf19a0f..ef021ce713170e7ed1357aa5e8d9beed45acc2e7 100644 --- a/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script" short_title="[All scripts]" title="[All scripts]"/> +<?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/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml index 1d6def4602ddede78fde58e41c036ad694349cb8..a895a32e14cc51914d8fba987731c16251f07ac3 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: ROTATIONSSKRIPT"> - <floater.string name="Title"> - Skript: [NAME] - </floater.string> - <text name="desc txt"> - Beschreibung: - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview lsl text" title="SKRIPT: ROTATIONSSKRIPT"> + <floater.string name="Title"> + Skript: [NAME] + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_script_queue.xml b/indra/newview/skins/default/xui/de/floater_script_queue.xml index d5dc7a0fd727cc3ee11a49c64885a1c0694a4b2a..4c82aabd47a6dce0f86f3e2eaff0ed85cd4ce1f5 100644 --- a/indra/newview/skins/default/xui/de/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/de/floater_script_queue.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="RÜCKGÄNGIG"> - <floater.string name="Starting"> - [START] von [COUNT] Artikeln. - </floater.string> - <floater.string name="Done"> - Fertig. - </floater.string> - <floater.string name="Resetting"> - Wird zurückgesetzt - </floater.string> - <floater.string name="Running"> - Läuft - </floater.string> - <floater.string name="NotRunning"> - Läuft nicht - </floater.string> - <button label="Schließen" label_selected="Schließen" left="215" name="close" width="72"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="queue" title="RÜCKGÄNGIG"> + <floater.string name="Starting"> + [START] von [COUNT] Artikeln. + </floater.string> + <floater.string name="Done"> + Fertig. + </floater.string> + <floater.string name="Resetting"> + Wird zurückgesetzt + </floater.string> + <floater.string name="Running"> + Läuft + </floater.string> + <floater.string name="NotRunning"> + Läuft nicht + </floater.string> + <button label="Schließen" label_selected="Schließen" left="215" name="close" width="72"/> +</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 82da881a54b885de595794b8323c57578a57e108..6a5f03c6619de656693573608d616a9e7390a5f4 100644 --- a/indra/newview/skins/default/xui/de/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="LAND VERKAUFEN"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - Parzelle: - </text> - <text bottom_delta="-5" height="16" name="info_parcel"> - PARZELLENNAME - </text> - <text name="info_size_label"> - Größe: - </text> - <text bottom_delta="-21" height="32" name="info_size"> - [AREA] qm - </text> - <text bottom_delta="-57" height="28" name="info_action"> - Zum Verkauf -dieser Parzelle: - </text> - <icon bottom_delta="-80" name="step_price"/> - <text name="price_label"> - Preis festlegen: - </text> - <text name="price_text"> - Einen angemessenen Preis auswählen. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - ([PER_METER] L$ pro Quadratmeter) - </text> - <icon height="64" left="0" name="step_sell_to" width="64"/> - <text bottom_delta="38" left="72" name="sell_to_label" right="-20"> - 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. - </text> - <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140"> - <combo_box.item label="select one --" name="--selectone--"/> - <combo_box.item label="Jeder" name="Anyone"/> - <combo_box.item label="Bestimmte Person:" name="Specificuser:"/> - </combo_box> - <button label="Auswählen..." name="sell_to_select_agent"/> - <text name="sell_objects_label"> - Die Objekte mit dem Land verkaufen? - </text> - <text name="sell_objects_text"> - Die transferierbaren Landeigentümer-Objekte auf der Parzelle -wechseln den Eigentümer. - </text> - <radio_group bottom_delta="-58" name="sell_objects"> - <radio_item label="Nein, Objekte behalten" name="no"/> - <radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/> - </radio_group> - <button label="Objekte anzeigen" name="show_objects" width="116"/> - <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="Abbrechen" name="cancel_btn"/> - </panel> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sell land" title="LAND VERKAUFEN"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + Parzelle: + </text> + <text bottom_delta="-5" height="16" name="info_parcel"> + PARZELLENNAME + </text> + <text name="info_size_label"> + Größe: + </text> + <text bottom_delta="-21" height="32" name="info_size"> + [AREA] qm + </text> + <text bottom_delta="-57" height="28" name="info_action"> + Zum Verkauf +dieser Parzelle: + </text> + <icon bottom_delta="-80" name="step_price"/> + <text name="price_label"> + Preis festlegen: + </text> + <text name="price_text"> + Einen angemessenen Preis auswählen. + </text> + <text name="price_ld"> + L$ + </text> + <text name="price_per_m"> + ([PER_METER] L$ pro Quadratmeter) + </text> + <icon height="64" left="0" name="step_sell_to" width="64"/> + <text bottom_delta="38" left="72" name="sell_to_label" right="-20"> + 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. + </text> + <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140"> + <combo_box.item label="select one --" name="--selectone--"/> + <combo_box.item label="Jeder" name="Anyone"/> + <combo_box.item label="Bestimmte Person:" name="Specificuser:"/> + </combo_box> + <button label="Auswählen..." name="sell_to_select_agent"/> + <text name="sell_objects_label"> + Die Objekte mit dem Land verkaufen? + </text> + <text name="sell_objects_text"> + Die transferierbaren Landeigentümer-Objekte auf der Parzelle +wechseln den Eigentümer. + </text> + <radio_group bottom_delta="-58" name="sell_objects"> + <radio_item label="Nein, Objekte behalten" name="no"/> + <radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/> + </radio_group> + <button label="Objekte anzeigen" name="show_objects" width="116"/> + <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="Abbrechen" name="cancel_btn"/> + </panel> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_settings_debug.xml b/indra/newview/skins/default/xui/de/floater_settings_debug.xml index f9a944165fc1642a4a4d6dc96f20fa839c36f805..004e54a33911bc63df56728949975be5bda1e19d 100644 --- a/indra/newview/skins/default/xui/de/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/de/floater_settings_debug.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN"> - <combo_box name="boolean_combo"> - <combo_box.item label="WAHR" name="TRUE"/> - <combo_box.item label="FALSCH" name="FALSE"/> - </combo_box> - <color_swatch label="Farbe" 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"/> - <spinner label="x" name="val_spinner_4"/> - <button label="Standard wiederherstellen" name="default_btn" width="170"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN"> + <combo_box name="boolean_combo"> + <combo_box.item label="WAHR" name="TRUE"/> + <combo_box.item label="FALSCH" name="FALSE"/> + </combo_box> + <color_swatch label="Farbe" 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"/> + <spinner label="x" name="val_spinner_4"/> + <button label="Standard wiederherstellen" name="default_btn" width="170"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml index 38494faf16b512b0ad1231d823f2ed3059d0f5fd..9aa0c028afebc49eb3f61781fb428ab1f91d8722 100644 --- a/indra/newview/skins/default/xui/de/floater_stats.xml +++ b/indra/newview/skins/default/xui/de/floater_stats.xml @@ -1,71 +1,71 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Statistics" title="Statistik"> - <scroll_container name="statistics_scroll"> - <container_view name="statistics_view"> - <stat_view label="Basic" name="basic"> - <stat_bar label="FPS" name="fps"/> - <stat_bar label="Bandbreite" name="bandwidth"/> - <stat_bar label="Paketverlust" name="packet_loss"/> - <stat_bar label="Ping Sim" name="ping"/> - </stat_view> - <stat_view label="Erweitert" name="advanced"> - <stat_view label="Darstellung" name="render"> - <stat_bar label="Gezeichnete KTris" name="ktrisframe"/> - <stat_bar label="Gezeichnete KTris" name="ktrissec"/> - <stat_bar label="Objektanzahl" name="objs"/> - <stat_bar label="Neue Objekte" name="newobjs"/> - </stat_view> - <stat_view label="Textur" name="texture"> - <stat_bar label="Zählen" name="numimagesstat"/> - <stat_bar label="Rohanzahl" name="numrawimagesstat"/> - <stat_bar label="GL Sp" name="gltexmemstat"/> - <stat_bar label="Formattierter Sp:" name="formattedmemstat"/> - <stat_bar label="Rohsp" name="rawmemstat"/> - <stat_bar label="Zugeteilter Sp" name="glboundmemstat"/> - </stat_view> - <stat_view label="Netzwerk" name="network"> - <stat_bar label="Paketeingang" name="packetsinstat"/> - <stat_bar label="Paketausgang" name="packetsoutstat"/> - <stat_bar label="Objekte" name="objectkbitstat"/> - <stat_bar label="Textur" name="texturekbitstat"/> - <stat_bar label="Bestand" name="assetkbitstat"/> - <stat_bar label="Ebenen" name="layerskbitstat"/> - <stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/> - <stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/> - <stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/> - </stat_view> - </stat_view> - <stat_view label="Simulator" name="sim"> - <stat_bar label="Zeitdilation" name="simtimedilation"/> - <stat_bar label="Sim FPS" name="simfps"/> - <stat_bar label="Physik FPS" name="simphysicsfps"/> - <stat_view label="Physikdetails" name="physicsdetail"> - <stat_bar label="Eingerastete Objekte" name="physicspinnedtasks"/> - <stat_bar label="Niedrig LOD-Objekte" name="physicslodtasks"/> - <stat_bar label="Zugeordneter Speicher" name="physicsmemoryallocated"/> - <stat_bar label="Agent Updates/Sek" name="simagentups"/> - <stat_bar label="Haupt-Agenten" name="simmainagents"/> - <stat_bar label="Child-Agenten" name="simchildagents"/> - <stat_bar label="Objekte" name="simobjects"/> - <stat_bar label="Aktive Objekte" name="simactiveobjects"/> - <stat_bar label="Aktive Skripts" name="simactivescripts"/> - <stat_bar label="Skript-Events" name="simscripteps"/> - <stat_bar label="Paketeingang" name="siminpps"/> - <stat_bar label="Paketausgang" name="simoutpps"/> - <stat_bar label="Ausstehende Downloads" name="simpendingdownloads"/> - <stat_bar label="Ausstehende Uploads" name="simpendinguploads"/> - <stat_bar label="Gesamtanzahl „Unacked" Bytes" name="simtotalunackedbytes"/> - </stat_view> - <stat_view label="Zeit (ms)" name="simperf"> - <stat_bar label="Gesamtzeit Frame" name="simframemsec"/> - <stat_bar label="Netto-Zeit" name="simnetmsec"/> - <stat_bar label="Physik-Zeit" name="simsimphysicsmsec"/> - <stat_bar label="Simulationszeit" name="simsimothermsec"/> - <stat_bar label="Agent-Zeit" name="simagentmsec"/> - <stat_bar label="Bilder-Zeit" name="simimagesmsec"/> - <stat_bar label="Skript-Zeit" name="simscriptmsec"/> - </stat_view> - </stat_view> - </container_view> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="Statistik"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="Basic" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="Bandbreite" name="bandwidth"/> + <stat_bar label="Paketverlust" name="packet_loss"/> + <stat_bar label="Ping Sim" name="ping"/> + </stat_view> + <stat_view label="Erweitert" name="advanced"> + <stat_view label="Darstellung" name="render"> + <stat_bar label="Gezeichnete KTris" name="ktrisframe"/> + <stat_bar label="Gezeichnete KTris" name="ktrissec"/> + <stat_bar label="Objektanzahl" name="objs"/> + <stat_bar label="Neue Objekte" name="newobjs"/> + </stat_view> + <stat_view label="Textur" name="texture"> + <stat_bar label="Zählen" name="numimagesstat"/> + <stat_bar label="Rohanzahl" name="numrawimagesstat"/> + <stat_bar label="GL Sp" name="gltexmemstat"/> + <stat_bar label="Formattierter Sp:" name="formattedmemstat"/> + <stat_bar label="Rohsp" name="rawmemstat"/> + <stat_bar label="Zugeteilter Sp" name="glboundmemstat"/> + </stat_view> + <stat_view label="Netzwerk" name="network"> + <stat_bar label="Paketeingang" name="packetsinstat"/> + <stat_bar label="Paketausgang" name="packetsoutstat"/> + <stat_bar label="Objekte" name="objectkbitstat"/> + <stat_bar label="Textur" name="texturekbitstat"/> + <stat_bar label="Bestand" name="assetkbitstat"/> + <stat_bar label="Ebenen" name="layerskbitstat"/> + <stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/> + <stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/> + <stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="Simulator" name="sim"> + <stat_bar label="Zeitdilation" name="simtimedilation"/> + <stat_bar label="Sim FPS" name="simfps"/> + <stat_bar label="Physik FPS" name="simphysicsfps"/> + <stat_view label="Physikdetails" name="physicsdetail"> + <stat_bar label="Eingerastete Objekte" name="physicspinnedtasks"/> + <stat_bar label="Niedrig LOD-Objekte" name="physicslodtasks"/> + <stat_bar label="Zugeordneter Speicher" name="physicsmemoryallocated"/> + <stat_bar label="Agent Updates/Sek" name="simagentups"/> + <stat_bar label="Haupt-Agenten" name="simmainagents"/> + <stat_bar label="Child-Agenten" name="simchildagents"/> + <stat_bar label="Objekte" name="simobjects"/> + <stat_bar label="Aktive Objekte" name="simactiveobjects"/> + <stat_bar label="Aktive Skripts" name="simactivescripts"/> + <stat_bar label="Skript-Events" name="simscripteps"/> + <stat_bar label="Paketeingang" name="siminpps"/> + <stat_bar label="Paketausgang" name="simoutpps"/> + <stat_bar label="Ausstehende Downloads" name="simpendingdownloads"/> + <stat_bar label="Ausstehende Uploads" name="simpendinguploads"/> + <stat_bar label="Gesamtanzahl „Unacked" Bytes" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="Zeit (ms)" name="simperf"> + <stat_bar label="Gesamtzeit Frame" name="simframemsec"/> + <stat_bar label="Netto-Zeit" name="simnetmsec"/> + <stat_bar label="Physik-Zeit" name="simsimphysicsmsec"/> + <stat_bar label="Simulationszeit" name="simsimothermsec"/> + <stat_bar label="Agent-Zeit" name="simagentmsec"/> + <stat_bar label="Bilder-Zeit" name="simimagesmsec"/> + <stat_bar label="Skript-Zeit" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index b458d922ba5fe8718d6bdff14a32a9565acb9af4..f4d1bb4d54a80b557405f125876ea00e6c120e4d 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -1,480 +1,480 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="Bau-Werkzeuge" title=""> - <floater.string name="status_rotate"> - An den farbigen Bändern ziehen, um das Objekt zu drehen - </floater.string> - <floater.string name="status_scale"> - Klicken und ziehen, um die ausgewählte Seite zu dehnen - </floater.string> - <floater.string name="status_move"> - Maus verschiebt, Umschalt-Taste und Maus kopiert - </floater.string> - <floater.string name="status_modifyland"> - Klicken und halten, um das Land zu bearbeiten - </floater.string> - <floater.string name="status_camera"> - Klicken und ziehen, um Kamera zu bewegen - </floater.string> - <floater.string name="status_grab"> - Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg-Umschalt zum Drehen - </floater.string> - <floater.string name="status_place"> - Inworld klicken, um zu bauen. - </floater.string> - <floater.string name="status_selectland"> - Klicken und ziehen, um Land auszuwählen - </floater.string> - <floater.string name="grid_screen_text"> - Bildschirm - </floater.string> - <floater.string name="grid_local_text"> - Lokal - </floater.string> - <floater.string name="grid_world_text"> - Welt - </floater.string> - <floater.string name="grid_reference_text"> - Referenz - </floater.string> - <floater.string name="grid_attachment_text"> - Anhang - </floater.string> - <button label="" label_selected="" name="button focus" tool_tip="Fokus"/> - <button label="" label_selected="" name="button move" tool_tip="Verschieben"/> - <button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/> - <button label="" label_selected="" name="button create" tool_tip="Erstellen"/> - <button label="" label_selected="" name="button land" tool_tip="Land"/> - <text name="text status"> - Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen - </text> - <radio_group name="focus_radio_group"> - <radio_item label="Zoom" name="radio zoom"/> - <radio_item label="Orbit (Strg)" name="radio orbit"/> - <radio_item label="Schwenken (Strg-Umschalt)" name="radio pan"/> - </radio_group> - <radio_group name="move_radio_group"> - <radio_item label="Verschieben" name="radio move"/> - <radio_item label="Heben (Strg)" name="radio lift"/> - <radio_item label="Rotieren (Strg-Umschalt)" name="radio spin"/> - </radio_group> - <radio_group name="edit_radio_group"> - <radio_item label="Bewegen" name="radio position"/> - <radio_item label="Drehen (Strg)" name="radio rotate"/> - <radio_item label="Dehnen (Strg-Umschalt)" name="radio stretch"/> - <radio_item label="Textur auswählen" name="radio select face"/> - </radio_group> - <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> - <check_box label="Beide Seiten dehnen" name="checkbox uniform"/> - <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"> - <combo_box.item label="Welt-Lineal" name="World"/> - <combo_box.item label="Lokal-Lineal" name="Local"/> - <combo_box.item label="Referenz-Lineal" name="Reference"/> - </combo_box> - <button label="Optionen..." label_selected="Optionen..." name="Options..." tool_tip="Grid-Optionen einstellen"/> - <button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/> - <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/> - <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> - <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraeder"/> - <button label="" label_selected="" name="ToolCylinder" tool_tip="Zylinder"/> - <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halbzylinder"/> - <button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/> - <button label="" label_selected="" name="ToolHemiCone" tool_tip="Halbkegel"/> - <button label="" label_selected="" name="ToolSphere" tool_tip="Kugel"/> - <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halbkugel"/> - <button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/> - <button label="" label_selected="" name="ToolTube" tool_tip="Rohr"/> - <button label="" label_selected="" name="ToolRing" tool_tip="Ring"/> - <button label="" label_selected="" name="ToolTree" tool_tip="Baum"/> - <button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/> - <check_box label="Ausgewähltes Werkzeug beibehalten" name="checkbox sticky"/> - <check_box label="Auswahl kopieren" name="checkbox copy selection"/> - <check_box initial_value="true" label="Kopie zentrieren" name="checkbox copy centers"/> - <check_box label="Kopie drehen" name="checkbox copy rotates"/> - <radio_group name="land_radio_group"> - <radio_item label="Land auswählen" name="radio select land"/> - <radio_item label="Einebnen" name="radio flatten"/> - <radio_item label="Anheben" name="radio raise"/> - <radio_item label="Absenken" name="radio lower"/> - <radio_item label="Glätten" name="radio smooth"/> - <radio_item label="Aufrauen" name="radio noise"/> - <radio_item label="Zurücksetzen" name="radio revert"/> - </radio_group> - <text name="Bulldozer:"> - Planierraupe: - </text> - <text name="Dozer Size:"> - Größe - </text> - <text name="Strength:"> - Stärke - </text> - <button label="Übernehmen" label_selected="Übernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land ändern"/> - <text name="obj_count"> - Objekte: [COUNT] - </text> - <text name="prim_count"> - Primitive: [COUNT] - </text> - <tab_container name="Object Info Tabs"> - <panel label="Allgemein" name="General"> - <panel.string name="text deed continued"> - Übertragung - </panel.string> - <panel.string name="text deed"> - Übertragung - </panel.string> - <panel.string name="text modify info 1"> - Sie können dieses Objekt ändern - </panel.string> - <panel.string name="text modify info 2"> - Sie können diese Objekte ändern - </panel.string> - <panel.string name="text modify info 3"> - Sie können dieses Objekt nicht ändern - </panel.string> - <panel.string name="text modify info 4"> - Sie können diese Objekte nicht ändern - </panel.string> - <panel.string name="text modify warning"> - Gesamtes Objekt wählen, um Berechtigungen festzulegen. - </panel.string> - <panel.string name="Cost Default"> - Preis: L$ - </panel.string> - <panel.string name="Cost Total"> - Summe: L$ - </panel.string> - <panel.string name="Cost Per Unit"> - Stückpreis: L$ - </panel.string> - <panel.string name="Cost Mixed"> - Mischpreis - </panel.string> - <panel.string name="Sale Mixed"> - Mischverkauf - </panel.string> - <text name="Name:"> - Name: - </text> - <text name="Description:"> - Beschreibung: - </text> - <text name="Creator:"> - Ersteller: - </text> - <text name="Creator Name"> - Thrax Linden - </text> - <text name="Owner:"> - Eigentümer: - </text> - <text name="Owner Name"> - Thrax Linden - </text> - <text name="Group:"> - Gruppe: - </text> - <button label="Festlegen..." label_selected="Festlegen..." name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/> - <name_box initial_value="Wird geladen..." name="Group Name Proxy"/> - <button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/> - <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="label click action"> - Bei Linksklick: - </text> - <combo_box name="clickaction"> - <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/> - <combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/> - <combo_box.item label="Objekt kaufen" name="Buyobject"/> - <combo_box.item label="Objekt bezahlen" name="Payobject"/> - <combo_box.item label="Öffnen" name="Open"/> - </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="Inhalt" name="Contents"/> - <combo_box.item label="Original" name="Original"/> - </combo_box> - <spinner label="Preis: L$" name="Edit Cost"/> - <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/> - <panel name="perms_build"> - <text name="perm_modify"> - Sie können dieses Objekt bearbeiten. - </text> - <text name="Anyone can:"> - Jeder: - </text> - <check_box label="Kopieren" name="checkbox allow everyone copy"/> - <text name="Next owner can:"> - Nächster Eigentümer: - </text> - <check_box label="Ändern" name="checkbox next owner can modify"/> - <check_box label="Kopieren" name="checkbox next owner can copy"/> - <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> - <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="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="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Verursacht, dass Objekt 1 Minute nach Erstellung gelöscht wird."/> - <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/> - <text name="label position"> - Position (Meter) - </text> - <spinner label="X" name="Pos X"/> - <spinner label="Y" name="Pos Y"/> - <spinner label="Z" name="Pos Z"/> - <text name="label size"> - Größe (Meter) - </text> - <spinner label="X" name="Scale X"/> - <spinner label="Y" name="Scale Y"/> - <spinner label="Z" name="Scale Z"/> - <text name="label rotation"> - Rotation (Grad) - </text> - <spinner label="X" name="Rot X"/> - <spinner label="Y" name="Rot Y"/> - <spinner label="Z" name="Rot Z"/> - <combo_box name="comboBaseType"> - <combo_box.item label="Quader" name="Box"/> - <combo_box.item label="Zylinder" name="Cylinder"/> - <combo_box.item label="Prisma" name="Prism"/> - <combo_box.item label="Kugel" name="Sphere"/> - <combo_box.item label="Torus" name="Torus"/> - <combo_box.item label="Rohr" name="Tube"/> - <combo_box.item label="Ring" name="Ring"/> - <combo_box.item label="Geformt" name="Sculpted"/> - </combo_box> - <combo_box name="material"> - <combo_box.item label="Stein" name="Stone"/> - <combo_box.item label="Metall" name="Metal"/> - <combo_box.item label="Glas" name="Glass"/> - <combo_box.item label="Holz" name="Wood"/> - <combo_box.item label="Fleisch" name="Flesh"/> - <combo_box.item label="Kunststoff" name="Plastic"/> - <combo_box.item label="Gummi" name="Rubber"/> - </combo_box> - <text name="text cut"> - Pfadschnitt (Anfang/Ende) - </text> - <spinner label="B" name="cut begin"/> - <spinner label="E" name="cut end"/> - <text name="text hollow"> - Hohl - </text> - <text name="text skew"> - Versatz - </text> - <spinner name="Scale 1"/> - <spinner name="Skew"/> - <text name="Hollow Shape"> - Hohlform - </text> - <combo_box name="hole"> - <combo_box.item label="Standard" name="Default"/> - <combo_box.item label="Kreis" name="Circle"/> - <combo_box.item label="Quadrat" name="Square"/> - <combo_box.item label="Dreieck" name="Triangle"/> - </combo_box> - <text name="text twist"> - Torsion (Anfang/Ende) - </text> - <spinner label="B" name="Twist Begin"/> - <spinner label="E" name="Twist End"/> - <text name="scale_taper"> - Verjüngung - </text> - <text name="scale_hole"> - Lochgröße - </text> - <spinner label="X" name="Taper Scale X"/> - <spinner label="Y" name="Taper Scale Y"/> - <text name="text topshear"> - Verscherung - </text> - <spinner label="X" name="Shear X"/> - <spinner label="Y" name="Shear Y"/> - <text name="advanced_cut"> - Profilschnitt (Anfang/Ende) - </text> - <text name="advanced_dimple"> - Vertiefung (Anfang/Ende) - </text> - <text name="advanced_slice"> - Abschneiden (Anfang/Ende) - </text> - <spinner label="B" name="Path Limit Begin"/> - <spinner label="E" name="Path Limit End"/> - <text name="text taper2"> - Verjüngung - </text> - <spinner label="X" name="Taper X"/> - <spinner label="Y" name="Taper Y"/> - <text name="text radius delta"> - Radius - </text> - <text name="text revolutions"> - Umdrehungen - </text> - <spinner name="Radius Offset"/> - <texture_picker label="Textur für gestaltetes Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> - <check_box label="Spiegeln" name="sculpt mirror control" tool_tip="Geformtes Primitiv entlang der X-Achse spiegeln."/> - <check_box label="Wenden" name="sculpt invert control" tool_tip="Dreht die Normalen des geformten Primitivs von innen nach außen."/> - <text name="label sculpt type"> - Naht - </text> - <combo_box name="sculpt type control"> - <combo_box.item label="(keiner)" name="None"/> - <combo_box.item label="Kugel" name="Sphere"/> - <combo_box.item label="Torus" name="Torus"/> - <combo_box.item label="Fläche" name="Plane"/> - <combo_box.item label="Zylinder" name="Cylinder"/> - </combo_box> - </panel> - <panel label="Eigenschaften" name="Features"> - <text name="select_single"> - Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten. - </text> - <text name="edit_object"> - Objekteigenschaften bearbeiten: - </text> - <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Gestattet, dass Objekt um die Z-Achse gebogen wird. (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"/> - <check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/> - <color_swatch label="" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> - <spinner label="Intensität" name="Light Intensity"/> - <spinner label="Radius" name="Light Radius"/> - <spinner label="Abnehmend" name="Light Falloff"/> - </panel> - <panel label="Textur" name="Texture"> - <panel.string name="string repeats per meter"> - Kacheln pro Meter - </panel.string> - <panel.string name="string repeats per face"> - Wiederholungen pro Fläche - </panel.string> - <texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/> - <color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> - <text name="color trans"> - Transparenz % - </text> - <text name="glow label"> - Leuchten - </text> - <check_box label="Ganz hell" name="checkbox fullbright"/> - <text name="tex gen"> - Zuordnung - </text> - <combo_box name="combobox texgen"> - <combo_box.item label="Standard" name="Default"/> - <combo_box.item label="Eben" name="Planar"/> - </combo_box> - <text name="label shininess"> - Glanz - </text> - <combo_box name="combobox shininess"> - <combo_box.item label="Kein" name="None"/> - <combo_box.item label="Niedrig" name="Low"/> - <combo_box.item label="Mittel" name="Medium"/> - <combo_box.item label="Hoch" name="High"/> - </combo_box> - <text name="label bumpiness"> - Holprigkeit - </text> - <combo_box name="combobox bumpiness"> - <combo_box.item label="Keine" name="None"/> - <combo_box.item label="Helligkeit" name="Brightness"/> - <combo_box.item label="Dunkelheit" name="Darkness"/> - <combo_box.item label="Holzmaserung" name="woodgrain"/> - <combo_box.item label="Rinde" name="bark"/> - <combo_box.item label="Ziegel" name="bricks"/> - <combo_box.item label="Karo" name="checker"/> - <combo_box.item label="Beton" name="concrete"/> - <combo_box.item label="verkrustete Fliesen" name="crustytile"/> - <combo_box.item label="Steinplatten" name="cutstone"/> - <combo_box.item label="Scheiben" name="discs"/> - <combo_box.item label="Kies" name="gravel"/> - <combo_box.item label="Petrischale" name="petridish"/> - <combo_box.item label="Verkleidung" name="siding"/> - <combo_box.item label="Steinfliesen" name="stonetile"/> - <combo_box.item label="Stuck" name="stucco"/> - <combo_box.item label="Saugen" name="suction"/> - <combo_box.item label="gewoben" name="weave"/> - </combo_box> - <text name="tex scale"> - Wiederholungen - </text> - <spinner label="Horizontal (U)" name="TexScaleU"/> - <check_box label="Umkehren" name="checkbox flip s"/> - <spinner label="Vertikal (V)" name="TexScaleV"/> - <check_box label="Umkehren" name="checkbox flip t"/> - <button label="Übernehmen" label_selected="Übernehmen" name="button apply"/> - <text name="tex offset"> - Texture-Versatz - </text> - <spinner label="Horizontal (U)" name="TexOffsetU"/> - <spinner label="Vertikal (V)" name="TexOffsetV"/> - </panel> - <panel label="Inhalt" name="Contents"> - <button label="Neues Skript" label_selected="Neues Skript" name="button new script"/> - <button label="Berechtigungen" name="button permissions"/> - </panel> - </tab_container> - <panel name="land info panel"> - <text name="label_parcel_info"> - Parzelleninformation - </text> - <text name="label_area_price"> - Preis: L$ [PRICE] für [AREA] m² - </text> - <text name="label_area"> - Fläche: [AREA] m² - </text> - <button label="Info zu Land..." label_selected="Info zu Land..." name="button about land"/> - <check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Parzellen nach Eigentümer farbig kennzeichnen: - -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 - </text> - <button label="Unterteilen" label_selected="Unterteilen" name="button subdivide land"/> - <button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land"/> - <text name="label_parcel_trans"> - Land-Transaktionen - </text> - <button label="Land kaufen" label_selected="Land kaufen" name="button buy land"/> - <button label="Land aufgeben" label_selected="Land aufgeben" name="button abandon land"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="toolbox floater" short_title="Bau-Werkzeuge" title=""> + <floater.string name="status_rotate"> + An den farbigen Bändern ziehen, um das Objekt zu drehen + </floater.string> + <floater.string name="status_scale"> + Klicken und ziehen, um die ausgewählte Seite zu dehnen + </floater.string> + <floater.string name="status_move"> + Maus verschiebt, Umschalt-Taste und Maus kopiert + </floater.string> + <floater.string name="status_modifyland"> + Klicken und halten, um das Land zu bearbeiten + </floater.string> + <floater.string name="status_camera"> + Klicken und ziehen, um Kamera zu bewegen + </floater.string> + <floater.string name="status_grab"> + Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg-Umschalt zum Drehen + </floater.string> + <floater.string name="status_place"> + Inworld klicken, um zu bauen. + </floater.string> + <floater.string name="status_selectland"> + Klicken und ziehen, um Land auszuwählen + </floater.string> + <floater.string name="grid_screen_text"> + Bildschirm + </floater.string> + <floater.string name="grid_local_text"> + Lokal + </floater.string> + <floater.string name="grid_world_text"> + Welt + </floater.string> + <floater.string name="grid_reference_text"> + Referenz + </floater.string> + <floater.string name="grid_attachment_text"> + Anhang + </floater.string> + <button label="" label_selected="" name="button focus" tool_tip="Fokus"/> + <button label="" label_selected="" name="button move" tool_tip="Verschieben"/> + <button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/> + <button label="" label_selected="" name="button create" tool_tip="Erstellen"/> + <button label="" label_selected="" name="button land" tool_tip="Land"/> + <text name="text status"> + Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen + </text> + <radio_group name="focus_radio_group"> + <radio_item label="Zoom" name="radio zoom"/> + <radio_item label="Orbit (Strg)" name="radio orbit"/> + <radio_item label="Schwenken (Strg-Umschalt)" name="radio pan"/> + </radio_group> + <radio_group name="move_radio_group"> + <radio_item label="Verschieben" name="radio move"/> + <radio_item label="Heben (Strg)" name="radio lift"/> + <radio_item label="Rotieren (Strg-Umschalt)" name="radio spin"/> + </radio_group> + <radio_group name="edit_radio_group"> + <radio_item label="Bewegen" name="radio position"/> + <radio_item label="Drehen (Strg)" name="radio rotate"/> + <radio_item label="Dehnen (Strg-Umschalt)" name="radio stretch"/> + <radio_item label="Textur auswählen" name="radio select face"/> + </radio_group> + <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> + <check_box label="Beide Seiten dehnen" name="checkbox uniform"/> + <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"> + <combo_box.item label="Welt-Lineal" name="World"/> + <combo_box.item label="Lokal-Lineal" name="Local"/> + <combo_box.item label="Referenz-Lineal" name="Reference"/> + </combo_box> + <button label="Optionen..." label_selected="Optionen..." name="Options..." tool_tip="Grid-Optionen einstellen"/> + <button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/> + <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/> + <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> + <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraeder"/> + <button label="" label_selected="" name="ToolCylinder" tool_tip="Zylinder"/> + <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halbzylinder"/> + <button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/> + <button label="" label_selected="" name="ToolHemiCone" tool_tip="Halbkegel"/> + <button label="" label_selected="" name="ToolSphere" tool_tip="Kugel"/> + <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halbkugel"/> + <button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/> + <button label="" label_selected="" name="ToolTube" tool_tip="Rohr"/> + <button label="" label_selected="" name="ToolRing" tool_tip="Ring"/> + <button label="" label_selected="" name="ToolTree" tool_tip="Baum"/> + <button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/> + <check_box label="Ausgewähltes Werkzeug beibehalten" name="checkbox sticky"/> + <check_box label="Auswahl kopieren" name="checkbox copy selection"/> + <check_box initial_value="true" label="Kopie zentrieren" name="checkbox copy centers"/> + <check_box label="Kopie drehen" name="checkbox copy rotates"/> + <radio_group name="land_radio_group"> + <radio_item label="Land auswählen" name="radio select land"/> + <radio_item label="Einebnen" name="radio flatten"/> + <radio_item label="Anheben" name="radio raise"/> + <radio_item label="Absenken" name="radio lower"/> + <radio_item label="Glätten" name="radio smooth"/> + <radio_item label="Aufrauen" name="radio noise"/> + <radio_item label="Zurücksetzen" name="radio revert"/> + </radio_group> + <text name="Bulldozer:"> + Planierraupe: + </text> + <text name="Dozer Size:"> + Größe + </text> + <text name="Strength:"> + Stärke + </text> + <button label="Übernehmen" label_selected="Übernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land ändern"/> + <text name="obj_count"> + Objekte: [COUNT] + </text> + <text name="prim_count"> + Primitive: [COUNT] + </text> + <tab_container name="Object Info Tabs"> + <panel label="Allgemein" name="General"> + <panel.string name="text deed continued"> + Übertragung + </panel.string> + <panel.string name="text deed"> + Übertragung + </panel.string> + <panel.string name="text modify info 1"> + Sie können dieses Objekt ändern + </panel.string> + <panel.string name="text modify info 2"> + Sie können diese Objekte ändern + </panel.string> + <panel.string name="text modify info 3"> + Sie können dieses Objekt nicht ändern + </panel.string> + <panel.string name="text modify info 4"> + Sie können diese Objekte nicht ändern + </panel.string> + <panel.string name="text modify warning"> + Gesamtes Objekt wählen, um Berechtigungen festzulegen. + </panel.string> + <panel.string name="Cost Default"> + Preis: L$ + </panel.string> + <panel.string name="Cost Total"> + Summe: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Stückpreis: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mischpreis + </panel.string> + <panel.string name="Sale Mixed"> + Mischverkauf + </panel.string> + <text name="Name:"> + Name: + </text> + <text name="Description:"> + Beschreibung: + </text> + <text name="Creator:"> + Ersteller: + </text> + <text name="Creator Name"> + Thrax Linden + </text> + <text name="Owner:"> + Eigentümer: + </text> + <text name="Owner Name"> + Thrax Linden + </text> + <text name="Group:"> + Gruppe: + </text> + <button label="Festlegen..." label_selected="Festlegen..." name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/> + <name_box initial_value="Wird geladen..." name="Group Name Proxy"/> + <button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/> + <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="label click action"> + Bei Linksklick: + </text> + <combo_box name="clickaction"> + <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/> + <combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/> + <combo_box.item label="Objekt kaufen" name="Buyobject"/> + <combo_box.item label="Objekt bezahlen" name="Payobject"/> + <combo_box.item label="Öffnen" name="Open"/> + </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="Inhalt" name="Contents"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Preis: L$" name="Edit Cost"/> + <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/> + <panel name="perms_build"> + <text name="perm_modify"> + Sie können dieses Objekt bearbeiten. + </text> + <text name="Anyone can:"> + Jeder: + </text> + <check_box label="Kopieren" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + Nächster Eigentümer: + </text> + <check_box label="Ändern" name="checkbox next owner can modify"/> + <check_box label="Kopieren" name="checkbox next owner can copy"/> + <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <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="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="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Verursacht, dass Objekt 1 Minute nach Erstellung gelöscht wird."/> + <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/> + <text name="label position"> + Position (Meter) + </text> + <spinner label="X" name="Pos X"/> + <spinner label="Y" name="Pos Y"/> + <spinner label="Z" name="Pos Z"/> + <text name="label size"> + Größe (Meter) + </text> + <spinner label="X" name="Scale X"/> + <spinner label="Y" name="Scale Y"/> + <spinner label="Z" name="Scale Z"/> + <text name="label rotation"> + Rotation (Grad) + </text> + <spinner label="X" name="Rot X"/> + <spinner label="Y" name="Rot Y"/> + <spinner label="Z" name="Rot Z"/> + <combo_box name="comboBaseType"> + <combo_box.item label="Quader" name="Box"/> + <combo_box.item label="Zylinder" name="Cylinder"/> + <combo_box.item label="Prisma" name="Prism"/> + <combo_box.item label="Kugel" name="Sphere"/> + <combo_box.item label="Torus" name="Torus"/> + <combo_box.item label="Rohr" name="Tube"/> + <combo_box.item label="Ring" name="Ring"/> + <combo_box.item label="Geformt" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="Stein" name="Stone"/> + <combo_box.item label="Metall" name="Metal"/> + <combo_box.item label="Glas" name="Glass"/> + <combo_box.item label="Holz" name="Wood"/> + <combo_box.item label="Fleisch" name="Flesh"/> + <combo_box.item label="Kunststoff" name="Plastic"/> + <combo_box.item label="Gummi" name="Rubber"/> + </combo_box> + <text name="text cut"> + Pfadschnitt (Anfang/Ende) + </text> + <spinner label="B" name="cut begin"/> + <spinner label="E" name="cut end"/> + <text name="text hollow"> + Hohl + </text> + <text name="text skew"> + Versatz + </text> + <spinner name="Scale 1"/> + <spinner name="Skew"/> + <text name="Hollow Shape"> + Hohlform + </text> + <combo_box name="hole"> + <combo_box.item label="Standard" name="Default"/> + <combo_box.item label="Kreis" name="Circle"/> + <combo_box.item label="Quadrat" name="Square"/> + <combo_box.item label="Dreieck" name="Triangle"/> + </combo_box> + <text name="text twist"> + Torsion (Anfang/Ende) + </text> + <spinner label="B" name="Twist Begin"/> + <spinner label="E" name="Twist End"/> + <text name="scale_taper"> + Verjüngung + </text> + <text name="scale_hole"> + Lochgröße + </text> + <spinner label="X" name="Taper Scale X"/> + <spinner label="Y" name="Taper Scale Y"/> + <text name="text topshear"> + Verscherung + </text> + <spinner label="X" name="Shear X"/> + <spinner label="Y" name="Shear Y"/> + <text name="advanced_cut"> + Profilschnitt (Anfang/Ende) + </text> + <text name="advanced_dimple"> + Vertiefung (Anfang/Ende) + </text> + <text name="advanced_slice"> + Abschneiden (Anfang/Ende) + </text> + <spinner label="B" name="Path Limit Begin"/> + <spinner label="E" name="Path Limit End"/> + <text name="text taper2"> + Verjüngung + </text> + <spinner label="X" name="Taper X"/> + <spinner label="Y" name="Taper Y"/> + <text name="text radius delta"> + Radius + </text> + <text name="text revolutions"> + Umdrehungen + </text> + <spinner name="Radius Offset"/> + <texture_picker label="Textur für gestaltetes Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <check_box label="Spiegeln" name="sculpt mirror control" tool_tip="Geformtes Primitiv entlang der X-Achse spiegeln."/> + <check_box label="Wenden" name="sculpt invert control" tool_tip="Dreht die Normalen des geformten Primitivs von innen nach außen."/> + <text name="label sculpt type"> + Naht + </text> + <combo_box name="sculpt type control"> + <combo_box.item label="(keiner)" name="None"/> + <combo_box.item label="Kugel" name="Sphere"/> + <combo_box.item label="Torus" name="Torus"/> + <combo_box.item label="Fläche" name="Plane"/> + <combo_box.item label="Zylinder" name="Cylinder"/> + </combo_box> + </panel> + <panel label="Eigenschaften" name="Features"> + <text name="select_single"> + Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten. + </text> + <text name="edit_object"> + Objekteigenschaften bearbeiten: + </text> + <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Gestattet, dass Objekt um die Z-Achse gebogen wird. (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"/> + <check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/> + <color_swatch label="" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> + <spinner label="Intensität" name="Light Intensity"/> + <spinner label="Radius" name="Light Radius"/> + <spinner label="Abnehmend" name="Light Falloff"/> + </panel> + <panel label="Textur" name="Texture"> + <panel.string name="string repeats per meter"> + Kacheln pro Meter + </panel.string> + <panel.string name="string repeats per face"> + Wiederholungen pro Fläche + </panel.string> + <texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/> + <color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> + <text name="color trans"> + Transparenz % + </text> + <text name="glow label"> + Leuchten + </text> + <check_box label="Ganz hell" name="checkbox fullbright"/> + <text name="tex gen"> + Zuordnung + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Standard" name="Default"/> + <combo_box.item label="Eben" name="Planar"/> + </combo_box> + <text name="label shininess"> + Glanz + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Kein" name="None"/> + <combo_box.item label="Niedrig" name="Low"/> + <combo_box.item label="Mittel" name="Medium"/> + <combo_box.item label="Hoch" name="High"/> + </combo_box> + <text name="label bumpiness"> + Holprigkeit + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Keine" name="None"/> + <combo_box.item label="Helligkeit" name="Brightness"/> + <combo_box.item label="Dunkelheit" name="Darkness"/> + <combo_box.item label="Holzmaserung" name="woodgrain"/> + <combo_box.item label="Rinde" name="bark"/> + <combo_box.item label="Ziegel" name="bricks"/> + <combo_box.item label="Karo" name="checker"/> + <combo_box.item label="Beton" name="concrete"/> + <combo_box.item label="verkrustete Fliesen" name="crustytile"/> + <combo_box.item label="Steinplatten" name="cutstone"/> + <combo_box.item label="Scheiben" name="discs"/> + <combo_box.item label="Kies" name="gravel"/> + <combo_box.item label="Petrischale" name="petridish"/> + <combo_box.item label="Verkleidung" name="siding"/> + <combo_box.item label="Steinfliesen" name="stonetile"/> + <combo_box.item label="Stuck" name="stucco"/> + <combo_box.item label="Saugen" name="suction"/> + <combo_box.item label="gewoben" name="weave"/> + </combo_box> + <text name="tex scale"> + Wiederholungen + </text> + <spinner label="Horizontal (U)" name="TexScaleU"/> + <check_box label="Umkehren" name="checkbox flip s"/> + <spinner label="Vertikal (V)" name="TexScaleV"/> + <check_box label="Umkehren" name="checkbox flip t"/> + <button label="Übernehmen" label_selected="Übernehmen" name="button apply"/> + <text name="tex offset"> + Texture-Versatz + </text> + <spinner label="Horizontal (U)" name="TexOffsetU"/> + <spinner label="Vertikal (V)" name="TexOffsetV"/> + </panel> + <panel label="Inhalt" name="Contents"> + <button label="Neues Skript" label_selected="Neues Skript" name="button new script"/> + <button label="Berechtigungen" name="button permissions"/> + </panel> + </tab_container> + <panel name="land info panel"> + <text name="label_parcel_info"> + Parzelleninformation + </text> + <text name="label_area_price"> + Preis: L$ [PRICE] für [AREA] m² + </text> + <text name="label_area"> + Fläche: [AREA] m² + </text> + <button label="Info zu Land..." label_selected="Info zu Land..." name="button about land"/> + <check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Parzellen nach Eigentümer farbig kennzeichnen: + +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 + </text> + <button label="Unterteilen" label_selected="Unterteilen" name="button subdivide land"/> + <button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land"/> + <text name="label_parcel_trans"> + Land-Transaktionen + </text> + <button label="Land kaufen" label_selected="Land kaufen" name="button buy land"/> + <button label="Land aufgeben" label_selected="Land aufgeben" name="button abandon land"/> + </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 d2d6d202706c2255362ff646f5c9ed77d96473b7..58e0498b05b7cd17bfc35ac17c53f3758327e821 100644 --- a/indra/newview/skins/default/xui/de/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml @@ -1,16 +1,16 @@ -<?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"> - [ACCTTYPE], [PAYMENTINFO] -Profil: [SL_PROFILE] - </string> - <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> - <button label="Freund hinzufügen" name="add_friend_btn"/> -</floater> +<?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"> + [ACCTTYPE], [PAYMENTINFO] +Profil: [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> + <button label="Freund hinzufügen" name="add_friend_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_icon.xml b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml index ae9a70024aef748f00b4740c3e8227d5d33db416..b1e119c66a910e11fbe3012b37a34180726c6c1d 100644 --- a/indra/newview/skins/default/xui/de/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Avatar Icon Menu"> - <menu_item_call label="Profil anzeigen..." name="Show Profile"/> - <menu_item_call label="IM senden..." name="Send IM"/> - <menu_item_call label="Freund hinzufügen..." name="Add Friend"/> - <menu_item_call label="Freund entfernen..." name="Remove Friend"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Profil anzeigen..." name="Show Profile"/> + <menu_item_call label="IM senden..." name="Send IM"/> + <menu_item_call label="Freund hinzufügen..." name="Add Friend"/> + <menu_item_call label="Freund entfernen..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_favorites.xml b/indra/newview/skins/default/xui/de/menu_favorites.xml index b73010e7b5ac4998183c0268a7e32d260d1290f6..0d0491d2ebce0eed87ae41cf424989c571cf3ee8 100644 --- a/indra/newview/skins/default/xui/de/menu_favorites.xml +++ b/indra/newview/skins/default/xui/de/menu_favorites.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="Teleportieren" name="Teleport To Landmark"/> - <menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/> - <menu_item_call label="SLurl kopieren" name="Copy slurl"/> - <menu_item_call label="Auf Karte zeigen" name="Show On Map"/> - <menu_item_call label="Kopieren" name="Landmark Copy"/> - <menu_item_call label="Einfügen" name="Landmark Paste"/> - <menu_item_call label="Löschen" name="Delete"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportieren" name="Teleport To Landmark"/> + <menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/> + <menu_item_call label="SLurl kopieren" name="Copy slurl"/> + <menu_item_call label="Auf Karte zeigen" name="Show On Map"/> + <menu_item_call label="Kopieren" name="Landmark Copy"/> + <menu_item_call label="Einfügen" name="Landmark Paste"/> + <menu_item_call label="Löschen" name="Delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_group_plus.xml b/indra/newview/skins/default/xui/de/menu_group_plus.xml index f90fcb04519d69043f0e1e665bf6d031ace6d11f..583ee793be67acaf65be10bf2f0b2da83d2ed43e 100644 --- a/indra/newview/skins/default/xui/de/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/de/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="Werden Sie Mitglied..." name="item_join"/> - <menu_item_call label="Neue Gruppe..." name="item_new"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Werden Sie Mitglied..." name="item_join"/> + <menu_item_call label="Neue Gruppe..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml index 67250fc73283bfac4fd229a01127c9750f96215d..7b4335a430d98ede407cf04f211f8d7dcf711926 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory.xml @@ -1,76 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <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="Eigenschaften" name="Task Properties"/> - <menu_item_call label="Umbenennen" name="Task Rename"/> - <menu_item_call label="Löschen" name="Task Remove"/> - <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/> - <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/> - <menu_item_call label="Neuer Ordner" name="New Folder"/> - <menu_item_call label="Neues Skript" name="New Script"/> - <menu_item_call label="Neue Notiz" name="New Note"/> - <menu_item_call label="Neue Geste" name="New Gesture"/> - <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> - <menu label="Neue Körperteile" name="New Body Parts"> - <menu_item_call label="Neue Form/Gestalt" 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 label="Typ ändern" name="Change Type"> - <menu_item_call label="Standard" name="Default"/> - <menu_item_call label="Handschuhe" name="Gloves"/> - <menu_item_call label="Jacke" name="Jacket"/> - <menu_item_call label="Hose" name="Pants"/> - <menu_item_call label="Form" name="Shape"/> - <menu_item_call label="Schuhe" name="Shoes"/> - <menu_item_call label="Hemd" name="Shirt"/> - <menu_item_call label="Rock" name="Skirt"/> - <menu_item_call label="Unterhose" name="Underpants"/> - <menu_item_call label="Unterhemd" name="Undershirt"/> - </menu> - <menu_item_call label="Teleportieren" name="Landmark Open"/> - <menu_item_call label="Öffnen" name="Animation Open"/> - <menu_item_call label="Öffnen" name="Sound Open"/> - <menu_item_call label="Objekt löschen" name="Purge Item"/> - <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/> - <menu_item_call label="Öffnen" name="Open"/> - <menu_item_call label="Eigenschaften" name="Properties"/> - <menu_item_call label="Umbenennen" name="Rename"/> - <menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/> - <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="Objekte abnehmen" name="Take Off Items"/> - <menu_item_call label="Zum Outfit hinzufügen" name="Add To Outfit"/> - <menu_item_call label="Outfit ersetzen" name="Replace Outfit"/> - <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/> - <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/> - <menu_item_call label="In Welt abspielen" name="Animation Play"/> - <menu_item_call label="Lokal wiedergeben" 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"/> - <menu_item_call label="Aktivieren" name="Activate"/> - <menu_item_call label="Deaktivieren" name="Deactivate"/> - <menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/> - <menu_item_call label="Anziehen" name="Object Wear"/> - <menu label="Anhängen an" name="Attach To"/> - <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="Ausziehen" name="Take Off"/> - <menu_item_call label="--keine Optionen--" name="--no options--"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <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="Eigenschaften" name="Task Properties"/> + <menu_item_call label="Umbenennen" name="Task Rename"/> + <menu_item_call label="Löschen" name="Task Remove"/> + <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/> + <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/> + <menu_item_call label="Neuer Ordner" name="New Folder"/> + <menu_item_call label="Neues Skript" name="New Script"/> + <menu_item_call label="Neue Notiz" name="New Note"/> + <menu_item_call label="Neue Geste" name="New Gesture"/> + <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> + <menu label="Neue Körperteile" name="New Body Parts"> + <menu_item_call label="Neue Form/Gestalt" 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 label="Typ ändern" name="Change Type"> + <menu_item_call label="Standard" name="Default"/> + <menu_item_call label="Handschuhe" name="Gloves"/> + <menu_item_call label="Jacke" name="Jacket"/> + <menu_item_call label="Hose" name="Pants"/> + <menu_item_call label="Form" name="Shape"/> + <menu_item_call label="Schuhe" name="Shoes"/> + <menu_item_call label="Hemd" name="Shirt"/> + <menu_item_call label="Rock" name="Skirt"/> + <menu_item_call label="Unterhose" name="Underpants"/> + <menu_item_call label="Unterhemd" name="Undershirt"/> + </menu> + <menu_item_call label="Teleportieren" name="Landmark Open"/> + <menu_item_call label="Öffnen" name="Animation Open"/> + <menu_item_call label="Öffnen" name="Sound Open"/> + <menu_item_call label="Objekt löschen" name="Purge Item"/> + <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/> + <menu_item_call label="Öffnen" name="Open"/> + <menu_item_call label="Eigenschaften" name="Properties"/> + <menu_item_call label="Umbenennen" name="Rename"/> + <menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/> + <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="Objekte abnehmen" name="Take Off Items"/> + <menu_item_call label="Zum Outfit hinzufügen" name="Add To Outfit"/> + <menu_item_call label="Outfit ersetzen" name="Replace Outfit"/> + <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/> + <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/> + <menu_item_call label="In Welt abspielen" name="Animation Play"/> + <menu_item_call label="Lokal wiedergeben" 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"/> + <menu_item_call label="Aktivieren" name="Activate"/> + <menu_item_call label="Deaktivieren" name="Deactivate"/> + <menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/> + <menu_item_call label="Anziehen" name="Object Wear"/> + <menu label="Anhängen an" name="Attach To"/> + <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="Ausziehen" name="Take Off"/> + <menu_item_call label="--keine Optionen--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_landmark.xml b/indra/newview/skins/default/xui/de/menu_landmark.xml index 40b5b67079bcbe3d01d732544f17c5365fcb542d..b100ee11d7fe4a3c4c5c733ae4d10b5e0727f27f 100644 --- a/indra/newview/skins/default/xui/de/menu_landmark.xml +++ b/indra/newview/skins/default/xui/de/menu_landmark.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<toggleable_menu name="landmark_overflow_menu"> - <menu_item_call label="SLurl kopieren" name="copy"/> - <menu_item_call label="Löschen" name="delete"/> - <menu_item_call label="Auswahl erstellen" name="pick"/> -</toggleable_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="SLurl kopieren" name="copy"/> + <menu_item_call label="Löschen" name="delete"/> + <menu_item_call label="Auswahl erstellen" name="pick"/> +</toggleable_menu> 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 840e7c41b24285bd82200faeabbcb9a35ebf0bb8..a3179b42f827847ccf09dab9a745aa92bd0499a6 100644 --- a/indra/newview/skins/default/xui/de/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/de/menu_mini_map.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<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"/> - <menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/> - <menu_item_call label="Weltkarte" name="World Map"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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"/> + <menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/> + <menu_item_call label="Weltkarte" name="World Map"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_navbar.xml b/indra/newview/skins/default/xui/de/menu_navbar.xml index 677de7c116d44d00976eb82a73bcca7a18032d78..6af01ddcc541c6ca4c817dc06826d8a68406b342 100644 --- a/indra/newview/skins/default/xui/de/menu_navbar.xml +++ b/indra/newview/skins/default/xui/de/menu_navbar.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Navbar Menu"> - <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/> - <menu_item_call label="Landmarke" name="Landmark"/> - <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="Alle auswählen" name="Select All"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/> + <menu_item_call label="Landmarke" name="Landmark"/> + <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="Alle auswählen" name="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_picks.xml b/indra/newview/skins/default/xui/de/menu_picks.xml index 102dd4cc5d6377a91bab0452253ab5105a1715fb..9aec4c83b0ce2a28bed4079343bf3452c4f1533b 100644 --- a/indra/newview/skins/default/xui/de/menu_picks.xml +++ b/indra/newview/skins/default/xui/de/menu_picks.xml @@ -1,8 +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="Bearbeiten" name="pick_edit"/> - <menu_item_call label="Teleportieren" name="pick_teleport"/> - <menu_item_call label="Karte" name="pick_map"/> - <menu_item_call label="Löschen" name="pick_delete"/> -</context_menu> +<?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="Bearbeiten" name="pick_edit"/> + <menu_item_call label="Teleportieren" name="pick_teleport"/> + <menu_item_call label="Karte" name="pick_map"/> + <menu_item_call label="Löschen" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_place.xml b/indra/newview/skins/default/xui/de/menu_place.xml index 36cb3377c14c963b1b7d14ca4600ac56ea259f18..d9c85f5b929687c4f59fb4785f9d367290783e8d 100644 --- a/indra/newview/skins/default/xui/de/menu_place.xml +++ b/indra/newview/skins/default/xui/de/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="Eine Landmarke setzen" name="landmark"/> - <menu_item_call label="Auswahl erstellen" name="pick"/> - <menu_item_call label="Pass kaufen" name="pass"/> - <menu_item_call label="Bearbeiten" name="edit"/> -</toggleable_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Eine Landmarke setzen" name="landmark"/> + <menu_item_call label="Auswahl erstellen" name="pick"/> + <menu_item_call label="Pass kaufen" name="pass"/> + <menu_item_call label="Bearbeiten" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_slurl.xml b/indra/newview/skins/default/xui/de/menu_slurl.xml index b379c1ca6a9f85a6fcbac7013a902542918cf7fd..b2ec017f9f3e929fb7f1008de3964dab42a07b5d 100644 --- a/indra/newview/skins/default/xui/de/menu_slurl.xml +++ b/indra/newview/skins/default/xui/de/menu_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="URL-Info" name="about_url"/> - <menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/> - <menu_item_call label="Karte" name="show_on_map"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="URL-Info" name="about_url"/> + <menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/> + <menu_item_call label="Karte" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_agent.xml b/indra/newview/skins/default/xui/de/menu_url_agent.xml index e9effe0bf26cb19504e9d6b3c1f8673238f488af..9a808088fbeebd8681eab0915973f1139b77b7b5 100644 --- a/indra/newview/skins/default/xui/de/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/de/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="Einwohnerprofil anzeigen" name="show_agent"/> - <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> - <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/> + <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_group.xml b/indra/newview/skins/default/xui/de/menu_url_group.xml index 78051fe726eaf2c8e82bc4fc3e43d7d550ea65cb..6bd86414bc10dd0a3da4bd886f23081b40cc3ac8 100644 --- a/indra/newview/skins/default/xui/de/menu_url_group.xml +++ b/indra/newview/skins/default/xui/de/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="Gruppeninformation anzeigen" name="show_group"/> - <menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/> - <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Gruppeninformation anzeigen" name="show_group"/> + <menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_http.xml b/indra/newview/skins/default/xui/de/menu_url_http.xml index ae4aaad4803bff26b26e257ff2917772d147d347..30eb1668a54b0edb40f556f32dff0a4c75b799fb 100644 --- a/indra/newview/skins/default/xui/de/menu_url_http.xml +++ b/indra/newview/skins/default/xui/de/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="Webseite öffnen" name="url_open"/> - <menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/> - <menu_item_call label="Im externen Browser öffnen" name="url_open_external"/> - <menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Webseite öffnen" name="url_open"/> + <menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/> + <menu_item_call label="Im externen Browser öffnen" name="url_open_external"/> + <menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_objectim.xml b/indra/newview/skins/default/xui/de/menu_url_objectim.xml index 8bb1822405c2e69dbe73be565e512d918c90467b..11f242b5409c67f81fe3d8d9491511bb52972b1d 100644 --- a/indra/newview/skins/default/xui/de/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="Objektinformationen anzeigen" name="show_object"/> - <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/> - <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/> - <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Objektinformationen anzeigen" name="show_object"/> + <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/> + <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_parcel.xml b/indra/newview/skins/default/xui/de/menu_url_parcel.xml index b3117c8fbe847493c739e8ed4fc2d892635369f4..707079f8cc2ac8d6cceee89f0cecfe11386045ff 100644 --- a/indra/newview/skins/default/xui/de/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/de/menu_url_parcel.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/> - <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_slurl.xml b/indra/newview/skins/default/xui/de/menu_url_slurl.xml index b4d15b2c3db147c4efb73ec0dc69076d29a0eae1..9b6417456c9b1bc65e96f43bf8d05fec8aa17bbb 100644 --- a/indra/newview/skins/default/xui/de/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/de/menu_url_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="Ortsinformationen anzeigen" name="show_place"/> - <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/> - <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ortsinformationen anzeigen" name="show_place"/> + <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_teleport.xml b/indra/newview/skins/default/xui/de/menu_url_teleport.xml index 254807295f43fdc968c16433bdee2422c452c9ab..306977574ca1e8ac56bd5e25ae2a1bf16da65ef1 100644 --- a/indra/newview/skins/default/xui/de/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/de/menu_url_teleport.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="An diesen Standort teleportieren" name="teleport"/> - <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="An diesen Standort teleportieren" name="teleport"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 62cd98287528378e8b27ced2cbc4adfa6c32e55d..317b525062244e4989d9cf366014f7435dc1017b 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> + <menu name="Me"> + <menu_item_call label="Einstellungen" 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=de" /> + </menu_item_call> + </menu> <menu label="Datei" name="File"> <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> <menu label="Hochladen" name="upload"> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 94bb7582c37c17fb52bd5cb37c3a485195775278..8b8a0afa8922a97158000847e904675309ec8a67 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -1,2563 +1,2560 @@ -<?xml version="1.0" encoding="utf-8"?> -<notifications> - <global name="skipnexttime"> - Nicht mehr anzeigen - </global> - <global name="alwayschoose"> - Diese Option immer auswählen - </global> - <global name="implicitclosebutton"> - Schließen - </global> - <template name="okbutton"> - <form> - <button name="OK" text="$yestext"/> - </form> - </template> - <template name="okignore"/> - <template name="okcancelbuttons"> - <form> - <button name="Cancel" text="$notext"/> - </form> - </template> - <template name="okcancelignore"/> - <template name="okhelpbuttons"> - <form> - <button name="Help" text="$helptext"/> - </form> - </template> - <template name="yesnocancelbuttons"> - <form> - <button name="Yes" text="$yestext"/> - <button name="No" text="$notext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="Unbekannter Warnhinweis" name="MissingAlert"> - Ihre Version von [APP_NAME] kann den gerade empfangenen Warnhinweis nicht anzeigen. Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben. - -Fehlerdetails: Der Warnhinweis '[_NAME]' wurde in notifications.xml nicht gefunden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FloaterNotFound"> - Floater-Fehler: Folgende Steuerelemente wurden nicht gefunden: - -[CONTROLS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TutorialNotFound"> - Derzeit ist kein Tutorial verfügbar. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GenericAlert"> - [MESSAGE] - </notification> - <notification name="GenericAlertYesCancel"> - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="BadInstallation"> - Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version des Viewers herunter. http://get.secondlife.com - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LoginFailedNoNetwork"> - Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden. - '[DIAGNOSTIC]' -Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MessageTemplateNotFound"> - Meldungsvorlage [PATH] nicht gefunden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="WearableSave"> - Änderung an aktueller Kleidung/Körperteil speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> - </notification> - <notification name="CompileQueueSaveText"> - Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. - </notification> - <notification name="CompileQueueSaveBytecode"> - Eine kompiliertes Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. - </notification> - <notification name="WriteAnimationFail"> - Fehler beim Schreiben von Animationsdaten. Bitte versuchen Sie es erneut. - </notification> - <notification name="UploadAuctionSnapshotFail"> - Eine Auktions-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] - </notification> - <notification name="UnableToViewContentsMoreThanOne"> - Es kann nur jeweils der Inhalt von einem Objekt angezeigt werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification name="SaveClothingBodyChanges"> - Änderung an Kleidung/Körperteilen speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/> - </notification> - <notification name="GrantModifyRights"> - Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern oder an sich zu nehmen, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. -Möchten Sie [FIRST_NAME] [LAST_NAME] Änderungsrechte gewähren? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="GrantModifyRightsMultiple"> - Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. -Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="RevokeModifyRights"> - Möchten Sie [FIRST_NAME] [LAST_NAME] die Änderungsrechte entziehen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="RevokeModifyRightsMultiple"> - Möchten Sie den ausgewählten Einwohnern die Änderungsrechte entziehen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="UnableToCreateGroup"> - Gruppe konnte nicht erstellt werden. -[MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PanelGroupApply"> - [NEEDS_APPLY_MESSAGE] -[WANT_APPLY_MESSAGE] - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Änderungen verwerfen" yestext="Änderungen übernehmen"/> - </notification> - <notification name="MustSpecifyGroupNoticeSubject"> - Geben Sie einen Betreff für die Gruppenmitteilung ein. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AddGroupOwnerWarning"> - Sie sind im Begriff, Gruppenmitgliedern die Rolle [ROLE_NAME] zuzuweisen. -Diese Rolle kann Mitgliedern nicht mehr entzogen werden. -Sie müssen die Rolle selbst niederlegen. -Möchten Sie fortfahren? - <usetemplate ignoretext="Bestätigen, bevor ich einen neuen Gruppeneigentümer hinzufüge" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="AssignDangerousActionWarning"> - Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. - - *ACHTUNG* - Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - - und allen anderen Mitgliedern – Rollen zuweisen, die mehr Rechte - beinhalten als sie derzeit haben, und damit nahezu - Eigentümerrechte erreichen. Überlegen Sie sich, wem Sie diese Fähigkeit - verleihen. - -Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="AssignDangerousAbilityWarning"> - Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. - - *ACHTUNG* - Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - - und allen anderen Mitgliedern – alle Fähigkeiten zuweisen und - damit fast Eigentümerrechte erreichen. - -Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="JoinGroupCanAfford"> - Der Beitritt zu dieser Gruppe kostet [COST] L$. -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. - </notification> - <notification name="CreateGroupCost"> - Die Gründung dieser Gruppe kostet 100 L$. -Gruppen müssen mehr als ein Mitglied haben oder sie werden gelöscht. -Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein. - <usetemplate canceltext="Abbrechen" name="okcancelbuttons" notext="Abbrechen" yestext="Gruppe für 100 L$ erstellen"/> - </notification> - <notification name="LandBuyPass"> - Sie können dieses Land („[PARCEL_NAME]“) für [COST] L$ -[TIME] Stunden lang betreten. Pass kaufen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SalePriceRestriction"> - Der Verkaufspreis muss beim allgemeinen Verkauf über 0 L$ liegen. -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. - <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] qm Land werden zum Verkauf freigegeben. -Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsDeededToGroup"> - Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „[NAME]“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren? - -*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedByUser"> - Möchten Sie alle Objekte auf dieser Parzelle, die dem Einwohner „[NAME]“ gehören, in das jeweilige Inventar ihrer Eigentümer transferieren? - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedBySelf"> - Möchten Sie alle Objekte auf dieser Parzelle, die Ihnen gehören, zurück in Ihr Inventar transferieren? - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedBySelf"> - Möchten Sie alle Objekte auf dieser Parzelle, die NICHT Ihnen gehören, in das Inventar ihrer Eigentümer transferieren? -Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. - -*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByUser"> - Möchten Sie alle Objekte auf dieser Parzelle, die NICHT [NAME] gehören, in das Inventar ihrer Eigentümer transferieren? -Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. - -*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnAllTopObjects"> - Möchten Sie alle aufgeführten Objekte ihren Eigentümern zurückgeben? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DisableAllTopObjects"> - Möchten Sie alle Objekte in dieser Region deaktivieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByGroup"> - Objekte auf dieser Parzelle, die von der Gruppe [NAME] nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben? - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="UnableToDisableOutsideScripts"> - Skriptdeaktivierung nicht möglich. -Für die gesamte Region ist Schaden aktiviert. -Damit Waffen funktionieren, müssen Skripts erlaubt sein. - </notification> - <notification name="MustBeInParcel"> - Sie müssen auf einer Landparzelle stehen, um ihren Landepunkt festzulegen. - </notification> - <notification name="PromptRecipientEmail"> - Bitte geben Sie für den/die Empfänger eine gültige Email-Adresse ein. - </notification> - <notification name="PromptSelfEmail"> - Geben Sie Ihre E-Mail-Adresse ein. - </notification> - <notification name="PromptMissingSubjMsg"> - Foto mit Standardbetreff bzw. -nachricht als E-Mail versenden? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ErrorProcessingSnapshot"> - Fehler beim Verarbeiten der Fotodaten - </notification> - <notification name="ErrorEncodingSnapshot"> - Fehler beim Erstellen des Fotos! - </notification> - <notification name="ErrorUploadingPostcard"> - Ein Foto konnte aus folgendem Grund nicht gesendet werden: [REASON] - </notification> - <notification name="ErrorUploadingReportScreenshot"> - Ein Report-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] - </notification> - <notification name="MustAgreeToLogIn"> - Bevor Sie sich in [SECOND_LIFE] anmelden können, müssen Sie den Nutzungsbedingungen zustimmen. - </notification> - <notification name="CouldNotPutOnOutfit"> - Outfit konnte nicht angezogen werden. -Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge. - </notification> - <notification name="CannotWearTrash"> - Kleider oder Körperteile im Papierkorb können nicht getragen werden - </notification> - <notification name="CannotWearInfoNotComplete"> - Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal. - </notification> - <notification name="MustHaveAccountToLogIn"> - Hoppla! Da fehlt noch etwas. -Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein. - -Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen? - <url name="url"> - https://join.secondlife.com/index.php?lang=de-DE - </url> - <usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/> - </notification> - <notification name="AddClassified"> - Anzeigen erscheinen für eine Woche unter „Anzeigen“ im Suchverzeichnis. 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. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste. - <usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DeleteClassified"> - Anzeige „[NAME]“ löschen? -Gebühren werden nicht rückerstattet. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ClassifiedSave"> - Änderung an Anzeige [NAME] speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> - </notification> - <notification name="DeleteAvatarPick"> - Auswahl [PICK] löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="PromptGoToEventsPage"> - Zur [SECOND_LIFE] Events-Webseite? - <url name="url"> - http://de.secondlife.com/events/ - </url> - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SelectProposalToView"> - Wählen Sie ein Angebot zur Ansicht. - </notification> - <notification name="SelectHistoryItemToView"> - Wählen Sie ein Element zur Ansicht. - </notification> - <notification name="ResetShowNextTimeDialogs"> - Möchten Sie alle Popups wieder aktivieren, die Sie zuvor auf „Nicht mehr anzeigen“ gesetzt haben? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - Möchten Sie alle Popups, die übersprungen werden können, deaktivieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CacheWillClear"> - Der Cache wird nach einem Neustart von [APP_NAME] geleert. - </notification> - <notification name="CacheWillBeMoved"> - Der Cache wird nach einem Neustart von [APP_NAME] verschoben. -Hinweis: Der Cache wird dabei gelöscht/geleert. - </notification> - <notification name="ChangeConnectionPort"> - Die Port-Einstellungen werden nach einem Neustart von [APP_NAME] wirksam. - </notification> - <notification name="ChangeSkin"> - Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angewendet. - </notification> - <notification name="GoToAuctionPage"> - Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben? - <url name="url"> - http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] - </url> - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SaveChanges"> - Änderungen speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> - </notification> - <notification name="GestureSaveFailedTooManySteps"> - Speichern der Geste fehlgeschlagen. -Die Geste besteht aus zu vielen Schritten. -Löschen Sie einige Schritte und versuchen Sie es erneut. - </notification> - <notification name="GestureSaveFailedTryAgain"> - Speichern der Geste fehlgeschlagen. Warten Sie kurz und versuchen Sie es dann noch einmal. - </notification> - <notification name="GestureSaveFailedObjectNotFound"> - Geste konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="GestureSaveFailedReason"> - Eine Geste konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Geste bitte später. - </notification> - <notification name="SaveNotecardFailObjectNotFound"> - Notizkarte konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="SaveNotecardFailReason"> - Eine Notizkarte konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Notizkarte bitte später. - </notification> - <notification name="ScriptCannotUndo"> - Es konnten nicht alle Änderungen in Ihrer Skriptversion rückgängig gemacht werden. -Möchten Sie die letzte gespeicherte Version vom Server laden? -(**Warnung** Dieser Vorgang kann nicht rückgängig gemacht werden.) - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SaveScriptFailReason"> - Ein Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. - </notification> - <notification name="SaveScriptFailObjectNotFound"> - Skript konnte nicht gespeichert werden, weil das zugehörige Objekt nicht gefunden wurde. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="SaveBytecodeFailReason"> - Ein kompiliertes Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. - </notification> - <notification name="StartRegionEmpty"> - Sie haben keine Start-Region festgelegt. -Bitte geben Sie den Namen der Region im Feld „Startposition“ ein oder wählen Sie „Mein letzter Standort“ oder „Mein Heimatort“ als Startposition aus. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CouldNotStartStopScript"> - Skript konnte nicht gestartet oder beendet werden, weil das zugehörige Objekt nicht gefunden wurde. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="CannotDownloadFile"> - Dateidownload nicht möglich - </notification> - <notification name="CannotWriteFile"> - 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. - -MINDESTANF. -Die Seite [_URL] für weitere Informationen öffnen? - <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. -(Einstellungen > Grafik). - <form name="form"> - <ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/> - </form> - </notification> - <notification name="DisplaySettingsNoShaders"> - [APP_NAME] ist bei der Initialisierung der Grafiktreiber abgestürzt. -Die Grafikqualität wird auf eine niedrige Stufe zurückgesetzt, um einige typische Treiberfehler zu vermeiden. -Einige Grafikfunktionen werden ausgeschaltet. -Wir empfehlen die Aktualisierung Ihrer Grafikkartentreiber. -Sie können die Grafikqualität unter „Einstellungen“ > „Grafik“ wieder erhöhen. - </notification> - <notification name="RegionNoTerraforming"> - 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? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="CannotGiveItem"> - Inventarobjekt kann nicht übergeben werden. - </notification> - <notification name="TransactionCancelled"> - Transaktion abgebrochen. - </notification> - <notification name="TooManyItems"> - Es können maximal 42 Objekte auf einmal in das Inventar transferiert werden. - </notification> - <notification name="NoItems"> - Sie sind nicht berechtigt, die ausgewählten Objekte zu kopieren. - </notification> - <notification name="CannotCopyCountItems"> - Sie sind nicht berechtigt, [COUNT] der ausgewählten Objekte zu kopieren. Diese Objekte werden aus Ihrem Inventar gelöscht. -Möchten Sie diese Objekte weggeben? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="CannotGiveCategory"> - Sie sind nicht berechtigt, den ausgewählten Ordner zu kopieren. - </notification> - <notification name="FreezeAvatar"> - Diesen Avatar einfrieren? -Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> - </notification> - <notification name="FreezeAvatarFullname"> - [AVATAR_NAME] einfrieren? -Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> - </notification> - <notification name="EjectAvatarFullname"> - [AVATAR_NAME] von Ihrem Land werfen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Ausschließen und Verbannen" yestext="Ausschließen"/> - </notification> - <notification name="EjectAvatarNoBan"> - Diesen Avatar aus Ihrem Land werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> - </notification> - <notification name="EjectAvatarFullnameNoBan"> - [AVATAR_NAME] aus Ihrem Land werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> - </notification> - <notification name="AcquireErrorTooManyObjects"> - FEHLER: Zu viele Objekte ausgewählt. - </notification> - <notification name="AcquireErrorObjectSpan"> - FEHLER: Die Objekte überspannen mehrere Regionen. -Verschieben Sie alle betreffenden Objekte in dieselbe Region. - </notification> - <notification name="PromptGoToCurrencyPage"> - [EXTRA] - -[_URL] für Informationen zum Kauf von L$ öffnen? - <url name="url"> - http://de.secondlife.com/app/currency/ - </url> - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="UnableToLinkObjects"> - Verknüpfung dieser [COUNT] Objekte nicht möglich. -Sie können maximal [MAX] Objekte verknüpfen. - </notification> - <notification name="CannotLinkIncompleteSet"> - Sie können nur vollständige Objektsätze verknüpfen und Sie müssen mehr als ein Objekt auswählen. - </notification> - <notification name="CannotLinkModify"> - Verknüpfung nicht möglich, da Sie nicht alle Objekte bearbeiten dürfen. - -Stellen Sie sicher, dass kein Objekt gesperrt ist und alle Objekte Ihnen gehören. - </notification> - <notification name="CannotLinkDifferentOwners"> - Verknüpfung nicht möglich, da nicht alle Objekte denselben Eigentümer haben. - -Stellen Sie sicher, dass alle ausgewählten Objekte Ihnen gehören. - </notification> - <notification name="NoFileExtension"> - Kein Dateityp für Datei: „[FILE]“ - -Vergewissern Sie sich, dass die Datei den richtigen Dateityp hat. - </notification> - <notification name="InvalidFileExtension"> - Ungültige Datei-Endung [EXTENSION] -Erwartet wurde [VALIDS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotUploadSoundFile"> - Sounddatei konnte nicht hochgeladen werden: -[FILE] - </notification> - <notification name="SoundFileNotRIFF"> - Die Datei ist anscheinend keine RIFF WAVE-Datei: -[FILE] - </notification> - <notification name="SoundFileNotPCM"> - Die Datei ist anscheinend keine PCM WAVE-Audiodatei: -[FILE] - </notification> - <notification name="SoundFileInvalidChannelCount"> - Die Datei hat eine ungültige Anzahl Tonkanäle (muss Mono oder Stereo sein): -[FILE] - </notification> - <notification name="SoundFileInvalidSampleRate"> - Die Sample-Rate dieser Datei wird nicht unterstützt (muss 44,1 K sein): -[FILE] - </notification> - <notification name="SoundFileInvalidWordSize"> - Die Word-Größe dieser Datei wird nicht unterstützt (muss 8 oder 16 Bit sein): -[FILE] - </notification> - <notification name="SoundFileInvalidHeader"> - „Daten“-Chunk in WAV-Header nicht gefunden: -[FILE] - </notification> - <notification name="SoundFileInvalidTooLong"> - Audiodatei ist zu lang (max. 10 Sekunden): -[FILE] - </notification> - <notification name="ProblemWithFile"> - Problem mit Datei [FILE]: - -[ERROR] - </notification> - <notification name="CannotOpenTemporarySoundFile"> - Temporäre komprimierte Sounddatei konnte nicht geöffnet werden: [FILE] - </notification> - <notification name="UnknownVorbisEncodeFailure"> - Unbekannter Vorbis-Kodierungsfehler in: [FILE] - </notification> - <notification name="CannotEncodeFile"> - Datei konnte nicht kodiert werden: [FILE] - </notification> - <notification name="CorruptResourceFile"> - Ressourcendatei beschädigt: [FILE] - </notification> - <notification name="UnknownResourceFileVersion"> - Unbekannte Linden-Ressourcenversion in Datei: [FILE] - </notification> - <notification name="UnableToCreateOutputFile"> - Ausgabedatei konnte nicht erstellt werden: [FILE] - </notification> - <notification name="DoNotSupportBulkAnimationUpload"> - Der Mehrfach-Upload von Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt. - </notification> - <notification name="CannotUploadReason"> - Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON] -Bitte versuchen Sie es erneut. - </notification> - <notification name="LandmarkCreated"> - „[LANDMARK_NAME]“ wurde zum Ordner „[FOLDER_NAME]“ hinzugefügt. - </notification> - <notification name="CannotCreateLandmarkNotOwner"> - Sie können hier keine Landmarke erstellen, da der Landeigentümer dies verboten hat. - </notification> - <notification name="CannotRecompileSelectObjectsNoScripts"> - „Rekompilieren“ nicht möglich. -Objekt mit Skript wählen. - </notification> - <notification name="CannotRecompileSelectObjectsNoPermission"> - „Rekompilieren“ nicht möglich. - -Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. - </notification> - <notification name="CannotResetSelectObjectsNoScripts"> - „Zurücksetzen“ nicht möglich. - -Wählen Sie Objekte mit Skripts. - </notification> - <notification name="CannotResetSelectObjectsNoPermission"> - „Zurücksetzen“ nicht möglich. - -Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. - </notification> - <notification name="CannotSetRunningSelectObjectsNoScripts"> - „Ausführen“ von Skripts nicht möglich. - -Wählen Sie Objekte mit Skripts. - </notification> - <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - „Deaktivieren“ von Skripts nicht möglich. - -Wählen Sie Objekte mit Skripts. - </notification> - <notification name="NoFrontmostFloater"> - Kein vorderster Floater zum Speichern. - </notification> - <notification name="SeachFilteredOnShortWords"> - Ihre Suchanfrage wurde geändert. -Zu kurze Begriffe wurden entfernt. - -Ihre Suchanfrage: [FINALQUERY] - </notification> - <notification name="SeachFilteredOnShortWordsEmpty"> - Ihre Suchbegriffe sind zu kurz. -Es wurde keine Suche durchgeführt. - </notification> - <notification name="CouldNotTeleportReason"> - Teleport fehlgeschlagen. -[REASON] - </notification> - <notification name="invalid_tport"> - Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - </notification> - <notification name="invalid_region_handoff"> - Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - </notification> - <notification name="blocked_tport"> - Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. -Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. - </notification> - <notification name="nolandmark_tport"> - Das System konnte das Landmarken-Ziel nicht finden. - </notification> - <notification name="timeout_tport"> - Das System konnte keine Teleport-Verbindung herstellen. -Versuchen Sie es später noch einmal. - </notification> - <notification name="noaccess_tport"> - Sie haben leider keinen Zugang zu diesem Teleport-Ziel. - </notification> - <notification name="missing_attach_tport"> - Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. - </notification> - <notification name="too_many_uploads_tport"> - Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. -Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. - </notification> - <notification name="expired_tport"> - Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="expired_region_handoff"> - Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="no_host"> - Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="no_inventory_host"> - Das Inventarsystem ist zurzeit nicht verfügbar. - </notification> - <notification name="CannotSetLandOwnerNothingSelected"> - Landeigentümer kann nicht festgelegt werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotSetLandOwnerMultipleRegions"> - Eine erzwungene Landübertragung ist nicht möglich, da die Auswahl mehrere Regionen umfasst. Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. - </notification> - <notification name="ForceOwnerAuctionWarning"> - Diese Parzelle steht zur Auktion. Eine zwangsweise Eigentumsübertragung beendet die Auktion und verärgert womöglich Einwohner, die bereits ein Gebot abgegeben haben. Eigentumsübertragung erzwingen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CannotContentifyNothingSelected"> - Inhaltsidentifizierung nicht möglich: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotContentifyNoRegion"> - Inhaltsidentifizierung nicht möglich: -Keine Region ausgewählt. - </notification> - <notification name="CannotReleaseLandNothingSelected"> - Land kann nicht aufgegeben werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotReleaseLandNoRegion"> - Land kann nicht aufgegeben werden: -Region nicht gefunden. - </notification> - <notification name="CannotBuyLandNothingSelected"> - Land kann nicht gekauft werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotBuyLandNoRegion"> - Land kann nicht gekauft werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotCloseFloaterBuyLand"> - Das Fenster „Land kaufen“ kann erst geschlossen werden, nachdem [APP_NAME] den Transaktionspreis geschätzt hat. - </notification> - <notification name="CannotDeedLandNothingSelected"> - Land kann nicht übertragen werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotDeedLandNoGroup"> - Land kann nicht übertragen werden: -Keine Gruppe ausgewählt. - </notification> - <notification name="CannotDeedLandNoRegion"> - Land kann nicht übertragen werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotDeedLandMultipleSelected"> - Land kann nicht übertragen werden: -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“ > „Audio & Video“ ä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. - -Bitte versuchen Sie es erneut. - </notification> - <notification name="CannotDeedLandNoTransfer"> - Land kann nicht übertragen werden: -Die Region [REGION] erlaubt keine Landübertragung. - </notification> - <notification name="CannotReleaseLandWatingForServer"> - Land kann nicht aufgegeben werden: -Server muss Parzelleninformation aktualisieren. - -Versuchen Sie es in einigen Sekunden erneut. - </notification> - <notification name="CannotReleaseLandSelected"> - Land kann nicht aufgegeben werden: -Die ausgewählten Parzellen gehören Ihnen nicht. - -Wählen Sie eine einzelne Parzelle. - </notification> - <notification name="CannotReleaseLandDontOwn"> - Land kann nicht aufgegeben werden: -Ihnen fehlt die Berechtigung zur Freigabe dieser Parzelle. -Parzellen, die Ihnen gehören, werden grün dargestellt. - </notification> - <notification name="CannotReleaseLandRegionNotFound"> - Land kann nicht aufgegeben werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotReleaseLandNoTransfer"> - Land kann nicht aufgegeben werden: -Die Region [REGION] erlaubt keine Landübertragung. - </notification> - <notification name="CannotReleaseLandPartialSelection"> - Land kann nicht aufgegeben werden: -Zum Freigeben müssen Sie eine ganze Parzelle auswählen. - -Wählen Sie eine ganze Parzelle oder teilen Sie Ihre Parzelle. - </notification> - <notification name="ReleaseLandWarning"> - Sie sind im Begriff, [AREA] qm Land aufzugeben. -Wenn Sie diese Parzelle aufgeben, wird sie ohne L$-Erstattung von Ihrem Landbesitz entfernt. - -Dieses Land aufgeben? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNothingSelected"> - Land kann nicht aufgeteilt werden: - -Keine Parzellen ausgewählt. - </notification> - <notification name="CannotDivideLandPartialSelection"> - Land kann nicht aufgeteilt werden: - -Sie haben eine ganze Parzelle ausgewählt. -Wählen Sie einen Parzellenabschnitt aus. - </notification> - <notification name="LandDivideWarning"> - Wenn Sie dieses Land teilen, wird diese Parzelle in zwei geteilt, jede mit ihren eigenen Einstellungen. Einige dieser Einstellungen werden aufgrund dieses Vorgangs zurückgesetzt. - -Land teilen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNoRegion"> - Land kann nicht aufgeteilt werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotJoinLandNoRegion"> - Land kann nicht zusammengelegt werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotJoinLandNothingSelected"> - Land kann nicht zusammengelegt werden: -Keine Parzellen ausgewählt. - </notification> - <notification name="CannotJoinLandEntireParcelSelected"> - Land kann nicht zusammengelegt werden: -Sie haben nur eine Parzelle ausgewählt. - -Wählen Sie Land auf beiden Parzellen aus. - </notification> - <notification name="CannotJoinLandSelection"> - Land kann nicht zusammengelegt werden: -Sie müssen mehrere Parzellen auswählen. - -Wählen Sie Land auf beiden Parzellen aus. - </notification> - <notification name="JoinLandWarning"> - Beim Zusammenlegen entsteht aus den vom Auswahlrechteck -erfassten Parzellen eine große Parzelle. -Sie müssen der neuen Parzelle einen Namen geben und ihre Optionen festlegen. - -Land zusammenlegen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmNotecardSave"> - Um das Objekt kopieren oder anzeigen zu können, müssen Sie zuerst diese Notizkarte speichern. Notizkarte speichern? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmItemCopy"> - Dieses Objekt in Ihr Inventar kopieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Kopieren"/> - </notification> - <notification name="ResolutionSwitchFail"> - Auflösung konnte nicht auf [RESX] x [RESY] gesetzt werden - </notification> - <notification name="ErrorUndefinedGrasses"> - Fehler: Nicht definierte Gräser: [SPECIES] - </notification> - <notification name="ErrorUndefinedTrees"> - Fehler: Nicht definierte Bäume: [SPECIES] - </notification> - <notification name="CannotSaveWearableOutOfSpace"> - „[NAME]“ konnte nicht in Kleidungsdatei gespeichert werden. Geben Sie Speicherplatz auf dem Computer frei und speichern Sie das Kleidungsstück erneut. - </notification> - <notification name="CannotSaveToAssetStore"> - [NAME] kann nicht in Zentral-Asset-Speicher geladen werden. -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: - [MESSAGE] -Klicken Sie auf „IM & Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Klicken Sie andernfalls auf „Beenden“, um [APP_NAME] sofort zu beenden. - <usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM & Chat anzeigen"/> - </notification> - <notification name="OnlyOfficerCanBuyLand"> - Landkauf für Gruppe nicht möglich: -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. - -[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. - -[NAME] Freundschaft anbieten? - <form name="form"> - <input name="message"> - Wollen wir Freunde sein? - </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"/> - </notification> - <notification name="RemoveMultipleFromFriends"> - Möchten Sie mehrere Freunde aus Ihrer Freundesliste entfernen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedPublicObjectsByUser"> - Möchten Sie alle geskripteten Objekte von -** [AVATAR_NAME] ** -auf allen anderen Ländern in diesem Sim löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedObjectsByUser"> - Möchten Sie ALLE geskripteten Objekte von -** [AVATAR_NAME] ** -auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GodDeleteAllObjectsByUser"> - Möchten Sie ALLE Objekte (einschließlich geskriptete) von -** [AVATAR_NAME] ** -auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BlankClassifiedName"> - Geben Sie einen Namen für die Anzeige ein. - </notification> - <notification name="MinClassifiedPrice"> - Der Mindestbetrag für die Listung ist [MIN_PRICE] L$. - -Geben sie einen höheren Betrag ein. - </notification> - <notification name="ConfirmObjectDeleteLock"> - Mindestens ein ausgewähltes Objekt ist gesperrt. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopy"> - Mindestens ein ausgewähltes Objekt kann nicht kopiert werden. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoOwn"> - Mindestens eines der ausgewählten Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopy"> - Mindestens ein Objekt ist gesperrt. -Mindestens ein Objekt kann nicht kopiert werden. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoOwn"> - Mindestens ein Objekt ist gesperrt. -Mindestens ein Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Mindestens ein Objekt kann nicht kopiert werden. -Mindestens ein Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - Mindestens ein Objekt ist gesperrt. -Mindestens ein Objekt kann nicht kopiert werden. -Mindestens ein Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLock"> - Mindestens ein Objekt ist gesperrt. - -Möchten Sie diese Objekte nehmen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeNoOwn"> - Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. -Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer angewandt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. - -Möchten Sie diese Objekte nehmen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLockNoOwn"> - Mindestens ein Objekt ist gesperrt. -Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. -Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer abgefragt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. -Die aktuelle Auswahl können Sie jedoch aufnehmen. - -Möchten Sie diese Objekte nehmen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CantBuyLandAcrossMultipleRegions"> - Landkauf nicht möglich, da die Auswahl mehrere Regionen umfasst. - -Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. - </notification> - <notification name="DeedLandToGroup"> - Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. -Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. - -Der Gruppe „[GROUP_NAME]“ - [AREA] m² Land schenken? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DeedLandToGroupWithContribution"> - Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. -Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[FIRST_NAME] [LAST_NAME]“. -Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. - -Der Gruppe „[GROUP_NAME]“ - [AREA] m² Land schenken? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DisplaySetToSafe"> - Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde. - </notification> - <notification name="DisplaySetToRecommended"> - Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt. - </notification> - <notification name="ErrorMessage"> - [ERROR_MESSAGE] - </notification> - <notification name="AvatarMovedDesired"> - Ihr gewünschter Zielort ist zurzeit nicht verfügbar. -Sie wurden zur nächstgelegenen Region teleportiert. - </notification> - <notification name="AvatarMovedLast"> - Ihr letzter Standort ist zurzeit nicht verfügbar. -Sie wurden zur nächstgelegenen Region teleportiert. - </notification> - <notification name="AvatarMovedHome"> - Ihr Heimatort ist zurzeit nicht verfügbar. -Sie wurden zur nächstgelegenen Region teleportiert. -Sie müssen eventuell einen neuen Heimatort festlegen. - </notification> - <notification name="ClothingLoading"> - Ihre Kleidung wird noch heruntergeladen. -Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen. - <form name="form"> - <ignore name="ignore" text="Das Herunterladen der Kleidung dauert lange"/> - </form> - </notification> - <notification name="FirstRun"> - Die Installation von [APP_NAME] ist abgeschlossen. - -Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können. -Möchten Sie auf www.secondlife.com ein Konto erstellen? - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/> - </notification> - <notification name="LoginPacketNeverReceived"> - Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID]. - -Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen, oder klicken Sie auf Teleportieren, um nach Hause zu teleportieren. - <url name="url"> - http://de.secondlife.com/support/ - </url> - <form name="form"> - <button name="OK" text="OK"/> - <button name="Help" text="Hilfe"/> - <button name="Teleport" text="Teleportieren"/> - </form> - </notification> - <notification name="WelcomeChooseSex"> - Ihr Avatar erscheint jeden Moment. - -Benutzen Sie die Pfeiltasten, um sich fortzubewegen. -Drücken Sie F1 für Hilfe oder für weitere Informationen über [SECOND_LIFE]. -Bitte wählen Sie einen männlichen oder weiblichen Avatar. -Sie können sich später noch umentscheiden. - <usetemplate name="okcancelbuttons" notext="Weiblich" yestext="Männlich"/> - </notification> - <notification name="NotEnoughCurrency"> - [NAME] [PRICE] L$ Sie haben nicht genügend L$, um diese Aktion auszuführen. - </notification> - <notification name="GrantedModifyRights"> - [FIRST_NAME] [LAST_NAME] hat Ihnen die Erlaubnis erteilt, ihre/seine Objekte zu bearbeiten. - </notification> - <notification name="RevokedModifyRights"> - Ihnen wurden die Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME] entzogen. - </notification> - <notification name="FlushMapVisibilityCaches"> - Der Kartencache dieser Region wird geleert. -Diese Aktion ist nur beim Debugging sinnvoll. -(Auf dem Produktionssystem warten Sie einfach 5 Minuten. Die Karten werden nach erneuter Anmeldung automatisch aktualisiert.) - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyOneObjectOnly"> - Sie können jeweils nur ein Objekt kaufen. Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification name="OnlyCopyContentsOfSingleItem"> - Es kann nur jeweils der Inhalt von einem Objekt kopiert werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="KickUsersFromRegion"> - Alle Einwohner in dieser Region nach Hause teleportieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="EstateObjectReturn"> - Möchten Sie wirklich alle Objekte zurückgeben, die [USER_NAME] gehören? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="InvalidTerrainBitDepth"> - Die Regionstexturen konnten nicht festgelegt werden: -Die Terraintextur [TEXTURE_NUM] hat eine ungültige Bit-Tiefe [TEXTURE_BIT_DEPTH]. - -Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. - </notification> - <notification name="InvalidTerrainSize"> - Die Regionstexturen konnten nicht festgelegt werden: -Die Terraintextur [TEXTURE_NUM] ist mit [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] zu groß. - -Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. - </notification> - <notification name="RawUploadStarted"> - Hochladen gestartet. Je nach Verbindungsgeschwindigkeit kann der Vorgang bis zu 2 Minuten dauern. - </notification> - <notification name="ConfirmBakeTerrain"> - Möchten Sie das aktuelle Terrain formen, es zum Mittelpunkt der oberen und unteren Terraingrenzen und zum Standard des „Zurücksetzen“-Tools machen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="MaxAllowedAgentOnRegion"> - Es sind maximal [MAX_AGENTS] zulässige Einwohner erlaubt. - </notification> - <notification name="MaxBannedAgentsOnRegion"> - Es sind maximal [MAX_BANNED] verbannte Einwohner erlaubt. - </notification> - <notification name="MaxAgentOnRegionBatch"> - Fehler beim Versuch, [NUM_ADDED] Agenten hinzuzufügen: -Überschreitet den Grenzwert [MAX_AGENTS] [LIST_TYPE] um [NUM_EXCESS]. - </notification> - <notification name="MaxAllowedGroupsOnRegion"> - Es sind maximal [MAX_GROUPS] zulässige Gruppen erlaubt. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Formen"/> - </notification> - <notification name="MaxManagersOnRegion"> - 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. - </notification> - <notification name="CanNotChangeAppearanceUntilLoaded"> - Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind. - </notification> - <notification name="ClassifiedMustBeAlphanumeric"> - Der Name der Anzeige muss mit einem Buchstaben von A bis Z oder einer Ziffer beginnen. Satzzeichen sind nicht erlaubt. - </notification> - <notification name="CantSetBuyObject"> - „Objekt kaufen“ nicht möglich, da das Objekt nicht zum Verkauf freigegeben ist. -Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut. - </notification> - <notification name="FinishedRawDownload"> - Raw-Terrain-Datei wurde heruntergeladen nach: -[DOWNLOAD_PATH]. - </notification> - <notification name="DownloadWindowsMandatory"> - Eine neue Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. - <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> - </notification> - <notification name="DownloadWindows"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadWindowsReleaseForDownload"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadLinuxMandatory"> - Eine neue Version von [SUPPORT_SITE] ist verfügbar. -[MESSAGE] -Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. - <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> - </notification> - <notification name="DownloadLinux"> - Eine neue Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadLinuxReleaseForDownload"> - Eine neue Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadMacMandatory"> - Eine neue Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. - -In Ihren Anwendungsordner herunterladen? - <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> - </notification> - <notification name="DownloadMac"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - -In Ihren Anwendungsordner herunterladen? - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadMacReleaseForDownload"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - -In Ihren Anwendungsordner herunterladen? - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DeedObjectToGroup"> - Bei Übertragung dieses Objekts erhält die Gruppe: -* An das Objekt bezahlte L$ - <usetemplate ignoretext="Bestätigen, bevor ich ein Objekt an eine Gruppe übertrage" name="okcancelignore" notext="Abbrechen" yestext="Übertragung"/> - </notification> - <notification name="WebLaunchExternalTarget"> - Möchten Sie Ihren Internetbrowser öffnen, um diesen Inhalt anzuzeigen? - <usetemplate ignoretext="Meinen Browser starten, um eine Webseite anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchJoinNow"> - de.secondlife.com öffnen, um Ihr Konto zu verwalten? - <usetemplate ignoretext="Meinen Browser starten, um mein Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchSecurityIssues"> - Informieren Sie sich im [SECOND_LIFE] Wiki, wie man Sicherheitsprobleme richtig meldet. - <usetemplate ignoretext="Meinen Browser starten, um anzuzeigen, wie ein Sicherheitsproblem gemeldet werden soll" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchQAWiki"> - Besuchen Sie das [SECOND_LIFE] QA-Wiki. - <usetemplate ignoretext="Meinen Browser starten, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchPublicIssue"> - Im [SECOND_LIFE] Allgemeine-Fragen-Tracker können Sie Fehler und andere Probleme melden. - <usetemplate ignoretext="Meinen Browser starten, um die Datenbank für Fehler und Verbesserungsvorschläge anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="WebLaunchSupportWiki"> - Im offiziellen Linden-Blog finden Sie die neuesten Nachrichten und Informationen. - <usetemplate ignoretext="Meinen Browser starten, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLGuide"> - Möchten Sie den Scripting Guide öffnen? - <usetemplate ignoretext="Meinen Browser starten, um den Scripting Guide anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLWiki"> - Möchten Sie das LSL-Portal besuchen? - <usetemplate ignoretext="Meinen Browser starten, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="ReturnToOwner"> - Möchten Sie die ausgewählten Objekte an ihre Eigentümer zurückgeben? Transferierbare übertragene Objekte werden ihren früheren Eigentümern zurückgegeben. - -*WARNUNG* Nicht transferierbare übertragene Objekte werden dabei gelöscht! - <usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GroupLeaveConfirmMember"> - Sie sind Mitglied der Gruppe [GROUP]. -Diese Gruppe verlassen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmKick"> - Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/> - </notification> - <notification name="MuteLinden"> - Lindens können nicht stummgeschaltet werden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotStartAuctionAlreadyForSale"> - Eine Parzelle, die bereits zum Verkauf freigegeben ist, kann nicht versteigert werden. Deaktivieren Sie den Landverkauf, wenn Sie das Land zur Versteigerung freigeben möchten. - </notification> - <notification label="Objekt nach Name stummschalten fehlgeschlagen" name="MuteByNameFailed"> - Dieser Name ist bereits stummgeschaltet. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RemoveItemWarn"> - Diese Aktion ist zwar erlaubt, aber beim Löschen von Inhalten wird das Objekt beschädigt. Möchten Sie dieses Element löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CantOfferCallingCard"> - Sie können gerade keine Visitenkarte übergeben. Warten Sie kurz und versuchen Sie es dann noch einmal. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CantOfferFriendship"> - Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="BusyModeSet"> - Beschäftigt-Modus ist aktiviert. -Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben. - <usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/> - </notification> - <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="KickUser"> - Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie wurden von einem Administrator abgemeldet. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="KickAllUsers"> - Beim Hinauswerfen aller Personen vom Grid welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie wurden von einem Administrator abgemeldet. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="FreezeUser"> - Beim Einfrieren dieses Benutzers welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie wurden eingefroren. Bewegen oder Chatten ist nicht mehr möglich. Ein Administrator wird sich über IM an Sie wenden - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="UnFreezeUser"> - Beim Auftauen dieses Benutzers welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie sind nicht mehr eingefroren. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="OfferTeleport"> - Teleport an Ihre Position mit der folgenden Meldung anbieten? - <form name="form"> - <input name="message"> - Triff mich in [REGION] - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="OfferTeleportFromGod"> - Benutzer an Ihrem Standort herbeirufen? - <form name="form"> - <input name="message"> - Triff mich in [REGION] - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="TeleportFromLandmark"> - Möchten Sie sich wirklich teleportieren? - <usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> - </notification> - <notification name="TeleportToPick"> - Nach [PICK] teleportieren? - <usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Auswahl 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. - <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. - -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. - -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> - <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> - <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> - <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> - <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> - <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> - <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> - <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> - <notification label="Rauswurf bestätigen" name="EstateKickUser"> - Benutzer [EVIL_USER] von diesem Grundstück werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="EstateChangeCovenant"> - Möchten Sie den Grundstücksvertrag wirklich ändern? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked"> - Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. - -Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked_KB"> - Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. - -Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? - <url name="url"> - http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) - </url> - <usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="RegionEntryAccessBlocked_Notify"> - 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. - -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. - <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="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. - -Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandClaimAccessBlocked_KB"> - Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. - -Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? - <url name="url"> - http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) - </url> - <usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="LandClaimAccessBlocked_Notify"> - Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. - </notification> - <notification name="LandClaimAccessBlocked_Change"> - Sie haben aufgrund der Einstellung Ihrer Alterseinstufung keinen Anspruch auf dieses Land. - -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. - <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich auf Land Anspruch erhebe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> - </notification> - <notification name="LandBuyAccessBlocked"> - Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. - -Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandBuyAccessBlocked_KB"> - Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. - -Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? - <url name="url"> - http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) - </url> - <usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="LandBuyAccessBlocked_Notify"> - Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. - </notification> - <notification name="LandBuyAccessBlocked_Change"> - Sie können aufgrund Ihrer Einstellung für Alterseinstufung dieses Land nicht kaufen. - -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. - <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich Land kaufe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> - </notification> - <notification name="TooManyPrimsSelected"> - "Zu viele Prims wurden ausgewählt. Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut." - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemImportingEstateCovenant"> - Problem beim Import des Grundstückvertrags. - <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. - </notification> - <notification name="ProblemAddingEstateGeneric"> - Problem beim Hinzufügen zu dieser Grundstücksliste. Bei mindestens einem Grundstück ist die Liste voll. - </notification> - <notification name="UnableToLoadNotecardAsset"> - Notizkarten-Asset konnte nicht geladen werden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="NotAllowedToViewNotecard"> - Unzureichende Rechte, um die mit der angeforderten Asset-ID verbundene Notizkarte anzuzeigen. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MissingNotecardAssetID"> - Asset-ID für Notizkarte fehlt in Datenbank. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PublishClassified"> - Hinweis: Anzeigengebühren werden nicht zurückerstattet. - -Anzeige für [AMOUNT] L$ veröffentlichen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SetClassifiedMature"> - Enthält diese Anzeige Mature-Inhalte? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="SetGroupMature"> - Beschäftigt sich diese Gruppe mit Mature-Inhalten? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification label="Neustart bestätigen" name="ConfirmRestart"> - Möchten Sie diese Region in 2 Minuten neu starten? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification label="Nachricht an alle in dieser Region" name="MessageRegion"> - Geben Sie eine kurze Nachricht ein, die an jede Person in dieser Region gesendet wird. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification label="Alterseinstufung der Region ändern" name="RegionMaturityChange"> - Die Alterseinstufung dieser Region wurde aktualisiert. -Es kann eine Weile dauern, bis sich die Änderung auf die Karte auswirkt. - </notification> - <notification label="Falsche Voice-Version" name="VoiceVersionMismatch"> - Diese Version von [APP_NAME] mit dem Voice-Chat-Feature in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren. - </notification> - <notification label="Objekte können nicht gekauft werden" name="BuyObjectOneOwner"> - Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOnly"> - Inhalte können jeweils nur für ein Objekt gekauft werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOwner"> - Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification name="BuyOriginal"> - Von [OWNER] Originalobjekt für [PRICE] L$ kaufen? -Sie werden der Eigentümer dieses Objekts. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyOriginalNoOwner"> - Originalobjekt für [PRICE] L$ kaufen? -Sie werden der Eigentümer dieses Objekts. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyCopy"> - Von [OWNER] Kopie für [PRICE] L$ kaufen? -Das Objekt wird in Ihr Inventar kopiert. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyCopyNoOwner"> - Kopie für [PRICE] L$ kaufen? -Das Objekt wird in Ihr Inventar kopiert. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyContents"> - Von [OWNER] Inhalte für [PRICE] L$ kaufen? -Die Inhalte werden in Ihr Inventar kopiert. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyContentsNoOwner"> - Inhalte für [PRICE] L$ kaufen? -Die Inhalte werden in Ihr Inventar kopiert. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmPurchase"> - Transaktion: -[ACTION] - -Möchten Sie diesen Kauf fortsetzen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmPurchasePassword"> - Transaktion: -[ACTION] - -Möchten Sie diesen Kauf fortsetzen? -Geben Sie Ihr Kennwort erneut ein und klicken Sie auf OK. - <form name="form"> - <input name="message"/> - <button name="ConfirmPurchase" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="SetPickLocation"> - Hinweis: -Sie haben die Position dieser Auswahl aktualisiert, aber die anderen Daten behalten ihre ursprünglichen Werte. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromObject"> - Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. -Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. - -Inventarobjekt(e) verschieben? - <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht kopierbare Artikel aus einem Objekt verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromScriptedObject"> - Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. -Da es sich um ein geskriptetes Objekt handelt, geht die Skriptfunktion beim Verschieben in das Inventar möglicherweise verloren. - -Inventarobjekt(e) verschieben? - <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht-kopierbare Artikel verschiebe, die ein geskriptetes Objekt beschädigen können" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <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."/> - </form> - </notification> - <notification name="OpenObjectCannotCopy"> - Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt. - </notification> - <notification name="WebLaunchAccountHistory"> - de.secondlife.com öffnen, um Ihre Konto-Statistik anzuzeigen? - <usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="ConfirmQuit"> - Wirklich beenden? - <usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/> - </notification> - <notification name="HelpReportAbuseEmailLL"> - Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php - -Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen: - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - WICHTIG: Diese Meldung wird an den Eigentümer der Region gesendet, in der Sie sich gerade befinden, nicht an Linden Lab. -- -Als besonderen Service für Einwohner und Besucher übernimmt der Eigentümer dieser Region die Bearbeitung aller anfallenden Meldungen. Von diesem Standort aus eingereichte Meldungen werden nicht von Linden Lab bearbeitet. Der Eigentümer der Region bearbeitet Meldungen auf Grundlage der Richtlinien, die im für diese Region geltenden Grundstücksvertrag festgelegt sind. -(Den Vertrag können Sie unter „Welt“ > „Land-Info“ einsehen.) -- -Das Resultat, das sich aus dieser Meldung ergibt, betrifft nur diese Region; der Einwohnerzugang zu anderen Bereichen von [SECOND_LIFE] ist davon nicht betroffen. Nur Linden Lab kann den Zugang zu [SECOND_LIFE] beschränken. - </notification> - <notification name="HelpReportAbuseSelectCategory"> - Wählen Sie eine Missbrauchskategorie aus. -Die Angabe einer Kategorie hilft uns bei der Bearbeitung des Berichts. - </notification> - <notification name="HelpReportAbuseAbuserNameEmpty"> - Geben Sie den Namen des Täters ein. -Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseAbuserLocationEmpty"> - Bitte geben Sie den Ort an, an dem der Missbrauch stattgefunden hat. -Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseSummaryEmpty"> - Bitte geben Sie eine Zusammenfassung des Vorfalls ein. -Eine genaue Zusammenfassung hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseDetailsEmpty"> - Bitte geben Sie eine ausführliche Beschreibung des Vorfalls ein. -Eine möglichst genaue Beschreibung mit Namen und Einzelheiten hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseContainsCopyright"> - Sehr geehrte(r) Einwohner(in), - -Sie melden eine Urheberrechtsverletzung. Sind Sie wirklich sicher, dass Sie eine Verletzung des Urheberrechts melden möchten? - -1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht etwaige Verstöße gegen die [SECOND_LIFE] Community Standards oder die Nutzungsbedingungen und verhängt entsprechende Strafen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen. - -2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÜSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter http://secondlife.com/corporate/dmca.php dargelegten Anweisungen einreichen. - -Wenn Sie mit der Missbrauchmeldung jetzt fortfahren möchten, schließen Sie bitte dieses Fenster und senden Sie Ihren Bericht ein. Möglicherweise müssen Sie Kategorie „CopyBot oder Berechtigungs-Exploit“ auswählen. - -Vielen Dank, - -Linden Lab - </notification> - <notification name="FailedRequirementsCheck"> - Die folgenden erforderlichen Komponenten fehlen in [FLOATER]: -[COMPONENTS] - </notification> - <notification label="Vorhandenen Anhang ersetzen" name="ReplaceAttachment"> - An dieser Körperstelle ist bereits ein Objekt angebracht. -Möchten Sie es mit dem ausgewählten Objekt ersetzen? - <form name="form"> - <ignore name="ignore" save_option="true" text="Einen bestehenden Anhang mit dem ausgewählten Artikel ersetzen"/> - <button ignore="Automatisch ersetzen" name="Yes" text="OK"/> - <button ignore="Nie ersetzen" name="No" text="Abbrechen"/> - </form> - </notification> - <notification label="Beschäftigt-Modus-Warnung" name="BusyModePay"> - Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können. - -Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen? - <form name="form"> - <ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/> - <button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/> - <button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/> - </form> - </notification> - <notification name="ConfirmEmptyTrash"> - Sind Sie sicher, dass Sie den Inhalt Ihres Papierkorbs löschen möchten? - <usetemplate ignoretext="Bestätigen, bevor der Ordner Papierkorb im Inventar geleert wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmClearBrowserCache"> - Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="ConfirmClearCookies"> - Sind Sie sicher, dass Sie Ihre Cookies löschen möchten? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="ConfirmClearMediaUrlList"> - Die Liste mit gespeicherten URLs wirklich löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="ConfirmEmptyLostAndFound"> - Sind Sie sicher, dass Sie den Inhalt Ihres Ordners Fundbüro löschen möchten? - <usetemplate ignoretext="Bestätigen, bevor der Ordner Fundbüro im Inventar geleert wird" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="CopySLURL"> - Die folgende SLurl wurde in die Zwischenablage kopiert: - [SLURL] - -Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dieser Position zu ermöglichen. Oder versuchen Sie es selbst: kopieren Sie die SLurl in die Adressleiste eines Webbrowsers. - <form name="form"> - <ignore name="ignore" text="Slurl wurde in meine Zwischenablage kopiert"/> - </form> - </notification> - <notification name="WLSavePresetAlert"> - Die gespeicherte Voreinstellung überschreiben? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="WLDeletePresetAlert"> - [SKY] löschen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="WLNoEditDefault"> - Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. - </notification> - <notification name="WLMissingSky"> - Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY]. - </notification> - <notification name="PPSaveEffectAlert"> - Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="NewSkyPreset"> - Wählen Sie einen Namen für den neuen Himmel. - <form name="form"> - <input name="message"> - Neue Voreinstellung - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="ExistsSkyPresetAlert"> - Voreinstellung bereits vorhanden! - </notification> - <notification name="NewWaterPreset"> - Wählen Sie einen Namen für die neue Wasservoreinstellung. - <form name="form"> - <input name="message"> - Neue Voreinstellung - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="ExistsWaterPresetAlert"> - Voreinstellung bereits vorhanden! - </notification> - <notification name="WaterNoEditDefault"> - Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. - </notification> - <notification name="ChatterBoxSessionStartError"> - Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ChatterBoxSessionEventError"> - [EVENT] -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ForceCloseChatterBoxSession"> - Ihre Chat-Sitzung mit [NAME] muss beendet werden. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="Cannot_Purchase_an_Attachment"> - Sie können kein Objekt kaufen, während es angehängt ist. - </notification> - <notification label="Info zur Abfrage der Abbucherlaubnis" name="DebitPermissionDetails"> - Wenn Sie dieser Anfrage zustimmen, erhält das Skript die Erlaubnis, regelmäßig Linden-Dollar (L$) von Ihrem Konto abzubuchen. Diese Erlaubnis kann nur zurückgezogen werden, wenn der Eigentümer das Objekt löscht oder die Skripts in dem Objekt zurücksetzt. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AutoWearNewClothing"> - Möchten Sie das neu erstellte Kleidungsstück automatisch anziehen? - <usetemplate ignoretext="Die Kleidung, die während dem Bearbeiten meines Aussehens erstellt wird, sofort anziehen" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="NotAgeVerified"> - Sie müssen altersüberprüft sein, um diesen Bereich betreten zu können. Möchten Sie auf der [SECOND_LIFE]-Webseite Ihr Alter verifizieren lassen? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/verification.php?lang=de - </url> - <usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="Cannot enter parcel: no payment info on file"> - Um diesen Bereich besuchen zu können, müssen Ihre Zahlungsinformationen gespeichert sein. Möchten Sie diese Einstellung auf der [SECOND_LIFE]-Webseite einrichten? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/index.php?lang=de - </url> - <usetemplate ignoretext="Meine Zahlungsinformation ist nicht gespeichert" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="MissingString"> - Der String „[STRING_NAME]“ fehlt in strings.xml - </notification> - <notification name="SystemMessageTip"> - [MESSAGE] - </notification> - <notification name="Cancelled"> - Abgebrochen - </notification> - <notification name="CancelledSit"> - Sitzen beendet - </notification> - <notification name="CancelledAttach"> - Anhängen abgebrochen - </notification> - <notification name="ReplacedMissingWearable"> - Fehlende(s) Kleidung/Körperteil mit Standard ersetzt. - </notification> - <notification name="GroupNotice"> - Betreff: [SUBJECT], Nachricht: [MESSAGE] - </notification> - <notification name="FriendOnline"> - [FIRST] [LAST] ist online - </notification> - <notification name="FriendOffline"> - [FIRST] [LAST] ist offline - </notification> - <notification name="AddSelfFriend"> - Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen. - </notification> - <notification name="UploadingAuctionSnapshot"> - In-Welt- und Website-Fotos werden hochgeladen... -(Dauert ca. 5 Minuten.) - </notification> - <notification name="UploadPayment"> - Sie haben für das Hochladen [AMOUNT] L$ bezahlt. - </notification> - <notification name="UploadWebSnapshotDone"> - Das Website-Foto wurde hochgeladen. - </notification> - <notification name="UploadSnapshotDone"> - In-Welt-Foto hochgeladen - </notification> - <notification name="TerrainDownloaded"> - Terrain.raw heruntergeladen - </notification> - <notification name="GestureMissing"> - Geste [NAME] fehlt in Datenbank. - </notification> - <notification name="UnableToLoadGesture"> - Geste [NAME] konnte nicht geladen werden. -Bitte versuchen Sie es erneut. - </notification> - <notification name="LandmarkMissing"> - Landmarke fehlt in Datenbank. - </notification> - <notification name="UnableToLoadLandmark"> - Landmarke konnte nicht geladen werden. Bitte versuchen Sie es erneut. - </notification> - <notification name="CapsKeyOn"> - Die Umschalttaste ist aktiv. -Dies kann die Eingabe Ihres Passworts beeinflussen. - </notification> - <notification name="NotecardMissing"> - Notizkarte fehlt in Datenbank. - </notification> - <notification name="NotecardNoPermissions"> - Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte. - </notification> - <notification name="RezItemNoPermissions"> - Keine Berechtigung zum Rezzen von Objekten. - </notification> - <notification name="UnableToLoadNotecard"> - Notizkarten-Asset konnte nicht geladen werden. - </notification> - <notification name="ScriptMissing"> - Skript fehlt in Datenbank. - </notification> - <notification name="ScriptNoPermissions"> - Unzureichende Rechte zur Anzeige des Skripts. - </notification> - <notification name="UnableToLoadScript"> - Skript konnte nicht geladen werden. Bitte versuchen Sie es erneut. - </notification> - <notification name="IncompleteInventory"> - Die von Ihnen angebotenen Inhalte sind noch nicht vollständig lokal verfügbar. Warten Sie kurz und wiederholen Sie dann das Angebot. - </notification> - <notification name="CannotModifyProtectedCategories"> - Geschützte Kategorien können nicht geändert werden. - </notification> - <notification name="CannotRemoveProtectedCategories"> - Geschützte Kategorien können nicht entfernt werden. - </notification> - <notification name="OfferedCard"> - Sie haben [FIRST] [LAST] eine Visitenkarte angeboten. - </notification> - <notification name="UnableToBuyWhileDownloading"> - Kauf nicht möglich. Objektdaten werden noch geladen. -Bitte versuchen Sie es erneut. - </notification> - <notification name="UnableToLinkWhileDownloading"> - Verknüpfung nicht möglich. Objektdaten werden noch geladen. -Bitte versuchen Sie es erneut. - </notification> - <notification name="CannotBuyObjectsFromDifferentOwners"> - Sie können nur von einem Eigentümer auf einmal Objekte kaufen. -Wählen Sie ein einzelnes Objekt aus. - </notification> - <notification name="ObjectNotForSale"> - Dieses Objekt wird nicht verkauft. - </notification> - <notification name="EnteringGodMode"> - Gott-Modus aktiviert, Level [LEVEL] - </notification> - <notification name="LeavingGodMode"> - Gott-Modus wird nun de-aktiviert, Level [LEVEL] - </notification> - <notification name="CopyFailed"> - Ihnen fehlt die Berechtigung zum Kopieren. - </notification> - <notification name="InventoryAccepted"> - [NAME] hat Ihr Inventarangebot akzeptiert. - </notification> - <notification name="InventoryDeclined"> - [NAME] hat Ihr Inventarangebot abgelehnt. - </notification> - <notification name="ObjectMessage"> - [NAME]: [MESSAGE] - </notification> - <notification name="CallingCardAccepted"> - Ihre Visitenkarte wurde akzeptiert. - </notification> - <notification name="CallingCardDeclined"> - Ihre Visitenkarte wurde abgelehnt. - </notification> - <notification name="TeleportToLandmark"> - Jetzt, nachdem Sie das Mainland erreicht haben, können Sie sich an Positionen wie „[NAME]“ teleportieren, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Landmarken“ auswählen. -Klicken Sie eine Landmarke doppelt an und wählen Sie „Teleportieren“, um an diesen Ort zu gelangen. - </notification> - <notification name="TeleportToPerson"> - Jetzt, nachdem Sie das Mainland erreicht haben, können Sie mit Einwohnern wie „[NAME]“ Kontakt aufnehmen, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Visitenkarten“ auswählen. -Klicken Sie die Karte doppelt an, wählen Sie „Instant Message“ und geben Sie eine Nachricht ein. - </notification> - <notification name="CantSelectLandFromMultipleRegions"> - Land kann nicht über Servergrenzen hinweg ausgewählt werden. -Wählen Sie eine kleinere Landfläche. - </notification> - <notification name="SearchWordBanned"> - 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 (PG, Mature oder Adult). - </notification> - <notification name="GroupVote"> - [NAME] hat eine Abstimmung vorgeschlagen über: -[MESSAGE] - <form name="form"> - <button name="VoteNow" text="Abstimmen"/> - <button name="Later" text="Später"/> - </form> - </notification> - <notification name="SystemMessage"> - [MESSAGE] - </notification> - <notification name="EventNotification"> - Event-Benachrichtigung: - -[NAME] -[DATE] - <form name="form"> - <button name="Teleport" text="Teleportieren"/> - <button name="Description" text="Beschreibung"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="TransferObjectsHighlighted"> - Alle Objekte auf dieser Parzelle, die an den Käufer der Parzelle übertragen werden, sind jetzt markiert. - -* Übertragene Bäume und Gräser sind nicht markiert. - <form name="form"> - <button name="Done" text="Fertig"/> - </form> - </notification> - <notification name="DeactivatedGesturesTrigger"> - Gesten mit demselben Trigger wurden deaktiviert: -[NAMES] - </notification> - <notification name="NoQuickTime"> - Apple QuickTime ist auf Ihrem System anscheinend nicht installiert. -Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktime) herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben. - </notification> - <notification name="NoPlugin"> - Es wurde kein Medien-Plugin gefunden, das "[MIME_TYPE]" ausführen kann. Medien dieses Dateityps sind nicht verfügbar. - </notification> - <notification name="MediaPluginFailed"> - Bei folgendem Plugin ist ein Fehler aufgetreten: - [PLUGIN] - -Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kontaktieren Sie bitte den Hersteller. - <form name="form"> - <ignore name="ignore" text="Ein Plugin kann nicht ausgeführt werden"/> - </form> - </notification> - <notification name="OwnedObjectsReturned"> - Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert. - </notification> - <notification name="OtherObjectsReturned"> - Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert. - </notification> - <notification name="OtherObjectsReturned2"> - Die Objekte von [FIRST] [LAST] auf dieser -Parzelle von „[NAME]“ wurden an ihren Eigentümer zurückgegeben. - </notification> - <notification name="GroupObjectsReturned"> - Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert. -Transferierbare übertragene Objekte wurden an ihre früheren Eigentümer zurückgegeben. -Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht. - </notification> - <notification name="UnOwnedObjectsReturned"> - Alle Objekte auf der ausgewählten Parzelle, die NICHT Ihnen gehören, wurden ihren Eigentümern zurückgegeben. - </notification> - <notification name="NotSafe"> - Auf diesem Land ist Schaden aktiviert. -Verletzungen sind möglich. Wenn Sie sterben, werden Sie zu Ihrem Heimatstandort teleportiert. - </notification> - <notification name="NoFly"> - In diesem Bereich ist das Fliegen deaktiviert. -Fliegen ist hier nicht möglich. - </notification> - <notification name="PushRestricted"> - In diesem Bereich ist Stoßen nicht erlaubt. -Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land. - </notification> - <notification name="NoVoice"> - In diesem Bereich ist Voice deaktiviert. Sie werden niemanden sprechen hören. - </notification> - <notification name="NoBuild"> - In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen. - </notification> - <notification name="ScriptsStopped"> - Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert. - </notification> - <notification name="ScriptsNotRunning"> - In dieser Region werden keine Skipts ausgeführt. - </notification> - <notification name="NoOutsideScripts"> - Auf diesem Land sind externe Skripts deaktiviert - -Hier funktionieren nur Skripts, die dem Landeigentümer gehören. - </notification> - <notification name="ClaimPublicLand"> - Öffentliches Land kann nur in der Region in Besitz genommen werden, in der Sie sich befinden. - </notification> - <notification name="RegionTPAccessBlocked"> - Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Sie müssen eventuell eine Altersüberprüfung vornehmen und/oder den aktuellsten Viewer installieren. - -Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regionen mit dieser Alterseinstufung zu erhalten. - </notification> - <notification name="URBannedFromRegion"> - Sie dürfen diese Region nicht betreten. - </notification> - <notification name="NoTeenGridAccess"> - Ihr Konto kann keine Verbindung zu dieser Teen Grid-Region herstellen. - </notification> - <notification name="ImproperPaymentStatus"> - Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor. - </notification> - <notification name="MustGetAgeParcel"> - Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können. - </notification> - <notification name="NoDestRegion"> - Keine Zielregion gefunden. - </notification> - <notification name="NotAllowedInDest"> - Der Zutritt wurde Ihnen verweigert. - </notification> - <notification name="RegionParcelBan"> - Diese Parzelle ist abgesperrt und kann nicht überquert werden. Versuchen Sie einen anderen Weg. - </notification> - <notification name="TelehubRedirect"> - Sie wurden zu einem Telehub umgeleitet. - </notification> - <notification name="CouldntTPCloser"> - Ein Teleport näher am Ziel ist leider nicht möglich. - </notification> - <notification name="TPCancelled"> - Teleport abgebrochen. - </notification> - <notification name="FullRegionTryAgain"> - Die Region, die Sie betreten möchten, ist im Moment voll. -Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="GeneralFailure"> - Allgemeiner Fehler. - </notification> - <notification name="RoutedWrongRegion"> - In falsche Region umgeleitet. Bitte versuchen Sie es erneut. - </notification> - <notification name="NoValidAgentID"> - Keine gültige Agent ID. - </notification> - <notification name="NoValidSession"> - Keine gültige Sitzungs-ID. - </notification> - <notification name="NoValidCircuit"> - Kein gültiger Verbindungscode. - </notification> - <notification name="NoValidTimestamp"> - Kein gültiger Zeitstempel. - </notification> - <notification name="NoPendingConnection"> - Verbindung kann nicht hergestellt werden. - </notification> - <notification name="InternalUsherError"> - Interner Fehler beim Versuch, Verbindung mit Agent Usher herzustellen. - </notification> - <notification name="NoGoodTPDestination"> - In dieser Region konnte kein gültiges Teleportziel gefunden werden. - </notification> - <notification name="InternalErrorRegionResolver"> - Interner Fehler bei Teleport. - </notification> - <notification name="NoValidLanding"> - Ein gültiger Landpunkt konnte nicht gefunden werden. - </notification> - <notification name="NoValidParcel"> - Es konnte keine gültige Parzelle gefunden werden. - </notification> - <notification name="ObjectGiveItem"> - Das Objekt [OBJECTFROMNAME] von [FIRST] [LAST] hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). - <form name="form"> - <button name="Keep" text="Behalten"/> - <button name="Discard" text="Verwerfen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - Das Objekt [OBJECTFROMNAME] von (unbekannt) hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). - <form name="form"> - <button name="Keep" text="Behalten"/> - <button name="Discard" text="Verwerfen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="UserGiveItem"> - [NAME] hat Ihnen ein [OBJECTTYPE] namens „[OBJECTNAME]“ gegeben. - <form name="form"> - <button name="Keep" text="Behalten"/> - <button name="Discard" text="Verwerfen"/> - </form> - </notification> - <notification name="GodMessage"> - [NAME] -[MESSAGE] - </notification> - <notification name="JoinGroup"> - [MESSAGE] - <form name="form"> - <button name="Join" text="Beitreten"/> - <button name="Decline" text="Ablehnen"/> - <button name="Info" text="Info"/> - </form> - </notification> - <notification name="TeleportOffered"> - [NAME] hat angeboten, Sie zu ihrem/seinem Standort zu teleportieren: - -[MESSAGE] - <form name="form"> - <button name="Teleport" text="Teleportieren"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="GotoURL"> - [MESSAGE] -[URL] - <form name="form"> - <button name="Later" text="Später"/> - <button name="GoNow..." text="Jetzt gehen..."/> - </form> - </notification> - <notification name="OfferFriendship"> - [NAME] bietet Ihnen die Freundschaft an. - -[MESSAGE] - -(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.) - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - </form> - </notification> - <notification name="OfferFriendshipNoMessage"> - [NAME] bietet Ihnen die Freundschaft an. - -(Sie werden dadurch den gegenseitigen Online-Status sehen können.) - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - </form> - </notification> - <notification name="FriendshipAccepted"> - [NAME] hat Ihr Freundschaftsangebot akzeptiert. - </notification> - <notification name="FriendshipDeclined"> - [NAME] hat Ihr Freundschaftsangebot abgelehnt. - </notification> - <notification name="OfferCallingCard"> - [FIRST] [LAST] bietet Ihnen eine Visitenkarte an. -Dies erstellt ein Lesezeichen in Ihrem Inventar, damit Sie diesen Einwohner jederzeit über IM erreichen. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - </form> - </notification> - <notification name="RegionRestartMinutes"> - Region wird in [MINUTES] Minuten neu gestartet. -Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. - </notification> - <notification name="RegionRestartSeconds"> - Diese Region wird in [SECONDS] neu gestartet. -Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. - </notification> - <notification name="LoadWebPage"> - Webseite [URL] laden? - -[MESSAGE] - -Von Objekt: [OBJECTNAME], Eigentümer: [NAME]? - <form name="form"> - <button name="Gotopage" text="Zur Seite"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="FailedToFindWearableUnnamed"> - [TYPE] nicht in Datenbank. - </notification> - <notification name="FailedToFindWearable"> - [TYPE] namens [DESC] nicht in Datenbank. - </notification> - <notification name="InvalidWearable"> - Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um diesen Artikel anziehen zu können. - </notification> - <notification name="ScriptQuestion"> - Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte: - -[QUESTIONS] -Ist das OK? - <form name="form"> - <button name="Yes" text="Ja"/> - <button name="No" text="Nein"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="ScriptQuestionCaution"> - Ein Objekt namens „[OBJECTNAME]“ des Eigentümers „[NAME]“ möchte: - -[QUESTIONS] -Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen. - -Anfrage gestatten? - <form name="form"> - <button name="Grant" text="Gewähren"/> - <button name="Deny" text="Verweigern"/> - <button name="Details" text="Info..."/> - </form> - </notification> - <notification name="ScriptDialog"> - [FIRST] [LAST]s „[TITLE]“ -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorieren"/> - </form> - </notification> - <notification name="ScriptDialogGroup"> - [GROUPNAME]s „[TITLE]“ -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorieren"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - Sie haben gerade [AMOUNT] L$ erhalten. -Ihr Kontostand wird oben rechts angezeigt. - </notification> - <notification name="FirstBalanceDecrease"> - Sie haben gerade [AMOUNT] L$ bezahlt. -Ihr Kontostand wird oben rechts angezeigt. - </notification> - <notification name="FirstSit"> - Sie sitzen. -Verwenden Sie die Pfeiltasten (oder AWSD-Tasten), um sich umzusehen. -Um aufzustehen, klicken Sie auf die Schaltfläche „Aufstehen“. - </notification> - <notification name="FirstMap"> - Klicken Sie auf die Karte und bewegen Sie die Maus, um sich auf der Karte umzusehen. -Mit Doppelklick können Sie teleportieren. -Nutzen Sie die Optionen rechts, um Objekte, Einwohner oder Events anzuzeigen und einen anderen Hintergrund auszuwählen. - </notification> - <notification name="FirstBuild"> - Sie haben die Bauwerkzeuge geöffnet. Jedes Objekt, dass Sie sehen wurde mit diesen Werkzeugen gebaut. - </notification> - <notification name="FirstTeleport"> - Sie können nur zu bestimmten Bereichen in dieser Region teleportieren. Der Pfeil deutet zu Ihrem Ziel hin. Klicken Sie auf den Pfeil, um diesen auszublenden. - </notification> - <notification name="FirstOverrideKeys"> - Ihre Bewegungstasten werden jetzt von einem Objekt gesteuert. -Probieren Sie die Pfeil- oder WASD-Tasten aus. -Manche Objekte (wie Waffen) müssen per Mouselook gesteuert werden. -Drücken Sie dazu „M“. - </notification> - <notification name="FirstAppearance"> - Sie bearbeiten gerade Ihr Aussehen. -Verwenden Sie die Pfeiltasten, um sich umzusehen. -Klicken Sie auf „Alles speichern“, wenn Sie fertig sind. - </notification> - <notification name="FirstInventory"> - Dies ist Ihr Inventar. Es enthält Objekte, die Ihnen gehören. - -* Um etwas anzuziehen, ziehen Sie es mit der Maus auf Ihren Avatar. -* Um etwas inworld zu rezzen, ziehen Sie das Objekt auf den Boden. -* Zum Lesen einer Notizkarte klicken Sie sie doppelt an. - </notification> - <notification name="FirstSandbox"> - Dies ist ein Sandkasten. Hier können Einwohner lernen, wie Objekte gebaut werden. - -Objekte, die Sie hier bauen, werden gelöscht, nachdem Sie den Sandkasten verlassen. Vergessen Sie nicht, Ihr Werk mit einem Rechtsklick und der Auswahl „Nehmen“ in Ihrem Inventar zu speichern. - </notification> - <notification name="FirstFlexible"> - Dieses Objekt ist flexibel. Flexible Objekte müssen die Eigenschaft „Phantom“ haben und dürfen nicht „physisch“ sein. - </notification> - <notification name="FirstDebugMenus"> - Sie haben das Menü „Erweitert“ geöffnet. - -Um dieses Menü zu aktivieren bzw. deaktivieren: - Windows Strg-Alt-D - Mac ⌘-Opt-D - </notification> - <notification name="FirstSculptedPrim"> - Sie bearbeiten ein geformtes Primitiv. Geformte Primitive benötigen eine spezielle Textur, die ihre Form definiert. - </notification> - <notification name="MaxListSelectMessage"> - Sie können maximal [MAX_SELECT] Objekte -von der Liste auswählen. - </notification> - <notification name="VoiceInviteP2P"> - [NAME] lädt Sie zu einem Voice-Chat ein. -Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] hat eine Instant Message erhalten; die Stummschaltung wurde aufgehoben. - </notification> - <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] hat Geld erhalten; die Stummschaltung wurde aufgehoben. - </notification> - <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] wurde ein Inventarobjekt angeboten; die Stummschaltung wurde aufgehoben. - </notification> - <notification name="VoiceInviteGroup"> - [NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten. -Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="VoiceInviteAdHoc"> - [NAME] ist einem Voice-Konferenz-Chat beigetreten. -Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="InviteAdHoc"> - [NAME] lädt Sie zu einem Konferenz-Chat ein. -Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="VoiceChannelFull"> - Der Voice-Chat, dem Sie beitreten möchten, [VOICE_CHANNEL_NAME], hat seine maximale Teilnehmerzahl erreicht. Bitte versuchen Sie es erneut. - </notification> - <notification name="ProximalVoiceChannelFull"> - Es tut uns Leid. Dieses Gebiet hat seine maximale Kapazität für Voice-Gespräche erreicht. Bitte versuchen Sie es in einem anderen Gebiet. - </notification> - <notification name="VoiceChannelDisconnected"> - Sie haben [VOICE_CHANNEL_NAME] verlassen. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] hat das Gespräch beendet. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] hat Ihren Anruf abgelehnt. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] ist zurzeit nicht erreichbar. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="VoiceChannelJoinFailed"> - Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="VoiceLoginRetry"> - Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment. - </notification> - <notification name="Cannot enter parcel: not a group member"> - Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten. - </notification> - <notification name="Cannot enter parcel: banned"> - Zugang zur Parzelle verweigert. Sie wurden verbannt. - </notification> - <notification name="Cannot enter parcel: not on access list"> - Zugang zur Parzelle verweigert. Sie stehen nicht auf der Zugangsliste. - </notification> - <notification name="VoiceNotAllowed"> - Sie sind nicht berechtigt, einem Voice-Chat in [VOICE_CHANNEL_NAME] beizutreten. - </notification> - <notification name="VoiceCallGenericError"> - Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen. Bitte versuchen Sie es erneut. - </notification> - <notification name="ServerVersionChanged"> - Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. Klicken Sie hier, um die Versionshinweise anzuzeigen. - </notification> - <notification name="UnsupportedCommandSLURL"> - Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt. - </notification> - <notification name="IMToast"> - <form name="form"> - <button name="respondbutton" text="Antworten"/> - </form> - </notification> - <notification name="AttachmentSaved"> - Der Anhang wurde gespeichert. - </notification> - <notification name="UnableToFindHelpTopic"> - Hilfethema für dieses Element wurde nicht gefunden. - </notification> - <global name="UnsupportedCPU"> - - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. - </global> - <global name="UnsupportedGLRequirements"> - Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem. - -Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT_SITE]. - </global> - <global name="UnsupportedCPUAmount"> - 796 - </global> - <global name="UnsupportedRAMAmount"> - 510 - </global> - <global name="UnsupportedGPU"> - - Ihre Grafikkarte entspricht nicht den Mindestanforderungen. - </global> - <global name="UnsupportedRAM"> - - Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen. - </global> - <global name="PermYes"> - Ja - </global> - <global name="PermNo"> - Nein - </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. -Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind. - </global> -</notifications> +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + Nicht mehr anzeigen + </global> + <global name="alwayschoose"> + Diese Option immer auswählen + </global> + <global name="implicitclosebutton"> + Schließen + </global> + <template name="okbutton"> + <form> + <button name="OK" text="$yestext"/> + </form> + </template> + <template name="okignore"/> + <template name="okcancelbuttons"> + <form> + <button name="Cancel" text="$notext"/> + </form> + </template> + <template name="okcancelignore"/> + <template name="okhelpbuttons"> + <form> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Unbekannter Warnhinweis" name="MissingAlert"> + Ihre Version von [APP_NAME] kann den gerade empfangenen Warnhinweis nicht anzeigen. Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben. + +Fehlerdetails: Der Warnhinweis '[_NAME]' wurde in notifications.xml nicht gefunden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + Floater-Fehler: Folgende Steuerelemente wurden nicht gefunden: + +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + Derzeit ist kein Tutorial verfügbar. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="BadInstallation"> + Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version des Viewers herunter. http://get.secondlife.com + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden. + '[DIAGNOSTIC]' +Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + Meldungsvorlage [PATH] nicht gefunden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + Änderung an aktueller Kleidung/Körperteil speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> + </notification> + <notification name="CompileQueueSaveText"> + Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. + </notification> + <notification name="CompileQueueSaveBytecode"> + Eine kompiliertes Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. + </notification> + <notification name="WriteAnimationFail"> + Fehler beim Schreiben von Animationsdaten. Bitte versuchen Sie es erneut. + </notification> + <notification name="UploadAuctionSnapshotFail"> + Eine Auktions-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + Es kann nur jeweils der Inhalt von einem Objekt angezeigt werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification name="SaveClothingBodyChanges"> + Änderung an Kleidung/Körperteilen speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/> + </notification> + <notification name="GrantModifyRights"> + Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern oder an sich zu nehmen, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. +Möchten Sie [FIRST_NAME] [LAST_NAME] Änderungsrechte gewähren? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. +Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="RevokeModifyRights"> + Möchten Sie [FIRST_NAME] [LAST_NAME] die Änderungsrechte entziehen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + Möchten Sie den ausgewählten Einwohnern die Änderungsrechte entziehen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="UnableToCreateGroup"> + Gruppe konnte nicht erstellt werden. +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Änderungen verwerfen" yestext="Änderungen übernehmen"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + Geben Sie einen Betreff für die Gruppenmitteilung ein. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + Sie sind im Begriff, Gruppenmitgliedern die Rolle [ROLE_NAME] zuzuweisen. +Diese Rolle kann Mitgliedern nicht mehr entzogen werden. +Sie müssen die Rolle selbst niederlegen. +Möchten Sie fortfahren? + <usetemplate ignoretext="Bestätigen, bevor ich einen neuen Gruppeneigentümer hinzufüge" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="AssignDangerousActionWarning"> + Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. + + *ACHTUNG* + Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - + und allen anderen Mitgliedern – Rollen zuweisen, die mehr Rechte + beinhalten als sie derzeit haben, und damit nahezu + Eigentümerrechte erreichen. Überlegen Sie sich, wem Sie diese Fähigkeit + verleihen. + +Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. + + *ACHTUNG* + Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - + und allen anderen Mitgliedern – alle Fähigkeiten zuweisen und + damit fast Eigentümerrechte erreichen. + +Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="JoinGroupCanAfford"> + Der Beitritt zu dieser Gruppe kostet [COST] L$. +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. + </notification> + <notification name="CreateGroupCost"> + Die Gründung dieser Gruppe kostet 100 L$. +Gruppen müssen mehr als ein Mitglied haben oder sie werden gelöscht. +Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein. + <usetemplate canceltext="Abbrechen" name="okcancelbuttons" notext="Abbrechen" yestext="Gruppe für 100 L$ erstellen"/> + </notification> + <notification name="LandBuyPass"> + Sie können dieses Land („[PARCEL_NAME]“) für [COST] L$ +[TIME] Stunden lang betreten. Pass kaufen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + Der Verkaufspreis muss beim allgemeinen Verkauf über 0 L$ liegen. +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. + <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] qm Land werden zum Verkauf freigegeben. +Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „[NAME]“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren? + +*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + Möchten Sie alle Objekte auf dieser Parzelle, die dem Einwohner „[NAME]“ gehören, in das jeweilige Inventar ihrer Eigentümer transferieren? + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedBySelf"> + Möchten Sie alle Objekte auf dieser Parzelle, die Ihnen gehören, zurück in Ihr Inventar transferieren? + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedBySelf"> + Möchten Sie alle Objekte auf dieser Parzelle, die NICHT Ihnen gehören, in das Inventar ihrer Eigentümer transferieren? +Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. + +*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByUser"> + Möchten Sie alle Objekte auf dieser Parzelle, die NICHT [NAME] gehören, in das Inventar ihrer Eigentümer transferieren? +Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. + +*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + Möchten Sie alle aufgeführten Objekte ihren Eigentümern zurückgeben? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + Möchten Sie alle Objekte in dieser Region deaktivieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + Objekte auf dieser Parzelle, die von der Gruppe [NAME] nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben? + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + Skriptdeaktivierung nicht möglich. +Für die gesamte Region ist Schaden aktiviert. +Damit Waffen funktionieren, müssen Skripts erlaubt sein. + </notification> + <notification name="MustBeInParcel"> + Sie müssen auf einer Landparzelle stehen, um ihren Landepunkt festzulegen. + </notification> + <notification name="PromptRecipientEmail"> + Bitte geben Sie für den/die Empfänger eine gültige Email-Adresse ein. + </notification> + <notification name="PromptSelfEmail"> + Geben Sie Ihre E-Mail-Adresse ein. + </notification> + <notification name="PromptMissingSubjMsg"> + Foto mit Standardbetreff bzw. -nachricht als E-Mail versenden? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ErrorProcessingSnapshot"> + Fehler beim Verarbeiten der Fotodaten + </notification> + <notification name="ErrorEncodingSnapshot"> + Fehler beim Erstellen des Fotos! + </notification> + <notification name="ErrorUploadingPostcard"> + Ein Foto konnte aus folgendem Grund nicht gesendet werden: [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + Ein Report-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + Bevor Sie sich in [SECOND_LIFE] anmelden können, müssen Sie den Nutzungsbedingungen zustimmen. + </notification> + <notification name="CouldNotPutOnOutfit"> + Outfit konnte nicht angezogen werden. +Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge. + </notification> + <notification name="CannotWearTrash"> + Kleider oder Körperteile im Papierkorb können nicht getragen werden + </notification> + <notification name="CannotWearInfoNotComplete"> + Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal. + </notification> + <notification name="MustHaveAccountToLogIn"> + Hoppla! Da fehlt noch etwas. +Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein. + +Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen? + <url name="url"> + https://join.secondlife.com/index.php?lang=de-DE + </url> + <usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/> + </notification> + <notification name="AddClassified"> + Anzeigen erscheinen für eine Woche unter „Anzeigen“ im Suchverzeichnis. 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. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste. + <usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DeleteClassified"> + Anzeige „[NAME]“ löschen? +Gebühren werden nicht rückerstattet. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ClassifiedSave"> + Änderung an Anzeige [NAME] speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> + </notification> + <notification name="DeleteAvatarPick"> + Auswahl [PICK] löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + Zur [SECOND_LIFE] Events-Webseite? + <url name="url"> + http://secondlife.com/events/?lang=de-DE + </url> + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + Wählen Sie ein Angebot zur Ansicht. + </notification> + <notification name="SelectHistoryItemToView"> + Wählen Sie ein Element zur Ansicht. + </notification> + <notification name="ResetShowNextTimeDialogs"> + Möchten Sie alle Popups wieder aktivieren, die Sie zuvor auf „Nicht mehr anzeigen“ gesetzt haben? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SkipShowNextTimeDialogs"> + Möchten Sie alle Popups, die übersprungen werden können, deaktivieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CacheWillClear"> + Der Cache wird nach einem Neustart von [APP_NAME] geleert. + </notification> + <notification name="CacheWillBeMoved"> + Der Cache wird nach einem Neustart von [APP_NAME] verschoben. +Hinweis: Der Cache wird dabei gelöscht/geleert. + </notification> + <notification name="ChangeConnectionPort"> + Die Port-Einstellungen werden nach einem Neustart von [APP_NAME] wirksam. + </notification> + <notification name="ChangeSkin"> + Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angewendet. + </notification> + <notification name="GoToAuctionPage"> + Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben? + <url name="url"> + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + </url> + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + Änderungen speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + Speichern der Geste fehlgeschlagen. +Die Geste besteht aus zu vielen Schritten. +Löschen Sie einige Schritte und versuchen Sie es erneut. + </notification> + <notification name="GestureSaveFailedTryAgain"> + Speichern der Geste fehlgeschlagen. Warten Sie kurz und versuchen Sie es dann noch einmal. + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + Geste konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="GestureSaveFailedReason"> + Eine Geste konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Geste bitte später. + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + Notizkarte konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="SaveNotecardFailReason"> + Eine Notizkarte konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Notizkarte bitte später. + </notification> + <notification name="ScriptCannotUndo"> + Es konnten nicht alle Änderungen in Ihrer Skriptversion rückgängig gemacht werden. +Möchten Sie die letzte gespeicherte Version vom Server laden? +(**Warnung** Dieser Vorgang kann nicht rückgängig gemacht werden.) + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + Ein Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. + </notification> + <notification name="SaveScriptFailObjectNotFound"> + Skript konnte nicht gespeichert werden, weil das zugehörige Objekt nicht gefunden wurde. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="SaveBytecodeFailReason"> + Ein kompiliertes Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. + </notification> + <notification name="StartRegionEmpty"> + Sie haben keine Start-Region festgelegt. +Bitte geben Sie den Namen der Region im Feld „Startposition“ ein oder wählen Sie „Mein letzter Standort“ oder „Mein Heimatort“ als Startposition aus. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + Skript konnte nicht gestartet oder beendet werden, weil das zugehörige Objekt nicht gefunden wurde. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="CannotDownloadFile"> + Dateidownload nicht möglich + </notification> + <notification name="CannotWriteFile"> + 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. + +MINDESTANF. +Die Seite [_URL] für weitere Informationen öffnen? + <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. +(Einstellungen > Grafik). + <form name="form"> + <ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] ist bei der Initialisierung der Grafiktreiber abgestürzt. +Die Grafikqualität wird auf eine niedrige Stufe zurückgesetzt, um einige typische Treiberfehler zu vermeiden. +Einige Grafikfunktionen werden ausgeschaltet. +Wir empfehlen die Aktualisierung Ihrer Grafikkartentreiber. +Sie können die Grafikqualität unter „Einstellungen“ > „Grafik“ wieder erhöhen. + </notification> + <notification name="RegionNoTerraforming"> + 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? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="CannotGiveItem"> + Inventarobjekt kann nicht übergeben werden. + </notification> + <notification name="TransactionCancelled"> + Transaktion abgebrochen. + </notification> + <notification name="TooManyItems"> + Es können maximal 42 Objekte auf einmal in das Inventar transferiert werden. + </notification> + <notification name="NoItems"> + Sie sind nicht berechtigt, die ausgewählten Objekte zu kopieren. + </notification> + <notification name="CannotCopyCountItems"> + Sie sind nicht berechtigt, [COUNT] der ausgewählten Objekte zu kopieren. Diese Objekte werden aus Ihrem Inventar gelöscht. +Möchten Sie diese Objekte weggeben? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="CannotGiveCategory"> + Sie sind nicht berechtigt, den ausgewählten Ordner zu kopieren. + </notification> + <notification name="FreezeAvatar"> + Diesen Avatar einfrieren? +Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> + </notification> + <notification name="FreezeAvatarFullname"> + [AVATAR_NAME] einfrieren? +Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> + </notification> + <notification name="EjectAvatarFullname"> + [AVATAR_NAME] von Ihrem Land werfen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Ausschließen und Verbannen" yestext="Ausschließen"/> + </notification> + <notification name="EjectAvatarNoBan"> + Diesen Avatar aus Ihrem Land werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> + </notification> + <notification name="EjectAvatarFullnameNoBan"> + [AVATAR_NAME] aus Ihrem Land werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> + </notification> + <notification name="AcquireErrorTooManyObjects"> + FEHLER: Zu viele Objekte ausgewählt. + </notification> + <notification name="AcquireErrorObjectSpan"> + FEHLER: Die Objekte überspannen mehrere Regionen. +Verschieben Sie alle betreffenden Objekte in dieselbe Region. + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +[_URL] für Informationen zum Kauf von L$ öffnen? + <url name="url"> + http://secondlife.com/app/currency/?lang=de-DE + </url> + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + Verknüpfung dieser [COUNT] Objekte nicht möglich. +Sie können maximal [MAX] Objekte verknüpfen. + </notification> + <notification name="CannotLinkIncompleteSet"> + Sie können nur vollständige Objektsätze verknüpfen und Sie müssen mehr als ein Objekt auswählen. + </notification> + <notification name="CannotLinkModify"> + Verknüpfung nicht möglich, da Sie nicht alle Objekte bearbeiten dürfen. + +Stellen Sie sicher, dass kein Objekt gesperrt ist und alle Objekte Ihnen gehören. + </notification> + <notification name="CannotLinkDifferentOwners"> + Verknüpfung nicht möglich, da nicht alle Objekte denselben Eigentümer haben. + +Stellen Sie sicher, dass alle ausgewählten Objekte Ihnen gehören. + </notification> + <notification name="NoFileExtension"> + Kein Dateityp für Datei: „[FILE]“ + +Vergewissern Sie sich, dass die Datei den richtigen Dateityp hat. + </notification> + <notification name="InvalidFileExtension"> + Ungültige Datei-Endung [EXTENSION] +Erwartet wurde [VALIDS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + Sounddatei konnte nicht hochgeladen werden: +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + Die Datei ist anscheinend keine RIFF WAVE-Datei: +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + Die Datei ist anscheinend keine PCM WAVE-Audiodatei: +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + Die Datei hat eine ungültige Anzahl Tonkanäle (muss Mono oder Stereo sein): +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + Die Sample-Rate dieser Datei wird nicht unterstützt (muss 44,1 K sein): +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + Die Word-Größe dieser Datei wird nicht unterstützt (muss 8 oder 16 Bit sein): +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + „Daten“-Chunk in WAV-Header nicht gefunden: +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + Audiodatei ist zu lang (max. 10 Sekunden): +[FILE] + </notification> + <notification name="ProblemWithFile"> + Problem mit Datei [FILE]: + +[ERROR] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + Temporäre komprimierte Sounddatei konnte nicht geöffnet werden: [FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + Unbekannter Vorbis-Kodierungsfehler in: [FILE] + </notification> + <notification name="CannotEncodeFile"> + Datei konnte nicht kodiert werden: [FILE] + </notification> + <notification name="CorruptResourceFile"> + Ressourcendatei beschädigt: [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + Unbekannte Linden-Ressourcenversion in Datei: [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + Ausgabedatei konnte nicht erstellt werden: [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + Der Mehrfach-Upload von Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt. + </notification> + <notification name="CannotUploadReason"> + Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON] +Bitte versuchen Sie es erneut. + </notification> + <notification name="LandmarkCreated"> + „[LANDMARK_NAME]“ wurde zum Ordner „[FOLDER_NAME]“ hinzugefügt. + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + Sie können hier keine Landmarke erstellen, da der Landeigentümer dies verboten hat. + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + „Rekompilieren“ nicht möglich. +Objekt mit Skript wählen. + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + „Rekompilieren“ nicht möglich. + +Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + „Zurücksetzen“ nicht möglich. + +Wählen Sie Objekte mit Skripts. + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + „Zurücksetzen“ nicht möglich. + +Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + „Ausführen“ von Skripts nicht möglich. + +Wählen Sie Objekte mit Skripts. + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + „Deaktivieren“ von Skripts nicht möglich. + +Wählen Sie Objekte mit Skripts. + </notification> + <notification name="NoFrontmostFloater"> + Kein vorderster Floater zum Speichern. + </notification> + <notification name="SeachFilteredOnShortWords"> + Ihre Suchanfrage wurde geändert. +Zu kurze Begriffe wurden entfernt. + +Ihre Suchanfrage: [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + Ihre Suchbegriffe sind zu kurz. +Es wurde keine Suche durchgeführt. + </notification> + <notification name="CouldNotTeleportReason"> + Teleport fehlgeschlagen. +[REASON] + </notification> + <notification name="invalid_tport"> + Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. +Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. + </notification> + <notification name="nolandmark_tport"> + Das System konnte das Landmarken-Ziel nicht finden. + </notification> + <notification name="timeout_tport"> + Das System konnte keine Teleport-Verbindung herstellen. +Versuchen Sie es später noch einmal. + </notification> + <notification name="noaccess_tport"> + Sie haben leider keinen Zugang zu diesem Teleport-Ziel. + </notification> + <notification name="missing_attach_tport"> + Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. + </notification> + <notification name="too_many_uploads_tport"> + Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. +Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. + </notification> + <notification name="expired_tport"> + Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="expired_region_handoff"> + Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="no_host"> + Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="no_inventory_host"> + Das Inventarsystem ist zurzeit nicht verfügbar. + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + Landeigentümer kann nicht festgelegt werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + Eine erzwungene Landübertragung ist nicht möglich, da die Auswahl mehrere Regionen umfasst. Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. + </notification> + <notification name="ForceOwnerAuctionWarning"> + Diese Parzelle steht zur Auktion. Eine zwangsweise Eigentumsübertragung beendet die Auktion und verärgert womöglich Einwohner, die bereits ein Gebot abgegeben haben. Eigentumsübertragung erzwingen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + Inhaltsidentifizierung nicht möglich: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotContentifyNoRegion"> + Inhaltsidentifizierung nicht möglich: +Keine Region ausgewählt. + </notification> + <notification name="CannotReleaseLandNothingSelected"> + Land kann nicht aufgegeben werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotReleaseLandNoRegion"> + Land kann nicht aufgegeben werden: +Region nicht gefunden. + </notification> + <notification name="CannotBuyLandNothingSelected"> + Land kann nicht gekauft werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotBuyLandNoRegion"> + Land kann nicht gekauft werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotCloseFloaterBuyLand"> + Das Fenster „Land kaufen“ kann erst geschlossen werden, nachdem [APP_NAME] den Transaktionspreis geschätzt hat. + </notification> + <notification name="CannotDeedLandNothingSelected"> + Land kann nicht übertragen werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotDeedLandNoGroup"> + Land kann nicht übertragen werden: +Keine Gruppe ausgewählt. + </notification> + <notification name="CannotDeedLandNoRegion"> + Land kann nicht übertragen werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotDeedLandMultipleSelected"> + Land kann nicht übertragen werden: +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“ > „Audio & Video“ ä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. + +Bitte versuchen Sie es erneut. + </notification> + <notification name="CannotDeedLandNoTransfer"> + Land kann nicht übertragen werden: +Die Region [REGION] erlaubt keine Landübertragung. + </notification> + <notification name="CannotReleaseLandWatingForServer"> + Land kann nicht aufgegeben werden: +Server muss Parzelleninformation aktualisieren. + +Versuchen Sie es in einigen Sekunden erneut. + </notification> + <notification name="CannotReleaseLandSelected"> + Land kann nicht aufgegeben werden: +Die ausgewählten Parzellen gehören Ihnen nicht. + +Wählen Sie eine einzelne Parzelle. + </notification> + <notification name="CannotReleaseLandDontOwn"> + Land kann nicht aufgegeben werden: +Ihnen fehlt die Berechtigung zur Freigabe dieser Parzelle. +Parzellen, die Ihnen gehören, werden grün dargestellt. + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + Land kann nicht aufgegeben werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotReleaseLandNoTransfer"> + Land kann nicht aufgegeben werden: +Die Region [REGION] erlaubt keine Landübertragung. + </notification> + <notification name="CannotReleaseLandPartialSelection"> + Land kann nicht aufgegeben werden: +Zum Freigeben müssen Sie eine ganze Parzelle auswählen. + +Wählen Sie eine ganze Parzelle oder teilen Sie Ihre Parzelle. + </notification> + <notification name="ReleaseLandWarning"> + Sie sind im Begriff, [AREA] qm Land aufzugeben. +Wenn Sie diese Parzelle aufgeben, wird sie ohne L$-Erstattung von Ihrem Landbesitz entfernt. + +Dieses Land aufgeben? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + Land kann nicht aufgeteilt werden: + +Keine Parzellen ausgewählt. + </notification> + <notification name="CannotDivideLandPartialSelection"> + Land kann nicht aufgeteilt werden: + +Sie haben eine ganze Parzelle ausgewählt. +Wählen Sie einen Parzellenabschnitt aus. + </notification> + <notification name="LandDivideWarning"> + Wenn Sie dieses Land teilen, wird diese Parzelle in zwei geteilt, jede mit ihren eigenen Einstellungen. Einige dieser Einstellungen werden aufgrund dieses Vorgangs zurückgesetzt. + +Land teilen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + Land kann nicht aufgeteilt werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotJoinLandNoRegion"> + Land kann nicht zusammengelegt werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotJoinLandNothingSelected"> + Land kann nicht zusammengelegt werden: +Keine Parzellen ausgewählt. + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + Land kann nicht zusammengelegt werden: +Sie haben nur eine Parzelle ausgewählt. + +Wählen Sie Land auf beiden Parzellen aus. + </notification> + <notification name="CannotJoinLandSelection"> + Land kann nicht zusammengelegt werden: +Sie müssen mehrere Parzellen auswählen. + +Wählen Sie Land auf beiden Parzellen aus. + </notification> + <notification name="JoinLandWarning"> + Beim Zusammenlegen entsteht aus den vom Auswahlrechteck +erfassten Parzellen eine große Parzelle. +Sie müssen der neuen Parzelle einen Namen geben und ihre Optionen festlegen. + +Land zusammenlegen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + Um das Objekt kopieren oder anzeigen zu können, müssen Sie zuerst diese Notizkarte speichern. Notizkarte speichern? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + Dieses Objekt in Ihr Inventar kopieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Kopieren"/> + </notification> + <notification name="ResolutionSwitchFail"> + Auflösung konnte nicht auf [RESX] x [RESY] gesetzt werden + </notification> + <notification name="ErrorUndefinedGrasses"> + Fehler: Nicht definierte Gräser: [SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + Fehler: Nicht definierte Bäume: [SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + „[NAME]“ konnte nicht in Kleidungsdatei gespeichert werden. Geben Sie Speicherplatz auf dem Computer frei und speichern Sie das Kleidungsstück erneut. + </notification> + <notification name="CannotSaveToAssetStore"> + [NAME] kann nicht in Zentral-Asset-Speicher geladen werden. +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: + [MESSAGE] +Klicken Sie auf „IM & Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Klicken Sie andernfalls auf „Beenden“, um [APP_NAME] sofort zu beenden. + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM & Chat anzeigen"/> + </notification> + <notification name="OnlyOfficerCanBuyLand"> + Landkauf für Gruppe nicht möglich: +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. + +[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. + +[NAME] Freundschaft anbieten? + <form name="form"> + <input name="message"> + Wollen wir Freunde sein? + </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"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + Möchten Sie mehrere Freunde aus Ihrer Freundesliste entfernen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedPublicObjectsByUser"> + Möchten Sie alle geskripteten Objekte von +** [AVATAR_NAME] ** +auf allen anderen Ländern in diesem Sim löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedObjectsByUser"> + Möchten Sie ALLE geskripteten Objekte von +** [AVATAR_NAME] ** +auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GodDeleteAllObjectsByUser"> + Möchten Sie ALLE Objekte (einschließlich geskriptete) von +** [AVATAR_NAME] ** +auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BlankClassifiedName"> + Geben Sie einen Namen für die Anzeige ein. + </notification> + <notification name="MinClassifiedPrice"> + Der Mindestbetrag für die Listung ist [MIN_PRICE] L$. + +Geben sie einen höheren Betrag ein. + </notification> + <notification name="ConfirmObjectDeleteLock"> + Mindestens ein ausgewähltes Objekt ist gesperrt. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + Mindestens ein ausgewähltes Objekt kann nicht kopiert werden. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + Mindestens eines der ausgewählten Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + Mindestens ein Objekt ist gesperrt. +Mindestens ein Objekt kann nicht kopiert werden. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + Mindestens ein Objekt ist gesperrt. +Mindestens ein Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + Mindestens ein Objekt kann nicht kopiert werden. +Mindestens ein Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + Mindestens ein Objekt ist gesperrt. +Mindestens ein Objekt kann nicht kopiert werden. +Mindestens ein Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + Mindestens ein Objekt ist gesperrt. + +Möchten Sie diese Objekte nehmen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. +Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer angewandt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. + +Möchten Sie diese Objekte nehmen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + Mindestens ein Objekt ist gesperrt. +Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. +Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer abgefragt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. +Die aktuelle Auswahl können Sie jedoch aufnehmen. + +Möchten Sie diese Objekte nehmen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + Landkauf nicht möglich, da die Auswahl mehrere Regionen umfasst. + +Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. + </notification> + <notification name="DeedLandToGroup"> + Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. +Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. + +Der Gruppe „[GROUP_NAME]“ + [AREA] m² Land schenken? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. +Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[FIRST_NAME] [LAST_NAME]“. +Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. + +Der Gruppe „[GROUP_NAME]“ + [AREA] m² Land schenken? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde. + </notification> + <notification name="DisplaySetToRecommended"> + Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt. + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + </notification> + <notification name="AvatarMovedDesired"> + Ihr gewünschter Zielort ist zurzeit nicht verfügbar. +Sie wurden zur nächstgelegenen Region teleportiert. + </notification> + <notification name="AvatarMovedLast"> + Ihr letzter Standort ist zurzeit nicht verfügbar. +Sie wurden zur nächstgelegenen Region teleportiert. + </notification> + <notification name="AvatarMovedHome"> + Ihr Heimatort ist zurzeit nicht verfügbar. +Sie wurden zur nächstgelegenen Region teleportiert. +Sie müssen eventuell einen neuen Heimatort festlegen. + </notification> + <notification name="ClothingLoading"> + Ihre Kleidung wird noch heruntergeladen. +Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen. + <form name="form"> + <ignore name="ignore" text="Das Herunterladen der Kleidung dauert lange"/> + </form> + </notification> + <notification name="FirstRun"> + Die Installation von [APP_NAME] ist abgeschlossen. + +Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können. +Möchten Sie auf [https://join.secondlife.com/index.php?lang=de-DE secondlife.com] ein Konto erstellen? + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID]. + +Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen, oder klicken Sie auf Teleportieren, um nach Hause zu teleportieren. + <url name="url"> + http://de.secondlife.com/support/ + </url> + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="Hilfe"/> + <button name="Teleport" text="Teleportieren"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + Ihr Avatar erscheint jeden Moment. + +Benutzen Sie die Pfeiltasten, um sich fortzubewegen. +Drücken Sie F1 für Hilfe oder für weitere Informationen über [SECOND_LIFE]. +Bitte wählen Sie einen männlichen oder weiblichen Avatar. +Sie können sich später noch umentscheiden. + <usetemplate name="okcancelbuttons" notext="Weiblich" yestext="Männlich"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] [PRICE] L$ Sie haben nicht genügend L$, um diese Aktion auszuführen. + </notification> + <notification name="GrantedModifyRights"> + [FIRST_NAME] [LAST_NAME] hat Ihnen die Erlaubnis erteilt, ihre/seine Objekte zu bearbeiten. + </notification> + <notification name="RevokedModifyRights"> + Ihnen wurden die Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME] entzogen. + </notification> + <notification name="FlushMapVisibilityCaches"> + Der Kartencache dieser Region wird geleert. +Diese Aktion ist nur beim Debugging sinnvoll. +(Auf dem Produktionssystem warten Sie einfach 5 Minuten. Die Karten werden nach erneuter Anmeldung automatisch aktualisiert.) + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + Sie können jeweils nur ein Objekt kaufen. Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + Es kann nur jeweils der Inhalt von einem Objekt kopiert werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + Alle Einwohner in dieser Region nach Hause teleportieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + Möchten Sie wirklich alle Objekte zurückgeben, die [USER_NAME] gehören? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + Die Regionstexturen konnten nicht festgelegt werden: +Die Terraintextur [TEXTURE_NUM] hat eine ungültige Bit-Tiefe [TEXTURE_BIT_DEPTH]. + +Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. + </notification> + <notification name="InvalidTerrainSize"> + Die Regionstexturen konnten nicht festgelegt werden: +Die Terraintextur [TEXTURE_NUM] ist mit [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] zu groß. + +Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. + </notification> + <notification name="RawUploadStarted"> + Hochladen gestartet. Je nach Verbindungsgeschwindigkeit kann der Vorgang bis zu 2 Minuten dauern. + </notification> + <notification name="ConfirmBakeTerrain"> + Möchten Sie das aktuelle Terrain formen, es zum Mittelpunkt der oberen und unteren Terraingrenzen und zum Standard des „Zurücksetzen“-Tools machen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + Es sind maximal [MAX_AGENTS] zulässige Einwohner erlaubt. + </notification> + <notification name="MaxBannedAgentsOnRegion"> + Es sind maximal [MAX_BANNED] verbannte Einwohner erlaubt. + </notification> + <notification name="MaxAgentOnRegionBatch"> + Fehler beim Versuch, [NUM_ADDED] Agenten hinzuzufügen: +Überschreitet den Grenzwert [MAX_AGENTS] [LIST_TYPE] um [NUM_EXCESS]. + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + Es sind maximal [MAX_GROUPS] zulässige Gruppen erlaubt. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Formen"/> + </notification> + <notification name="MaxManagersOnRegion"> + 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. + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind. + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + Der Name der Anzeige muss mit einem Buchstaben von A bis Z oder einer Ziffer beginnen. Satzzeichen sind nicht erlaubt. + </notification> + <notification name="CantSetBuyObject"> + „Objekt kaufen“ nicht möglich, da das Objekt nicht zum Verkauf freigegeben ist. +Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut. + </notification> + <notification name="FinishedRawDownload"> + Raw-Terrain-Datei wurde heruntergeladen nach: +[DOWNLOAD_PATH]. + </notification> + <notification name="DownloadWindowsMandatory"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> + </notification> + <notification name="DownloadWindows"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadLinuxMandatory"> + Eine neue Version von [SUPPORT_SITE] ist verfügbar. +[MESSAGE] +Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> + </notification> + <notification name="DownloadLinux"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadMacMandatory"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. + +In Ihren Anwendungsordner herunterladen? + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> + </notification> + <notification name="DownloadMac"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + +In Ihren Anwendungsordner herunterladen? + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + +In Ihren Anwendungsordner herunterladen? + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DeedObjectToGroup"> + Bei Übertragung dieses Objekts erhält die Gruppe: +* An das Objekt bezahlte L$ + <usetemplate ignoretext="Bestätigen, bevor ich ein Objekt an eine Gruppe übertrage" name="okcancelignore" notext="Abbrechen" yestext="Übertragung"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Möchten Sie Ihren Internetbrowser öffnen, um diesen Inhalt anzuzeigen? + <usetemplate ignoretext="Meinen Browser starten, um eine Webseite anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + de.secondlife.com öffnen, um Ihr Konto zu verwalten? + <usetemplate ignoretext="Meinen Browser starten, um mein Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + Informieren Sie sich im [SECOND_LIFE] Wiki, wie man Sicherheitsprobleme richtig meldet. + <usetemplate ignoretext="Meinen Browser starten, um anzuzeigen, wie ein Sicherheitsproblem gemeldet werden soll" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + Besuchen Sie das [SECOND_LIFE] QA-Wiki. + <usetemplate ignoretext="Meinen Browser starten, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + Im [SECOND_LIFE] Allgemeine-Fragen-Tracker können Sie Fehler und andere Probleme melden. + <usetemplate ignoretext="Meinen Browser starten, um die Datenbank für Fehler und Verbesserungsvorschläge anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Im offiziellen Linden-Blog finden Sie die neuesten Nachrichten und Informationen. + <usetemplate ignoretext="Meinen Browser starten, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLGuide"> + Möchten Sie den Scripting Guide öffnen? + <usetemplate ignoretext="Meinen Browser starten, um den Scripting Guide anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + Möchten Sie das LSL-Portal besuchen? + <usetemplate ignoretext="Meinen Browser starten, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> + </notification> + <notification name="ReturnToOwner"> + Möchten Sie die ausgewählten Objekte an ihre Eigentümer zurückgeben? Transferierbare übertragene Objekte werden ihren früheren Eigentümern zurückgegeben. + +*WARNUNG* Nicht transferierbare übertragene Objekte werden dabei gelöscht! + <usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + Sie sind Mitglied der Gruppe [GROUP]. +Diese Gruppe verlassen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/> + </notification> + <notification name="MuteLinden"> + Lindens können nicht stummgeschaltet werden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + Eine Parzelle, die bereits zum Verkauf freigegeben ist, kann nicht versteigert werden. Deaktivieren Sie den Landverkauf, wenn Sie das Land zur Versteigerung freigeben möchten. + </notification> + <notification label="Objekt nach Name stummschalten fehlgeschlagen" name="MuteByNameFailed"> + Dieser Name ist bereits stummgeschaltet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RemoveItemWarn"> + Diese Aktion ist zwar erlaubt, aber beim Löschen von Inhalten wird das Objekt beschädigt. Möchten Sie dieses Element löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CantOfferCallingCard"> + Sie können gerade keine Visitenkarte übergeben. Warten Sie kurz und versuchen Sie es dann noch einmal. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CantOfferFriendship"> + Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="BusyModeSet"> + Beschäftigt-Modus ist aktiviert. +Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben. + <usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/> + </notification> + <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="KickUser"> + Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie wurden von einem Administrator abgemeldet. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="KickAllUsers"> + Beim Hinauswerfen aller Personen vom Grid welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie wurden von einem Administrator abgemeldet. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="FreezeUser"> + Beim Einfrieren dieses Benutzers welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie wurden eingefroren. Bewegen oder Chatten ist nicht mehr möglich. Ein Administrator wird sich über IM an Sie wenden + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="UnFreezeUser"> + Beim Auftauen dieses Benutzers welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie sind nicht mehr eingefroren. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="OfferTeleport"> + Teleport an Ihre Position mit der folgenden Meldung anbieten? + <form name="form"> + <input name="message"> + Triff mich in [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + Benutzer an Ihrem Standort herbeirufen? + <form name="form"> + <input name="message"> + Triff mich in [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + Möchten Sie sich wirklich teleportieren? + <usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> + </notification> + <notification name="TeleportToPick"> + Nach [PICK] teleportieren? + <usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Auswahl 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. + <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. + +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. + +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> + <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> + <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> + <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> + <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> + <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> + <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> + <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> + <notification label="Rauswurf bestätigen" name="EstateKickUser"> + Benutzer [EVIL_USER] von diesem Grundstück werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="EstateChangeCovenant"> + Möchten Sie den Grundstücksvertrag wirklich ändern? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked"> + Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. + +Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. + +Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de + </url> + <usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + 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. + +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. + <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="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. + +Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. + +Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de + </url> + <usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. + </notification> + <notification name="LandClaimAccessBlocked_Change"> + Sie haben aufgrund der Einstellung Ihrer Alterseinstufung keinen Anspruch auf dieses Land. + +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. + <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich auf Land Anspruch erhebe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> + </notification> + <notification name="LandBuyAccessBlocked"> + Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. + +Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. + +Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de + </url> + <usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. + </notification> + <notification name="LandBuyAccessBlocked_Change"> + Sie können aufgrund Ihrer Einstellung für Alterseinstufung dieses Land nicht kaufen. + +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. + <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich Land kaufe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> + </notification> + <notification name="TooManyPrimsSelected"> + "Zu viele Prims wurden ausgewählt. Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut." + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemImportingEstateCovenant"> + Problem beim Import des Grundstückvertrags. + <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. + </notification> + <notification name="ProblemAddingEstateGeneric"> + Problem beim Hinzufügen zu dieser Grundstücksliste. Bei mindestens einem Grundstück ist die Liste voll. + </notification> + <notification name="UnableToLoadNotecardAsset"> + Notizkarten-Asset konnte nicht geladen werden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="NotAllowedToViewNotecard"> + Unzureichende Rechte, um die mit der angeforderten Asset-ID verbundene Notizkarte anzuzeigen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + Asset-ID für Notizkarte fehlt in Datenbank. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + Hinweis: Anzeigengebühren werden nicht zurückerstattet. + +Anzeige für [AMOUNT] L$ veröffentlichen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + Enthält diese Anzeige Mature-Inhalte? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="SetGroupMature"> + Beschäftigt sich diese Gruppe mit Mature-Inhalten? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification label="Neustart bestätigen" name="ConfirmRestart"> + Möchten Sie diese Region in 2 Minuten neu starten? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification label="Nachricht an alle in dieser Region" name="MessageRegion"> + Geben Sie eine kurze Nachricht ein, die an jede Person in dieser Region gesendet wird. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification label="Alterseinstufung der Region ändern" name="RegionMaturityChange"> + Die Alterseinstufung dieser Region wurde aktualisiert. +Es kann eine Weile dauern, bis sich die Änderung auf die Karte auswirkt. + </notification> + <notification label="Falsche Voice-Version" name="VoiceVersionMismatch"> + Diese Version von [APP_NAME] mit dem Voice-Chat-Feature in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren. + </notification> + <notification label="Objekte können nicht gekauft werden" name="BuyObjectOneOwner"> + Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOnly"> + Inhalte können jeweils nur für ein Objekt gekauft werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOwner"> + Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification name="BuyOriginal"> + Von [OWNER] Originalobjekt für [PRICE] L$ kaufen? +Sie werden der Eigentümer dieses Objekts. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + Originalobjekt für [PRICE] L$ kaufen? +Sie werden der Eigentümer dieses Objekts. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + Von [OWNER] Kopie für [PRICE] L$ kaufen? +Das Objekt wird in Ihr Inventar kopiert. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + Kopie für [PRICE] L$ kaufen? +Das Objekt wird in Ihr Inventar kopiert. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyContents"> + Von [OWNER] Inhalte für [PRICE] L$ kaufen? +Die Inhalte werden in Ihr Inventar kopiert. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + Inhalte für [PRICE] L$ kaufen? +Die Inhalte werden in Ihr Inventar kopiert. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmPurchase"> + Transaktion: +[ACTION] + +Möchten Sie diesen Kauf fortsetzen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmPurchasePassword"> + Transaktion: +[ACTION] + +Möchten Sie diesen Kauf fortsetzen? +Geben Sie Ihr Kennwort erneut ein und klicken Sie auf OK. + <form name="form"> + <input name="message"/> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="SetPickLocation"> + Hinweis: +Sie haben die Position dieser Auswahl aktualisiert, aber die anderen Daten behalten ihre ursprünglichen Werte. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. +Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. + +Inventarobjekt(e) verschieben? + <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht kopierbare Artikel aus einem Objekt verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. +Da es sich um ein geskriptetes Objekt handelt, geht die Skriptfunktion beim Verschieben in das Inventar möglicherweise verloren. + +Inventarobjekt(e) verschieben? + <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht-kopierbare Artikel verschiebe, die ein geskriptetes Objekt beschädigen können" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <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."/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt. + </notification> + <notification name="WebLaunchAccountHistory"> + de.secondlife.com öffnen, um Ihre Konto-Statistik anzuzeigen? + <usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> + </notification> + <notification name="ConfirmQuit"> + Wirklich beenden? + <usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + Verwenden Sie dieses Tool, um Verletzungen der [http://secondlife.com/corporate/tos.php?lang=de-DE Servicebedingungen] und [http://secondlife.com/corporate/cs.php?lang=de-DE Community-Standards] zu melden. + +Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen: + +http://secondlife.com/support/incidentreport.php + </notification> + <notification name="HelpReportAbuseEmailEO"> + WICHTIG: Diese Meldung wird an den Eigentümer der Region gesendet, in der Sie sich gerade befinden, nicht an Linden Lab. +- +Als besonderen Service für Einwohner und Besucher übernimmt der Eigentümer dieser Region die Bearbeitung aller anfallenden Meldungen. Von diesem Standort aus eingereichte Meldungen werden nicht von Linden Lab bearbeitet. Der Eigentümer der Region bearbeitet Meldungen auf Grundlage der Richtlinien, die im für diese Region geltenden Grundstücksvertrag festgelegt sind. +(Den Vertrag können Sie unter „Welt“ > „Land-Info“ einsehen.) +- +Das Resultat, das sich aus dieser Meldung ergibt, betrifft nur diese Region; der Einwohnerzugang zu anderen Bereichen von [SECOND_LIFE] ist davon nicht betroffen. Nur Linden Lab kann den Zugang zu [SECOND_LIFE] beschränken. + </notification> + <notification name="HelpReportAbuseSelectCategory"> + Wählen Sie eine Missbrauchskategorie aus. +Die Angabe einer Kategorie hilft uns bei der Bearbeitung des Berichts. + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + Geben Sie den Namen des Täters ein. +Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + Bitte geben Sie den Ort an, an dem der Missbrauch stattgefunden hat. +Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + Bitte geben Sie eine Zusammenfassung des Vorfalls ein. +Eine genaue Zusammenfassung hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + Bitte geben Sie eine ausführliche Beschreibung des Vorfalls ein. +Eine möglichst genaue Beschreibung mit Namen und Einzelheiten hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + Sehr geehrte(r) Einwohner(in), + +Sie melden eine Urheberrechtsverletzung. Sind Sie wirklich sicher, dass Sie eine Verletzung des Urheberrechts melden möchten? + +1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht etwaige Verstöße gegen die [SECOND_LIFE] Community Standards oder die Nutzungsbedingungen und verhängt entsprechende Strafen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen. + +2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÜSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter http://secondlife.com/corporate/dmca.php dargelegten Anweisungen einreichen. + +Wenn Sie mit der Missbrauchmeldung jetzt fortfahren möchten, schließen Sie bitte dieses Fenster und senden Sie Ihren Bericht ein. Möglicherweise müssen Sie Kategorie „CopyBot oder Berechtigungs-Exploit“ auswählen. + +Vielen Dank, + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + Die folgenden erforderlichen Komponenten fehlen in [FLOATER]: +[COMPONENTS] + </notification> + <notification label="Vorhandenen Anhang ersetzen" name="ReplaceAttachment"> + An dieser Körperstelle ist bereits ein Objekt angebracht. +Möchten Sie es mit dem ausgewählten Objekt ersetzen? + <form name="form"> + <ignore name="ignore" save_option="true" text="Einen bestehenden Anhang mit dem ausgewählten Artikel ersetzen"/> + <button ignore="Automatisch ersetzen" name="Yes" text="OK"/> + <button ignore="Nie ersetzen" name="No" text="Abbrechen"/> + </form> + </notification> + <notification label="Beschäftigt-Modus-Warnung" name="BusyModePay"> + Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können. + +Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen? + <form name="form"> + <ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/> + <button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/> + <button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/> + </form> + </notification> + <notification name="ConfirmEmptyTrash"> + Sind Sie sicher, dass Sie den Inhalt Ihres Papierkorbs löschen möchten? + <usetemplate ignoretext="Bestätigen, bevor der Ordner Papierkorb im Inventar geleert wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="ConfirmClearCookies"> + Sind Sie sicher, dass Sie Ihre Cookies löschen möchten? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + Die Liste mit gespeicherten URLs wirklich löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + Sind Sie sicher, dass Sie den Inhalt Ihres Ordners Fundbüro löschen möchten? + <usetemplate ignoretext="Bestätigen, bevor der Ordner Fundbüro im Inventar geleert wird" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="CopySLURL"> + Die folgende SLurl wurde in die Zwischenablage kopiert: + [SLURL] + +Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dieser Position zu ermöglichen. Oder versuchen Sie es selbst: kopieren Sie die SLurl in die Adressleiste eines Webbrowsers. + <form name="form"> + <ignore name="ignore" text="Slurl wurde in meine Zwischenablage kopiert"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + Die gespeicherte Voreinstellung überschreiben? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="WLDeletePresetAlert"> + [SKY] löschen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="WLNoEditDefault"> + Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. + </notification> + <notification name="WLMissingSky"> + Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY]. + </notification> + <notification name="PPSaveEffectAlert"> + Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="NewSkyPreset"> + Wählen Sie einen Namen für den neuen Himmel. + <form name="form"> + <input name="message"> + Neue Voreinstellung + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + Voreinstellung bereits vorhanden! + </notification> + <notification name="NewWaterPreset"> + Wählen Sie einen Namen für die neue Wasservoreinstellung. + <form name="form"> + <input name="message"> + Neue Voreinstellung + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + Voreinstellung bereits vorhanden! + </notification> + <notification name="WaterNoEditDefault"> + Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. + </notification> + <notification name="ChatterBoxSessionStartError"> + Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + Ihre Chat-Sitzung mit [NAME] muss beendet werden. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + Sie können kein Objekt kaufen, während es angehängt ist. + </notification> + <notification label="Info zur Abfrage der Abbucherlaubnis" name="DebitPermissionDetails"> + Wenn Sie dieser Anfrage zustimmen, erhält das Skript die Erlaubnis, regelmäßig Linden-Dollar (L$) von Ihrem Konto abzubuchen. Diese Erlaubnis kann nur zurückgezogen werden, wenn der Eigentümer das Objekt löscht oder die Skripts in dem Objekt zurücksetzt. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + Möchten Sie das neu erstellte Kleidungsstück automatisch anziehen? + <usetemplate ignoretext="Die Kleidung, die während dem Bearbeiten meines Aussehens erstellt wird, sofort anziehen" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="NotAgeVerified"> + Sie müssen altersüberprüft sein, um diesen Bereich betreten zu können. Möchten Sie auf der [SECOND_LIFE]-Webseite Ihr Alter verifizieren lassen? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php?lang=de + </url> + <usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + Um diesen Bereich besuchen zu können, müssen Ihre Zahlungsinformationen gespeichert sein. Möchten Sie diese Einstellung auf der [SECOND_LIFE]-Webseite einrichten? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/index.php?lang=de + </url> + <usetemplate ignoretext="Meine Zahlungsinformation ist nicht gespeichert" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="MissingString"> + Der String „[STRING_NAME]“ fehlt in strings.xml + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + Abgebrochen + </notification> + <notification name="CancelledSit"> + Sitzen beendet + </notification> + <notification name="CancelledAttach"> + Anhängen abgebrochen + </notification> + <notification name="ReplacedMissingWearable"> + Fehlende(s) Kleidung/Körperteil mit Standard ersetzt. + </notification> + <notification name="GroupNotice"> + Betreff: [SUBJECT], Nachricht: [MESSAGE] + </notification> + <notification name="FriendOnline"> + [FIRST] [LAST] ist online + </notification> + <notification name="FriendOffline"> + [FIRST] [LAST] ist offline + </notification> + <notification name="AddSelfFriend"> + Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen. + </notification> + <notification name="UploadingAuctionSnapshot"> + In-Welt- und Website-Fotos werden hochgeladen... +(Dauert ca. 5 Minuten.) + </notification> + <notification name="UploadPayment"> + Sie haben für das Hochladen [AMOUNT] L$ bezahlt. + </notification> + <notification name="UploadWebSnapshotDone"> + Das Website-Foto wurde hochgeladen. + </notification> + <notification name="UploadSnapshotDone"> + In-Welt-Foto hochgeladen + </notification> + <notification name="TerrainDownloaded"> + Terrain.raw heruntergeladen + </notification> + <notification name="GestureMissing"> + Geste [NAME] fehlt in Datenbank. + </notification> + <notification name="UnableToLoadGesture"> + Geste [NAME] konnte nicht geladen werden. +Bitte versuchen Sie es erneut. + </notification> + <notification name="LandmarkMissing"> + Landmarke fehlt in Datenbank. + </notification> + <notification name="UnableToLoadLandmark"> + Landmarke konnte nicht geladen werden. Bitte versuchen Sie es erneut. + </notification> + <notification name="CapsKeyOn"> + Die Umschalttaste ist aktiv. +Dies kann die Eingabe Ihres Passworts beeinflussen. + </notification> + <notification name="NotecardMissing"> + Notizkarte fehlt in Datenbank. + </notification> + <notification name="NotecardNoPermissions"> + Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte. + </notification> + <notification name="RezItemNoPermissions"> + Keine Berechtigung zum Rezzen von Objekten. + </notification> + <notification name="UnableToLoadNotecard"> + Notizkarten-Asset konnte nicht geladen werden. + </notification> + <notification name="ScriptMissing"> + Skript fehlt in Datenbank. + </notification> + <notification name="ScriptNoPermissions"> + Unzureichende Rechte zur Anzeige des Skripts. + </notification> + <notification name="UnableToLoadScript"> + Skript konnte nicht geladen werden. Bitte versuchen Sie es erneut. + </notification> + <notification name="IncompleteInventory"> + Die von Ihnen angebotenen Inhalte sind noch nicht vollständig lokal verfügbar. Warten Sie kurz und wiederholen Sie dann das Angebot. + </notification> + <notification name="CannotModifyProtectedCategories"> + Geschützte Kategorien können nicht geändert werden. + </notification> + <notification name="CannotRemoveProtectedCategories"> + Geschützte Kategorien können nicht entfernt werden. + </notification> + <notification name="OfferedCard"> + Sie haben [FIRST] [LAST] eine Visitenkarte angeboten. + </notification> + <notification name="UnableToBuyWhileDownloading"> + Kauf nicht möglich. Objektdaten werden noch geladen. +Bitte versuchen Sie es erneut. + </notification> + <notification name="UnableToLinkWhileDownloading"> + Verknüpfung nicht möglich. Objektdaten werden noch geladen. +Bitte versuchen Sie es erneut. + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + Sie können nur von einem Eigentümer auf einmal Objekte kaufen. +Wählen Sie ein einzelnes Objekt aus. + </notification> + <notification name="ObjectNotForSale"> + Dieses Objekt wird nicht verkauft. + </notification> + <notification name="EnteringGodMode"> + Gott-Modus aktiviert, Level [LEVEL] + </notification> + <notification name="LeavingGodMode"> + Gott-Modus wird nun de-aktiviert, Level [LEVEL] + </notification> + <notification name="CopyFailed"> + Ihnen fehlt die Berechtigung zum Kopieren. + </notification> + <notification name="InventoryAccepted"> + [NAME] hat Ihr Inventarangebot akzeptiert. + </notification> + <notification name="InventoryDeclined"> + [NAME] hat Ihr Inventarangebot abgelehnt. + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + Ihre Visitenkarte wurde akzeptiert. + </notification> + <notification name="CallingCardDeclined"> + Ihre Visitenkarte wurde abgelehnt. + </notification> + <notification name="TeleportToLandmark"> + Jetzt, nachdem Sie das Mainland erreicht haben, können Sie sich an Positionen wie „[NAME]“ teleportieren, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Landmarken“ auswählen. +Klicken Sie eine Landmarke doppelt an und wählen Sie „Teleportieren“, um an diesen Ort zu gelangen. + </notification> + <notification name="TeleportToPerson"> + Jetzt, nachdem Sie das Mainland erreicht haben, können Sie mit Einwohnern wie „[NAME]“ Kontakt aufnehmen, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Visitenkarten“ auswählen. +Klicken Sie die Karte doppelt an, wählen Sie „Instant Message“ und geben Sie eine Nachricht ein. + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + Land kann nicht über Servergrenzen hinweg ausgewählt werden. +Wählen Sie eine kleinere Landfläche. + </notification> + <notification name="SearchWordBanned"> + 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 (PG, Mature oder Adult). + </notification> + <notification name="GroupVote"> + [NAME] hat eine Abstimmung vorgeschlagen über: +[MESSAGE] + <form name="form"> + <button name="VoteNow" text="Abstimmen"/> + <button name="Later" text="Später"/> + </form> + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + Event-Benachrichtigung: + +[NAME] +[DATE] + <form name="form"> + <button name="Teleport" text="Teleportieren"/> + <button name="Description" text="Beschreibung"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + Alle Objekte auf dieser Parzelle, die an den Käufer der Parzelle übertragen werden, sind jetzt markiert. + +* Übertragene Bäume und Gräser sind nicht markiert. + <form name="form"> + <button name="Done" text="Fertig"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + Gesten mit demselben Trigger wurden deaktiviert: +[NAMES] + </notification> + <notification name="NoQuickTime"> + Apple QuickTime ist auf Ihrem System anscheinend nicht installiert. +Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktime) herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben. + </notification> + <notification name="NoPlugin"> + Es wurde kein Medien-Plugin gefunden, das "[MIME_TYPE]" ausführen kann. Medien dieses Dateityps sind nicht verfügbar. + </notification> + <notification name="MediaPluginFailed"> + Bei folgendem Plugin ist ein Fehler aufgetreten: + [PLUGIN] + +Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kontaktieren Sie bitte den Hersteller. + <form name="form"> + <ignore name="ignore" text="Ein Plugin kann nicht ausgeführt werden"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert. + </notification> + <notification name="OtherObjectsReturned"> + Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert. + </notification> + <notification name="OtherObjectsReturned2"> + Die Objekte von [FIRST] [LAST] auf dieser +Parzelle von „[NAME]“ wurden an ihren Eigentümer zurückgegeben. + </notification> + <notification name="GroupObjectsReturned"> + Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert. +Transferierbare übertragene Objekte wurden an ihre früheren Eigentümer zurückgegeben. +Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht. + </notification> + <notification name="UnOwnedObjectsReturned"> + Alle Objekte auf der ausgewählten Parzelle, die NICHT Ihnen gehören, wurden ihren Eigentümern zurückgegeben. + </notification> + <notification name="NotSafe"> + Auf diesem Land ist Schaden aktiviert. +Verletzungen sind möglich. Wenn Sie sterben, werden Sie zu Ihrem Heimatstandort teleportiert. + </notification> + <notification name="NoFly"> + In diesem Bereich ist das Fliegen deaktiviert. +Fliegen ist hier nicht möglich. + </notification> + <notification name="PushRestricted"> + In diesem Bereich ist Stoßen nicht erlaubt. +Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land. + </notification> + <notification name="NoVoice"> + In diesem Bereich ist Voice deaktiviert. Sie werden niemanden sprechen hören. + </notification> + <notification name="NoBuild"> + In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen. + </notification> + <notification name="ScriptsStopped"> + Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert. + </notification> + <notification name="ScriptsNotRunning"> + In dieser Region werden keine Skipts ausgeführt. + </notification> + <notification name="NoOutsideScripts"> + Auf diesem Land sind externe Skripts deaktiviert + +Hier funktionieren nur Skripts, die dem Landeigentümer gehören. + </notification> + <notification name="ClaimPublicLand"> + Öffentliches Land kann nur in der Region in Besitz genommen werden, in der Sie sich befinden. + </notification> + <notification name="RegionTPAccessBlocked"> + Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Sie müssen eventuell eine Altersüberprüfung vornehmen und/oder den aktuellsten Viewer installieren. + +Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regionen mit dieser Alterseinstufung zu erhalten. + </notification> + <notification name="URBannedFromRegion"> + Sie dürfen diese Region nicht betreten. + </notification> + <notification name="NoTeenGridAccess"> + Ihr Konto kann keine Verbindung zu dieser Teen Grid-Region herstellen. + </notification> + <notification name="ImproperPaymentStatus"> + Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor. + </notification> + <notification name="MustGetAgeParcel"> + Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können. + </notification> + <notification name="NoDestRegion"> + Keine Zielregion gefunden. + </notification> + <notification name="NotAllowedInDest"> + Der Zutritt wurde Ihnen verweigert. + </notification> + <notification name="RegionParcelBan"> + Diese Parzelle ist abgesperrt und kann nicht überquert werden. Versuchen Sie einen anderen Weg. + </notification> + <notification name="TelehubRedirect"> + Sie wurden zu einem Telehub umgeleitet. + </notification> + <notification name="CouldntTPCloser"> + Ein Teleport näher am Ziel ist leider nicht möglich. + </notification> + <notification name="TPCancelled"> + Teleport abgebrochen. + </notification> + <notification name="FullRegionTryAgain"> + Die Region, die Sie betreten möchten, ist im Moment voll. +Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="GeneralFailure"> + Allgemeiner Fehler. + </notification> + <notification name="RoutedWrongRegion"> + In falsche Region umgeleitet. Bitte versuchen Sie es erneut. + </notification> + <notification name="NoValidAgentID"> + Keine gültige Agent ID. + </notification> + <notification name="NoValidSession"> + Keine gültige Sitzungs-ID. + </notification> + <notification name="NoValidCircuit"> + Kein gültiger Verbindungscode. + </notification> + <notification name="NoValidTimestamp"> + Kein gültiger Zeitstempel. + </notification> + <notification name="NoPendingConnection"> + Verbindung kann nicht hergestellt werden. + </notification> + <notification name="InternalUsherError"> + Interner Fehler beim Versuch, Verbindung mit Agent Usher herzustellen. + </notification> + <notification name="NoGoodTPDestination"> + In dieser Region konnte kein gültiges Teleportziel gefunden werden. + </notification> + <notification name="InternalErrorRegionResolver"> + Interner Fehler bei Teleport. + </notification> + <notification name="NoValidLanding"> + Ein gültiger Landpunkt konnte nicht gefunden werden. + </notification> + <notification name="NoValidParcel"> + Es konnte keine gültige Parzelle gefunden werden. + </notification> + <notification name="ObjectGiveItem"> + Das Objekt [OBJECTFROMNAME] von [FIRST] [LAST] hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). + <form name="form"> + <button name="Keep" text="Behalten"/> + <button name="Discard" text="Verwerfen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="ObjectGiveItemUnknownUser"> + Das Objekt [OBJECTFROMNAME] von (unbekannt) hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). + <form name="form"> + <button name="Keep" text="Behalten"/> + <button name="Discard" text="Verwerfen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME] hat Ihnen ein [OBJECTTYPE] namens „[OBJECTNAME]“ gegeben. + <form name="form"> + <button name="Keep" text="Behalten"/> + <button name="Discard" text="Verwerfen"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="Beitreten"/> + <button name="Decline" text="Ablehnen"/> + <button name="Info" text="Info"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME] hat angeboten, Sie zu ihrem/seinem Standort zu teleportieren: + +[MESSAGE] + <form name="form"> + <button name="Teleport" text="Teleportieren"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="Später"/> + <button name="GoNow..." text="Jetzt gehen..."/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME] bietet Ihnen die Freundschaft an. + +[MESSAGE] + +(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.) + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + </form> + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME] bietet Ihnen die Freundschaft an. + +(Sie werden dadurch den gegenseitigen Online-Status sehen können.) + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + [NAME] hat Ihr Freundschaftsangebot akzeptiert. + </notification> + <notification name="FriendshipDeclined"> + [NAME] hat Ihr Freundschaftsangebot abgelehnt. + </notification> + <notification name="OfferCallingCard"> + [FIRST] [LAST] bietet Ihnen eine Visitenkarte an. +Dies erstellt ein Lesezeichen in Ihrem Inventar, damit Sie diesen Einwohner jederzeit über IM erreichen. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + Region wird in [MINUTES] Minuten neu gestartet. +Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. + </notification> + <notification name="RegionRestartSeconds"> + Diese Region wird in [SECONDS] neu gestartet. +Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. + </notification> + <notification name="LoadWebPage"> + Webseite [URL] laden? + +[MESSAGE] + +Von Objekt: [OBJECTNAME], Eigentümer: [NAME]? + <form name="form"> + <button name="Gotopage" text="Zur Seite"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + [TYPE] nicht in Datenbank. + </notification> + <notification name="FailedToFindWearable"> + [TYPE] namens [DESC] nicht in Datenbank. + </notification> + <notification name="InvalidWearable"> + Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um diesen Artikel anziehen zu können. + </notification> + <notification name="ScriptQuestion"> + Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte: + +[QUESTIONS] +Ist das OK? + <form name="form"> + <button name="Yes" text="Ja"/> + <button name="No" text="Nein"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + Ein Objekt namens „[OBJECTNAME]“ des Eigentümers „[NAME]“ möchte: + +[QUESTIONS] +Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen. + +Anfrage gestatten? + <form name="form"> + <button name="Grant" text="Gewähren"/> + <button name="Deny" text="Verweigern"/> + <button name="Details" text="Info..."/> + </form> + </notification> + <notification name="ScriptDialog"> + [FIRST] [LAST]s „[TITLE]“ +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorieren"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + [GROUPNAME]s „[TITLE]“ +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorieren"/> + </form> + </notification> + <notification name="FirstBalanceIncrease"> + Sie haben gerade [AMOUNT] L$ erhalten. +Ihr Kontostand wird oben rechts angezeigt. + </notification> + <notification name="FirstBalanceDecrease"> + Sie haben gerade [AMOUNT] L$ bezahlt. +Ihr Kontostand wird oben rechts angezeigt. + </notification> + <notification name="FirstSit"> + Sie sitzen. +Verwenden Sie die Pfeiltasten (oder AWSD-Tasten), um sich umzusehen. +Um aufzustehen, klicken Sie auf die Schaltfläche „Aufstehen“. + </notification> + <notification name="FirstMap"> + Klicken Sie auf die Karte und bewegen Sie die Maus, um sich auf der Karte umzusehen. +Mit Doppelklick können Sie teleportieren. +Nutzen Sie die Optionen rechts, um Objekte, Einwohner oder Events anzuzeigen und einen anderen Hintergrund auszuwählen. + </notification> + <notification name="FirstBuild"> + Sie haben die Bauwerkzeuge geöffnet. Jedes Objekt, dass Sie sehen wurde mit diesen Werkzeugen gebaut. + </notification> + <notification name="FirstTeleport"> + Sie können nur zu bestimmten Bereichen in dieser Region teleportieren. Der Pfeil deutet zu Ihrem Ziel hin. Klicken Sie auf den Pfeil, um diesen auszublenden. + </notification> + <notification name="FirstOverrideKeys"> + Ihre Bewegungstasten werden jetzt von einem Objekt gesteuert. +Probieren Sie die Pfeil- oder WASD-Tasten aus. +Manche Objekte (wie Waffen) müssen per Mouselook gesteuert werden. +Drücken Sie dazu „M“. + </notification> + <notification name="FirstAppearance"> + Sie bearbeiten gerade Ihr Aussehen. +Verwenden Sie die Pfeiltasten, um sich umzusehen. +Klicken Sie auf „Alles speichern“, wenn Sie fertig sind. + </notification> + <notification name="FirstInventory"> + Dies ist Ihr Inventar. Es enthält Objekte, die Ihnen gehören. + +* Um etwas anzuziehen, ziehen Sie es mit der Maus auf Ihren Avatar. +* Um etwas inworld zu rezzen, ziehen Sie das Objekt auf den Boden. +* Zum Lesen einer Notizkarte klicken Sie sie doppelt an. + </notification> + <notification name="FirstSandbox"> + Dies ist ein Sandkasten. Hier können Einwohner lernen, wie Objekte gebaut werden. + +Objekte, die Sie hier bauen, werden gelöscht, nachdem Sie den Sandkasten verlassen. Vergessen Sie nicht, Ihr Werk mit einem Rechtsklick und der Auswahl „Nehmen“ in Ihrem Inventar zu speichern. + </notification> + <notification name="FirstFlexible"> + Dieses Objekt ist flexibel. Flexible Objekte müssen die Eigenschaft „Phantom“ haben und dürfen nicht „physisch“ sein. + </notification> + <notification name="FirstDebugMenus"> + Sie haben das Menü „Erweitert“ geöffnet. + +Um dieses Menü zu aktivieren bzw. deaktivieren: + Windows Strg-Alt-D + Mac ⌘-Opt-D + </notification> + <notification name="FirstSculptedPrim"> + Sie bearbeiten ein geformtes Primitiv. Geformte Primitive benötigen eine spezielle Textur, die ihre Form definiert. + </notification> + <notification name="MaxListSelectMessage"> + Sie können maximal [MAX_SELECT] Objekte +von der Liste auswählen. + </notification> + <notification name="VoiceInviteP2P"> + [NAME] lädt Sie zu einem Voice-Chat ein. +Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + [FIRST] [LAST] hat eine Instant Message erhalten; die Stummschaltung wurde aufgehoben. + </notification> + <notification name="AutoUnmuteByMoney"> + [FIRST] [LAST] hat Geld erhalten; die Stummschaltung wurde aufgehoben. + </notification> + <notification name="AutoUnmuteByInventory"> + [FIRST] [LAST] wurde ein Inventarobjekt angeboten; die Stummschaltung wurde aufgehoben. + </notification> + <notification name="VoiceInviteGroup"> + [NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten. +Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME] ist einem Voice-Konferenz-Chat beigetreten. +Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME] lädt Sie zu einem Konferenz-Chat ein. +Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + Der Voice-Chat, dem Sie beitreten möchten, [VOICE_CHANNEL_NAME], hat seine maximale Teilnehmerzahl erreicht. Bitte versuchen Sie es erneut. + </notification> + <notification name="ProximalVoiceChannelFull"> + Es tut uns Leid. Dieses Gebiet hat seine maximale Kapazität für Voice-Gespräche erreicht. Bitte versuchen Sie es in einem anderen Gebiet. + </notification> + <notification name="VoiceChannelDisconnected"> + Sie haben [VOICE_CHANNEL_NAME] verlassen. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME] hat das Gespräch beendet. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME] hat Ihren Anruf abgelehnt. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME] ist zurzeit nicht erreichbar. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="VoiceChannelJoinFailed"> + Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="VoiceLoginRetry"> + Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment. + </notification> + <notification name="Cannot enter parcel: not a group member"> + Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten. + </notification> + <notification name="Cannot enter parcel: banned"> + Zugang zur Parzelle verweigert. Sie wurden verbannt. + </notification> + <notification name="Cannot enter parcel: not on access list"> + Zugang zur Parzelle verweigert. Sie stehen nicht auf der Zugangsliste. + </notification> + <notification name="VoiceNotAllowed"> + Sie sind nicht berechtigt, einem Voice-Chat in [VOICE_CHANNEL_NAME] beizutreten. + </notification> + <notification name="VoiceCallGenericError"> + Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen. Bitte versuchen Sie es erneut. + </notification> + <notification name="ServerVersionChanged"> + Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. Klicken Sie hier, um die Versionshinweise anzuzeigen. + </notification> + <notification name="UnsupportedCommandSLURL"> + Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt. + </notification> + <notification name="IMToast"> + <form name="form"> + <button name="respondbutton" text="Antworten"/> + </form> + </notification> + <notification name="AttachmentSaved"> + Der Anhang wurde gespeichert. + </notification> + <notification name="UnableToFindHelpTopic"> + Hilfethema für dieses Element wurde nicht gefunden. + </notification> + <global name="UnsupportedCPU"> + - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. + </global> + <global name="UnsupportedGLRequirements"> + Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem. + +Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT_SITE]. + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - Ihre Grafikkarte entspricht nicht den Mindestanforderungen. + </global> + <global name="UnsupportedRAM"> + - Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen. + </global> + <global name="PermYes"> + Ja + </global> + <global name="PermNo"> + Nein + </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. +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/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml index 4a163c317e2be8c7d76a78afbd78bc84bb978d9d..9ddc31aca56261d7e211c01c9aa864dff5c6fa6c 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml @@ -1,38 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Profile Edit" name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" value="Einwohner"/> - <string name="AcctTypeTrial" value="Test"/> - <string name="AcctTypeCharterMember" value="Charta-Mitglied"/> - <string name="AcctTypeEmployee" value="Linden Lab-Mitarbeiter"/> - <string name="PaymentInfoUsed" value="Zahlungsinfo verwendet"/> - <string name="PaymentInfoOnFile" value="Zahlungsinfo archiviert"/> - <string name="NoPaymentInfoOnFile" value="Keine Zahlungsinfo archiviert"/> - <string name="AgeVerified" value="Altersgeprüft"/> - <string name="NotAgeVerified" value="Nicht altersgeprüft"/> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=de - </string> - <string name="no_partner_text" value="Keiner"/> - <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="Klicken, um ein Bild auszuwählen"/> - </panel> - <icon label="" name="real_world_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/> - <text name="title_homepage_text"> - Webseite: - </text> - <check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/> - <text name="title_acc_status_text" value="Kontostatus:"/> - </panel> - </panel> - </scroll_container> - <panel name="profile_me_buttons_panel"> - <button label="Änderungen speichern" name="save_btn"/> - <button label="Abbrechen" name="cancel_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profile Edit" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="AcctTypeResident" value="Einwohner"/> + <string name="AcctTypeTrial" value="Test"/> + <string name="AcctTypeCharterMember" value="Charta-Mitglied"/> + <string name="AcctTypeEmployee" value="Linden Lab-Mitarbeiter"/> + <string name="PaymentInfoUsed" value="Zahlungsinfo verwendet"/> + <string name="PaymentInfoOnFile" value="Zahlungsinfo archiviert"/> + <string name="NoPaymentInfoOnFile" value="Keine Zahlungsinfo archiviert"/> + <string name="AgeVerified" value="Altersgeprüft"/> + <string name="NotAgeVerified" value="Nicht altersgeprüft"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=de + </string> + <string name="no_partner_text" value="Keiner"/> + <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="Klicken, um ein Bild auszuwählen"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/> + <text name="title_homepage_text"> + Webseite: + </text> + <check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="Kontostatus:"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="Änderungen speichern" name="save_btn"/> + <button label="Abbrechen" name="cancel_btn"/> + </panel> +</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 81a255a14f340f777ca38b6bf4bc295a9aa22a2b..0712722cb3003e64b5767926160112d137c85107 100644 --- a/indra/newview/skins/default/xui/de/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml @@ -1,29 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Mitglied einladen" name="invite_panel"> - <panel.string name="confirm_invite_owner_str"> - Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden! - </panel.string> - <panel.string name="loading"> - (wird geladen...) - </panel.string> - <panel.string name="already_in_group"> - Einige Avatare sind bereits Mitglied und wurden nicht eingeladen. - </panel.string> - <text name="help_text"> - Sie können mehrere Einwohner in 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 Einwohnernamen."/> - <button label="Auswahl aus Liste löschen" name="remove_button" tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen."/> - <text name="role_text"> - Wählen Sie eine Rolle aus: - </text> - <combo_box name="role_name" tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen."/> - <button label="Einladungen versenden" name="ok_button"/> - <button label="Abbrechen" name="cancel_button"/> - <string name="GroupInvitation"> - Gruppeneinladung - </string> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mitglied einladen" name="invite_panel"> + <panel.string name="confirm_invite_owner_str"> + Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden! + </panel.string> + <panel.string name="loading"> + (wird geladen...) + </panel.string> + <panel.string name="already_in_group"> + Einige Avatare sind bereits Mitglied und wurden nicht eingeladen. + </panel.string> + <text name="help_text"> + Sie können mehrere Einwohner in 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 Einwohnernamen."/> + <button label="Auswahl aus Liste löschen" name="remove_button" tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen."/> + <text name="role_text"> + Wählen Sie eine Rolle aus: + </text> + <combo_box name="role_name" tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen."/> + <button label="Einladungen versenden" name="ok_button"/> + <button label="Abbrechen" name="cancel_button"/> + <string name="GroupInvitation"> + Gruppeneinladung + </string> +</panel> 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 fcd8cd358fb262c0026323edca2dce94eb92d8b1..2dd9bf8d5ff26810898b56395f2000361e719a95 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,170 +1,170 @@ -<?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="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] 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_units"> - ( qm ) - </text> - <text name="your_contribution_max_value"> - (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> -<!-- - -<?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> - ---> +<?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="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] 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_units"> + ( qm ) + </text> + <text name="your_contribution_max_value"> + (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> +<!-- + +<?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 137713b77129cbfc973d1098cc6cbdac2ad5cf36..27a2caf9f0c9432a611569229c508a6282c9bf89 100644 --- a/indra/newview/skins/default/xui/de/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml @@ -1,147 +1,147 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Mitteilungen" name="notices_tab"> - <text name="help_text"> - Mitteilungen sind eine schnelle Möglichkeit, -Mitglieder auf dem Laufenden zu halten und -Objekte im Anhang zu versenden. Mitteilungen werden -nur an Mitglieder mit einer entsprechenden Rolle -gesendet. Mitteilungen können unter -„Allgemein“ ausgeschaltet werden. - </text> - <text name="no_notices_text"> - Keine älteren Mitteilungen. - </text> - <button label="?" label_selected="?" name="help_button"/> - <text name="lbl"> - Gruppenmitteilungsarchiv - </text> - <text name="lbl2"> - Mitteilungen werden 14 Tage lang aufbewahrt. Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. - </text> - <scroll_list name="notice_list"> - <column label="" name="icon"/> - <column label="Thema" name="subject"/> - <column label="Von" name="from"/> - <column label="Datum" name="date"/> - </scroll_list> - <text name="notice_list_none_found"> - Nicht gefunden. - </text> - <button label="Neue Mitteilung" label_selected="Neue Mitteilung" name="create_new_notice"/> - <button label="Aktualisieren" label_selected="Liste aktualisieren" name="refresh_notices"/> - <panel label="Neue Mitteilung" name="panel_create_new_notice"> - <text name="lbl"> - Mitteilung schreiben - </text> - <text name="lbl2"> - Sie können ein Objekt zu einer Mitteilung hinzufügen, wenn Sie es aus Ihrem Inventar auf dieses Feld ziehen. Die angehängten Objekte müssen kopier- und übertragbar sein. Ordner können nicht verschickt werden. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <text name="lbl5"> - Anhängen: - </text> - <button label="Anhang entfernen" label_selected="Anhang entfernen" name="remove_attachment"/> - <button label="Senden" label_selected="Senden" name="send_notice"/> - <panel name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."/> - </panel> - <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> - <text name="lbl"> - Archivierte Mitteilung - </text> - <text name="lbl2"> - Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment"/> - </panel> -</panel> -<!-- original file - -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Mitteilungen" name="notices_tab"> - <text name="help_text"> - Mitteilungen sind eine schnelle Möglichkeit, -Mitglieder auf dem Laufenden zu halten und -Objekte im Anhang zu versenden. Mitteilungen werden -nur an Mitglieder mit einer entsprechenden Rolle -gesendet. Mitteilungen können unter -„Allgemein“ ausgeschaltet werden. - </text> - <text name="no_notices_text"> - Keine älteren Mitteilungen. - </text> - <button label="?" label_selected="?" name="help_button" /> - <text name="lbl"> - Gruppenmitteilungsarchiv - </text> - <text name="lbl2"> - Mitteilungen werden 14 Tage lang aufbewahrt. Klicken Sie auf eine Mitteilung, -um sie anzuzeigen. Klicken Sie „Aktualisieren“, um neue Mitteilungen zu suchen. -Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. - </text> - <scroll_list name="notice_list"> - <column label="" name="icon" /> - <column label="Thema" name="subject" /> - <column label="Von" name="from" /> - <column label="Datum" name="date" /> - </scroll_list> - <text name="notice_list_none_found"> - Nicht gefunden. - </text> - <button label="Neue Mitteilung" label_selected="Neue Mitteilung" - name="create_new_notice" /> - <button label="Aktualisieren" label_selected="Liste aktualisieren" - name="refresh_notices" /> - <panel label="Neue Mitteilung" name="panel_create_new_notice"> - <text name="lbl"> - Mitteilung schreiben - </text> - <text name="lbl2"> - Geben Sie einen Betreff für die Mitteilung ein. Sie können der -Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar -in dieses Feld ziehen. Angehängte Objekte müssen kopier- -und transferierbar sein. Ordner können nicht gesendet werden. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <text name="lbl5"> - Anhängen: - </text> - <button label="Anhang entfernen" label_selected="Anhang entfernen" - name="remove_attachment" /> - <button label="Mitteilung senden" label_selected="Mitteilung senden" name="send_notice" /> - <panel name="drop_target" - tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." /> - </panel> - <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> - <text name="lbl"> - Archivierte Mitteilung - </text> - <text name="lbl2"> - Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" /> - </panel> -</panel> - ---> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mitteilungen" name="notices_tab"> + <text name="help_text"> + Mitteilungen sind eine schnelle Möglichkeit, +Mitglieder auf dem Laufenden zu halten und +Objekte im Anhang zu versenden. Mitteilungen werden +nur an Mitglieder mit einer entsprechenden Rolle +gesendet. Mitteilungen können unter +„Allgemein“ ausgeschaltet werden. + </text> + <text name="no_notices_text"> + Keine älteren Mitteilungen. + </text> + <button label="?" label_selected="?" name="help_button"/> + <text name="lbl"> + Gruppenmitteilungsarchiv + </text> + <text name="lbl2"> + Mitteilungen werden 14 Tage lang aufbewahrt. Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. + </text> + <scroll_list name="notice_list"> + <column label="" name="icon"/> + <column label="Thema" name="subject"/> + <column label="Von" name="from"/> + <column label="Datum" name="date"/> + </scroll_list> + <text name="notice_list_none_found"> + Nicht gefunden. + </text> + <button label="Neue Mitteilung" label_selected="Neue Mitteilung" name="create_new_notice"/> + <button label="Aktualisieren" label_selected="Liste aktualisieren" name="refresh_notices"/> + <panel label="Neue Mitteilung" name="panel_create_new_notice"> + <text name="lbl"> + Mitteilung schreiben + </text> + <text name="lbl2"> + Sie können ein Objekt zu einer Mitteilung hinzufügen, wenn Sie es aus Ihrem Inventar auf dieses Feld ziehen. Die angehängten Objekte müssen kopier- und übertragbar sein. Ordner können nicht verschickt werden. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <text name="lbl5"> + Anhängen: + </text> + <button label="Anhang entfernen" label_selected="Anhang entfernen" name="remove_attachment"/> + <button label="Senden" label_selected="Senden" name="send_notice"/> + <panel name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."/> + </panel> + <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> + <text name="lbl"> + Archivierte Mitteilung + </text> + <text name="lbl2"> + Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment"/> + </panel> +</panel> +<!-- original file + +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel label="Mitteilungen" name="notices_tab"> + <text name="help_text"> + Mitteilungen sind eine schnelle Möglichkeit, +Mitglieder auf dem Laufenden zu halten und +Objekte im Anhang zu versenden. Mitteilungen werden +nur an Mitglieder mit einer entsprechenden Rolle +gesendet. Mitteilungen können unter +„Allgemein“ ausgeschaltet werden. + </text> + <text name="no_notices_text"> + Keine älteren Mitteilungen. + </text> + <button label="?" label_selected="?" name="help_button" /> + <text name="lbl"> + Gruppenmitteilungsarchiv + </text> + <text name="lbl2"> + Mitteilungen werden 14 Tage lang aufbewahrt. Klicken Sie auf eine Mitteilung, +um sie anzuzeigen. Klicken Sie „Aktualisieren“, um neue Mitteilungen zu suchen. +Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. + </text> + <scroll_list name="notice_list"> + <column label="" name="icon" /> + <column label="Thema" name="subject" /> + <column label="Von" name="from" /> + <column label="Datum" name="date" /> + </scroll_list> + <text name="notice_list_none_found"> + Nicht gefunden. + </text> + <button label="Neue Mitteilung" label_selected="Neue Mitteilung" + name="create_new_notice" /> + <button label="Aktualisieren" label_selected="Liste aktualisieren" + name="refresh_notices" /> + <panel label="Neue Mitteilung" name="panel_create_new_notice"> + <text name="lbl"> + Mitteilung schreiben + </text> + <text name="lbl2"> + Geben Sie einen Betreff für die Mitteilung ein. Sie können der +Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar +in dieses Feld ziehen. Angehängte Objekte müssen kopier- +und transferierbar sein. Ordner können nicht gesendet werden. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <text name="lbl5"> + Anhängen: + </text> + <button label="Anhang entfernen" label_selected="Anhang entfernen" + name="remove_attachment" /> + <button label="Mitteilung senden" label_selected="Mitteilung senden" name="send_notice" /> + <panel name="drop_target" + tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." /> + </panel> + <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> + <text name="lbl"> + Archivierte Mitteilung + </text> + <text name="lbl2"> + Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" /> + </panel> +</panel> + +--> 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 a8080afeb3c622cc3ba7fcb811252a04d483ac8d..4095deb16b0f7263b57fe2b29b02591276d50ef2 100644 --- a/indra/newview/skins/default/xui/de/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml @@ -1,118 +1,118 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Mitglieder und Rollen" name="roles_tab"> - <panel.string name="default_needs_apply_text"> - Das Unterregister enthält nicht übernommene Änderungen. - </panel.string> - <panel.string name="want_apply_text"> - Diese Änderungen übernehmen? - </panel.string> - <tab_container name="roles_tab_container"> - <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder"> - <panel.string name="help_text"> - Sie können Mitgliedern Rollen zuweisen und entziehen. -Drücken Sie die Strg-Taste und klicken Sie auf Namen, -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="Übereignungen" name="donated"/> - <name_list.columns label="Online" name="online"/> - </name_list> - <button label="Einladen" name="member_invite"/> - <button label="Hinauswerfen" name="member_eject"/> - </panel> - <panel label="Rollen" name="roles_sub_tab"> - <panel.string name="help_text"> - Rollen haben einen Titel und umfassen bestimmte -Fähigkeiten. Mitglieder können mehrere -Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen -definieren, darunter „Jeder“ und „Eigentümer“. - </panel.string> - <panel.string name="cant_delete_role"> - Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden. - </panel.string> - <filter_editor label="Rollen filtern" name="filter_input"/> - <scroll_list name="role_list"> - <scroll_list.columns label="Rolle" name="name"/> - <scroll_list.columns label="Titel" name="title"/> - <scroll_list.columns label="Mitglieder" name="members"/> - </scroll_list> - <button label="Rolle hinzufügen" name="role_create"/> - <button label="Rolle löschen" name="role_delete"/> - </panel> - <panel label="Fähigkeiten" name="actions_sub_tab" tool_tip="Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. Mitglieder über diese Fähigkeit verfügen."> - <panel.string name="help_text"> - Fähigkeiten verleihen Mitgliedern in Rollen bestimmte -Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten. - </panel.string> - <filter_editor label="Fähigkeiten filtern" name="filter_input"/> - <scroll_list name="action_list" tool_tip="Select an Ability to view more details."> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="action"/> - </scroll_list> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - Rollen - </text> - <scroll_list name="member_assigned_roles"> - <scroll_list.columns label="" name="checkbox"/> - <scroll_list.columns label="" name="role"/> - </scroll_list> - <text name="static2"> - Zulässige Fähigkeiten - </text> - <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="action"/> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - Name - </text> - <line_editor name="role_name"> - Angestellte - </line_editor> - <text name="static3"> - Titel - </text> - <line_editor name="role_title"> - (wartet) - </line_editor> - <text name="static2"> - Beschreibung - </text> - <text_editor name="role_description"> - (wartet) - </text_editor> - <text name="static4"> - Mitglieder in Rolle - </text> - <check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/> - <text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle."> - Zulässige Fähigkeiten - </text> - <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> - <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"> - Beschreibung - </text> - <text_editor name="action_description"> - Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden. - </text_editor> - <text name="static2"> - Rollen mit Fähigkeit - </text> - <text name="static3"> - Mitglieder mit Fähigkeit - </text> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mitglieder und Rollen" name="roles_tab"> + <panel.string name="default_needs_apply_text"> + Das Unterregister enthält nicht übernommene Änderungen. + </panel.string> + <panel.string name="want_apply_text"> + Diese Änderungen übernehmen? + </panel.string> + <tab_container name="roles_tab_container"> + <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder"> + <panel.string name="help_text"> + Sie können Mitgliedern Rollen zuweisen und entziehen. +Drücken Sie die Strg-Taste und klicken Sie auf Namen, +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="Übereignungen" name="donated"/> + <name_list.columns label="Online" name="online"/> + </name_list> + <button label="Einladen" name="member_invite"/> + <button label="Hinauswerfen" name="member_eject"/> + </panel> + <panel label="Rollen" name="roles_sub_tab"> + <panel.string name="help_text"> + Rollen haben einen Titel und umfassen bestimmte +Fähigkeiten. Mitglieder können mehrere +Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen +definieren, darunter „Jeder“ und „Eigentümer“. + </panel.string> + <panel.string name="cant_delete_role"> + Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden. + </panel.string> + <filter_editor label="Rollen filtern" name="filter_input"/> + <scroll_list name="role_list"> + <scroll_list.columns label="Rolle" name="name"/> + <scroll_list.columns label="Titel" name="title"/> + <scroll_list.columns label="Mitglieder" name="members"/> + </scroll_list> + <button label="Rolle hinzufügen" name="role_create"/> + <button label="Rolle löschen" name="role_delete"/> + </panel> + <panel label="Fähigkeiten" name="actions_sub_tab" tool_tip="Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. Mitglieder über diese Fähigkeit verfügen."> + <panel.string name="help_text"> + Fähigkeiten verleihen Mitgliedern in Rollen bestimmte +Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten. + </panel.string> + <filter_editor label="Fähigkeiten filtern" name="filter_input"/> + <scroll_list name="action_list" tool_tip="Select an Ability to view more details."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + </tab_container> + <panel name="members_footer"> + <text name="static"> + Rollen + </text> + <scroll_list name="member_assigned_roles"> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="role"/> + </scroll_list> + <text name="static2"> + Zulässige Fähigkeiten + </text> + <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="roles_footer"> + <text name="static"> + Name + </text> + <line_editor name="role_name"> + Angestellte + </line_editor> + <text name="static3"> + Titel + </text> + <line_editor name="role_title"> + (wartet) + </line_editor> + <text name="static2"> + Beschreibung + </text> + <text_editor name="role_description"> + (wartet) + </text_editor> + <text name="static4"> + Mitglieder in Rolle + </text> + <check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/> + <text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle."> + Zulässige Fähigkeiten + </text> + <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> + <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"> + Beschreibung + </text> + <text_editor name="action_description"> + Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden. + </text_editor> + <text name="static2"> + Rollen mit Fähigkeit + </text> + <text name="static3"> + Mitglieder mit Fähigkeit + </text> + </panel> +</panel> 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 487eb07b9e4b2eb473a102a2b13f0b60ced0b113..f84bd24413ae9105ba21063ee8a6c29b50ceb1e1 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 @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_im_control_panel"> - <button label="Profil anzeigen" name="view_profile_btn"/> - <button label="Freund hinzufügen" name="add_friend_btn"/> - <button label="Freigeben" name="share_btn"/> - <panel name="panel_call_buttons"> - <button label="Anrufen" name="call_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <button label="Profil anzeigen" name="view_profile_btn"/> + <button label="Freund hinzufügen" name="add_friend_btn"/> + <button label="Freigeben" name="share_btn"/> + <panel name="panel_call_buttons"> + <button label="Anrufen" name="call_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index dc170ce245faa83c65eb8180d2d1953867385e0a..534bcfc82b380445fa8fc367968a0936b82b8140 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_login"> - <panel.string name="create_account_url"> - http://de.secondlife.com/registration/ - </panel.string> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <panel name="login_widgets"> - <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/> - <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nachname"/> - <text name="start_location_text"> - Startposition: - </text> - <text name="create_new_account_text"> - Neues Konto erstellen - </text> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://de.secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=de + </panel.string> + <panel name="login_widgets"> + <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/> + <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nachname"/> + <text name="start_location_text"> + Startposition: + </text> + <text name="create_new_account_text"> + Neues Konto erstellen + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_me.xml b/indra/newview/skins/default/xui/de/panel_me.xml new file mode 100644 index 0000000000000000000000000000000000000000..a685a430f0b2b33c2ed54fe67fc8dd5311185e6a --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_me.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Ich" name="panel_me"> + <tab_container name="tabs"> + <panel label="Mein Profil" name="panel_profile"/> + <panel label="Auswahl" name="panel_picks"/> + </tab_container> +</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 fb4f3e0f53d0bc0ad64442617a206f4b13714879..6e5b35b0025077b9bc774934bea9a316c9cfcae4 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,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="chat_bar"> - <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."/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <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."/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_pick_info.xml b/indra/newview/skins/default/xui/de/panel_pick_info.xml index 8c1de575e920c0b11169ab0d1a0d3854346b2826..d8939a8ed154c21085c63654fcf2e26cb50eec22 100644 --- a/indra/newview/skins/default/xui/de/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/de/panel_pick_info.xml @@ -1,16 +1,16 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_pick_info"> - <text name="title" value="Auswahl-Info"/> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="pick_name" value="[name]"/> - <text name="pick_location" value="[wird geladen...]"/> - <text name="pick_desc" value="[description]"/> - </panel> - </scroll_container> - <panel name="buttons"> - <button label="Teleportieren" name="teleport_btn"/> - <button label="Karte" name="show_on_map_btn"/> - <button label="Bearbeiten" name="edit_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="Auswahl-Info"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[name]"/> + <text name="pick_location" value="[wird geladen...]"/> + <text name="pick_desc" value="[description]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teleportieren" name="teleport_btn"/> + <button label="Karte" name="show_on_map_btn"/> + <button label="Bearbeiten" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_picks.xml b/indra/newview/skins/default/xui/de/panel_picks.xml index fb25fe89fddbee4f29346928b92d4c9dfc32e31a..e0bc3da88ebcf0b708e68269a8f4d10cdc033c45 100644 --- a/indra/newview/skins/default/xui/de/panel_picks.xml +++ b/indra/newview/skins/default/xui/de/panel_picks.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Auswahl" name="panel_picks"> - <panel label="bottom_panel" name="edit_panel"> - <button name="new_btn" tool_tip="Aktuellen Standort zur Auswahl hinzufügen"/> - </panel> - <panel name="buttons_cucks"> - <button label="Karte" name="show_on_map_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Auswahl" name="panel_picks"> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="Aktuellen Standort zur Auswahl hinzufügen"/> + </panel> + <panel name="buttons_cucks"> + <button label="Karte" name="show_on_map_btn"/> + </panel> +</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 a9526c901490b6852963362868782976ee20c07f..3fa06b17f7dcf7a172688e5fa1a90efc64a19967 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -1,42 +1,42 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Text-Chat" name="chat"> - <radio_group name="chat_font_size"> - <radio_item label="Klein" name="radio"/> - <radio_item label="Mittel" name="radio2"/> - <radio_item label="Groß" name="radio3"/> - </radio_group> - <color_swatch label="Sie" name="user"/> - <text name="text_box1"> - Ich - </text> - <color_swatch label="Andere" name="agent"/> - <text name="text_box2"> - Andere - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="System" name="system"/> - <text name="text_box4"> - System - </text> - <color_swatch label="Skriptfehler" name="script_error"/> - <text name="text_box5"> - Skriptfehler - </text> - <color_swatch label="Objekte" name="objects"/> - <text name="text_box6"> - Objekte - </text> - <color_swatch label="Eigentümer" name="owner"/> - <text name="text_box7"> - Eigentümer - </text> - <color_swatch label="URLs" name="links"/> - <text name="text_box9"> - URLs - </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"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Text-Chat" name="chat"> + <radio_group name="chat_font_size"> + <radio_item label="Klein" name="radio"/> + <radio_item label="Mittel" name="radio2"/> + <radio_item label="Groß" name="radio3"/> + </radio_group> + <color_swatch label="Sie" name="user"/> + <text name="text_box1"> + Ich + </text> + <color_swatch label="Andere" name="agent"/> + <text name="text_box2"> + Andere + </text> + <color_swatch label="IM" name="im"/> + <text name="text_box3"> + IM + </text> + <color_swatch label="System" name="system"/> + <text name="text_box4"> + System + </text> + <color_swatch label="Skriptfehler" name="script_error"/> + <text name="text_box5"> + Skriptfehler + </text> + <color_swatch label="Objekte" name="objects"/> + <text name="text_box6"> + Objekte + </text> + <color_swatch label="Eigentümer" name="owner"/> + <text name="text_box7"> + Eigentümer + </text> + <color_swatch label="URLs" name="links"/> + <text name="text_box9"> + URLs + </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"/> +</panel> 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 7008389dd7f4ac3731d90df942ba78215e610162..ce26e3782b93adab6426dbb4f648d84c17cb58d8 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -1,116 +1,116 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Grafik" name="Display panel"> - <text name="WindowSizeLabel"> - Fenstergröße: - </text> - <check_box label="Vollbildmodus verwenden" name="windowed mode"/> - <combo_box left="115" 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-Größe: - </text> - <text name="QualitySpeed"> - Qualität und Geschwindigkeit: - </text> - <text name="FasterText"> - Schneller - </text> - <text name="BetterText"> - Besser - </text> - <text name="ShadersPrefText"> - Niedrig - </text> - <text name="ShadersPrefText2"> - Mittel - </text> - <text name="ShadersPrefText3"> - Hoch - </text> - <text name="ShadersPrefText4"> - Ultra - </text> - <panel label="CustomGraphics" name="CustomGraphics Panel"> - <text name="ShadersText"> - Shader: - </text> - <check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/> - <check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht."/> - <check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/> - <check_box initial_value="true" label="Wasserreflexionen" name="Reflections"/> - <text name="ReflectionDetailText"> - Spiegelung: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item label="Terrain und Bäume" name="0"/> - <radio_item label="Alle statischen Objekte" name="1"/> - <radio_item label="Alle Avatare und Objekte" name="2"/> - <radio_item label="Alles" name="3"/> - </radio_group> - <text name="AvatarRenderingText"> - Avatar-Darstellung: - </text> - <check_box initial_value="true" label="Ersatzavatare" 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"/> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Max. Partikelzahl:" name="MaxParticleCount"/> - <slider label="Post-Processing-Qualität:" name="RenderPostProcess"/> - <text name="MeshDetailText"> - Gitterdetails: - </text> - <slider label=" Objekte:" name="ObjectMeshDetail"/> - <slider label=" Flexiprimitiva:" name="FlexibleMeshDetail"/> - <slider label=" Bäume:" name="TreeMeshDetail"/> - <slider label=" Avatare:" name="AvatarMeshDetail"/> - <slider label=" Terrain:" name="TerrainMeshDetail"/> - <slider label=" Himmel:" name="SkyMeshDetail"/> - <text name="PostProcessText"> - Niedrig - </text> - <text name="ObjectMeshDetailText"> - Niedrig - </text> - <text name="FlexibleMeshDetailText"> - Niedrig - </text> - <text name="TreeMeshDetailText"> - Niedrig - </text> - <text name="AvatarMeshDetailText"> - Niedrig - </text> - <text name="TerrainMeshDetailText"> - Niedrig - </text> - <text name="SkyMeshDetailText"> - Niedrig - </text> - <text name="LightingDetailText"> - Beleuchtungsdetails: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item label="Nur Sonne und Mond" name="SunMoon"/> - <radio_item label="Lokale Lichtquellen" name="LocalLights"/> - </radio_group> - <text name="TerrainDetailText"> - Terraindetails: - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item label="Niedrig" name="0"/> - <radio_item label="Hoch" name="2"/> - </radio_group> - </panel> - <button label="Übernehmen" label_selected="Übernehmen" name="Apply"/> - <button label="Zurücksetzen" name="Defaults"/> - <button label="Erweitert" name="Advanced"/> - <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Grafik" name="Display panel"> + <text name="WindowSizeLabel"> + Fenstergröße: + </text> + <check_box label="Vollbildmodus verwenden" name="windowed mode"/> + <combo_box left="115" 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-Größe: + </text> + <text name="QualitySpeed"> + Qualität und Geschwindigkeit: + </text> + <text name="FasterText"> + Schneller + </text> + <text name="BetterText"> + Besser + </text> + <text name="ShadersPrefText"> + Niedrig + </text> + <text name="ShadersPrefText2"> + Mittel + </text> + <text name="ShadersPrefText3"> + Hoch + </text> + <text name="ShadersPrefText4"> + Ultra + </text> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Shader: + </text> + <check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/> + <check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht."/> + <check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Wasserreflexionen" name="Reflections"/> + <text name="ReflectionDetailText"> + Spiegelung: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Terrain und Bäume" name="0"/> + <radio_item label="Alle statischen Objekte" name="1"/> + <radio_item label="Alle Avatare und Objekte" name="2"/> + <radio_item label="Alles" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Avatar-Darstellung: + </text> + <check_box initial_value="true" label="Ersatzavatare" 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"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Max. Partikelzahl:" name="MaxParticleCount"/> + <slider label="Post-Processing-Qualität:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Gitterdetails: + </text> + <slider label=" Objekte:" name="ObjectMeshDetail"/> + <slider label=" Flexiprimitiva:" name="FlexibleMeshDetail"/> + <slider label=" Bäume:" name="TreeMeshDetail"/> + <slider label=" Avatare:" name="AvatarMeshDetail"/> + <slider label=" Terrain:" name="TerrainMeshDetail"/> + <slider label=" Himmel:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + Niedrig + </text> + <text name="ObjectMeshDetailText"> + Niedrig + </text> + <text name="FlexibleMeshDetailText"> + Niedrig + </text> + <text name="TreeMeshDetailText"> + Niedrig + </text> + <text name="AvatarMeshDetailText"> + Niedrig + </text> + <text name="TerrainMeshDetailText"> + Niedrig + </text> + <text name="SkyMeshDetailText"> + Niedrig + </text> + <text name="LightingDetailText"> + Beleuchtungsdetails: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="Nur Sonne und Mond" name="SunMoon"/> + <radio_item label="Lokale Lichtquellen" name="LocalLights"/> + </radio_group> + <text name="TerrainDetailText"> + Terraindetails: + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="Niedrig" name="0"/> + <radio_item label="Hoch" name="2"/> + </radio_group> + </panel> + <button label="Übernehmen" label_selected="Übernehmen" name="Apply"/> + <button label="Zurücksetzen" name="Defaults"/> + <button label="Erweitert" name="Advanced"/> + <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/> +</panel> 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 d5305d3cbe3eb8b0ebf6cd6a9d7a3a6a402eb85f..30083deea84ecb63d1fa66eb3156ab4fbfc02fd1 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml @@ -1,20 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Kommunikation" name="im"> - <panel.string name="log_in_to_change"> - Zum Ändern anmelden - </panel.string> - <button label="Cache löschen" name="clear_cache"/> - <text name="cache_size_label_l"> - (Positionen, Bilder, Internet, Suchverlauf) - </text> - <check_box label="Nur Freunden und Gruppen meinen Online-Status mitteilen" name="online_visibility"/> - <check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/> - <check_box label="Nach Beendigung von Anrufen Mikrofon abschalten." name="auto_disengage_mic_check"/> - <check_box label="Cookies annehmen" name="cookies_enabled"/> - <check_box label="Protokoll auf meinem Computer speichern" name="log_instant_messages"/> - <radio_group name="ChatIMLogs"> - <radio_item label="Chat" name="radio1"/> - <radio_item label="IM" name="radio2"/> - </radio_group> - <button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Kommunikation" name="im"> + <panel.string name="log_in_to_change"> + Zum Ändern anmelden + </panel.string> + <button label="Cache löschen" name="clear_cache"/> + <text name="cache_size_label_l"> + (Positionen, Bilder, Internet, Suchverlauf) + </text> + <check_box label="Nur Freunden und Gruppen meinen Online-Status mitteilen" name="online_visibility"/> + <check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/> + <check_box label="Nach Beendigung von Anrufen Mikrofon abschalten." name="auto_disengage_mic_check"/> + <check_box label="Cookies annehmen" name="cookies_enabled"/> + <check_box label="Protokoll auf meinem Computer speichern" name="log_instant_messages"/> + <radio_group name="ChatIMLogs"> + <radio_item label="Chat" name="radio1"/> + <radio_item label="IM" name="radio2"/> + </radio_group> + <button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/> +</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 a2c317acbb17deb8ac2bf53dde250c482c7804bb..ef28bf4cfed47eb83d62f25945980a98f9f9ef5d 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml @@ -1,46 +1,46 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Kamera" name="Input panel"> - <button label="Andere Geräte" name="joystick_setup_button"/> - <text name="Mouselook:"> - Mouselook: - </text> - <text name=" Mouse Sensitivity"> - Mausempfindlichkeit: - </text> - <check_box label="Umkehren" name="invert_mouse"/> - <text name="Network:"> - Netzwerk: - </text> - <text name="Maximum bandwidth"> - Maximale Bandbreite - </text> - <text name="text_box2"> - kbps - </text> - <check_box label="Benutzerdefinierter Port" name="connection_port_enabled"/> - <spinner label="Port-Nummer:" name="web_proxy_port"/> - <text name="cache_size_label_l"> - Cache - </text> - <text name="text_box5"> - MB - </text> - <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/> - <button label="Zurücksetzen" label_selected="Festlegen" name="reset_cache"/> - <text name="Cache location"> - Cache-Ordner - </text> - <text name="Web:"> - Internet: - </text> - <radio_group name="use_external_browser"> - <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Den integrierten Browser für Hilfe, Internetlinks, usw. verwenden. Der Browser wird als eigenständiges Fenster in [APP_NAME] geöffnet."/> - <radio_item label="Meinen Browser verwenden (IE, Firefox)" name="external" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen."/> - </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 Proxys"/> - <button label="Durchsuchen" label_selected="Durchsuchen" name="set_proxy"/> - <text name="Proxy location"> - Proxy-Standort - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Kamera" name="Input panel"> + <button label="Andere Geräte" name="joystick_setup_button"/> + <text name="Mouselook:"> + Mouselook: + </text> + <text name=" Mouse Sensitivity"> + Mausempfindlichkeit: + </text> + <check_box label="Umkehren" name="invert_mouse"/> + <text name="Network:"> + Netzwerk: + </text> + <text name="Maximum bandwidth"> + Maximale Bandbreite + </text> + <text name="text_box2"> + kbps + </text> + <check_box label="Benutzerdefinierter Port" name="connection_port_enabled"/> + <spinner label="Port-Nummer:" name="web_proxy_port"/> + <text name="cache_size_label_l"> + Cache + </text> + <text name="text_box5"> + MB + </text> + <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/> + <button label="Zurücksetzen" label_selected="Festlegen" name="reset_cache"/> + <text name="Cache location"> + Cache-Ordner + </text> + <text name="Web:"> + Internet: + </text> + <radio_group name="use_external_browser"> + <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Den integrierten Browser für Hilfe, Internetlinks, usw. verwenden. Der Browser wird als eigenständiges Fenster in [APP_NAME] geöffnet."/> + <radio_item label="Meinen Browser verwenden (IE, Firefox)" name="external" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen."/> + </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 Proxys"/> + <button label="Durchsuchen" label_selected="Durchsuchen" name="set_proxy"/> + <text name="Proxy location"> + Proxy-Standort + </text> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml index 907803b32f05cb1fdb3f1dc776c2f11d392244b9..c3274acaae2a8fe855afd5a275cb33e6e33f1e77 100644 --- a/indra/newview/skins/default/xui/de/panel_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_profile.xml @@ -1,41 +1,45 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Profil" name="panel_profile"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="payment_update_link_url"> - http://www.secondlife.com/account/billing.php?lang=de-DE - </string> - <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/> - <string name="no_partner_text" value="Keiner"/> - <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="Echtes Leben:"/> - </panel> - <text name="me_homepage_text"> - Webseite: - </text> - <text name="title_member_text" value="Mitglied seit:"/> - <text name="title_acc_status_text" value="Kontostatus:"/> - <text name="title_partner_text" value="Partner:"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="title_groups_text" value="Gruppen:"/> - </panel> - </scroll_container> - <panel name="profile_buttons_panel"> - <button label="Freund hinzufügen" name="add_friend"/> - <button label="IM" name="im"/> - <button label="Anrufen" name="call"/> - <button label="Teleportieren" name="teleport"/> - </panel> - <panel name="profile_me_buttons_panel"> - <button label="Profil bearbeiten" name="edit_profile_btn"/> - <button label="Aussehen bearbeiten" name="edit_appearance_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profil" name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=de-DE + </string> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=de + </string> + <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/> + <string name="no_partner_text" value="Keiner"/> + <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="Echtes Leben:"/> + </panel> + <text name="me_homepage_text"> + Webseite: + </text> + <text name="title_member_text" value="Mitglied seit:"/> + <text name="title_acc_status_text" value="Kontostatus:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <text name="partner_text" value="[FIRST] [LAST]"/> + </panel> + <text name="title_groups_text" value="Gruppen:"/> + </panel> + </scroll_container> + <panel name="profile_buttons_panel"> + <button label="Freund hinzufügen" name="add_friend"/> + <button label="IM" name="im"/> + <button label="Anrufen" name="call"/> + <button label="Teleportieren" name="teleport"/> + </panel> + <panel name="profile_me_buttons_panel"> + <button label="Profil bearbeiten" name="edit_profile_btn"/> + <button label="Aussehen bearbeiten" name="edit_appearance_btn"/> + </panel> +</panel> 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 4ae27907aa0ebe749d0f739362b460d6f120de42..84e1a20bf759c235dd8746862258eef11636cf03 100644 --- a/indra/newview/skins/default/xui/de/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml @@ -1,15 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_target_profile"> - <string name="status_online"> - Online - </string> - <string name="status_offline"> - Offline - </string> - <text name="user_name" value="(wird geladen...)"/> - <text name="status" value="Online"/> - <tab_container name="tabs"> - <panel label="Profil" name="panel_profile"/> - <panel label="Auswahl" name="panel_picks"/> - </tab_container> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + Online + </string> + <string name="status_offline"> + Offline + </string> + <text name="user_name" value="(wird geladen...)"/> + <text name="status" value="Online"/> + <tab_container name="tabs"> + <panel label="Profil" name="panel_profile"/> + <panel label="Auswahl" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml index c1208f19cf5b1e810eddf1eb3af8acaab3967cc1..17970cf2613b23eb23d49f84589ca251e17fe70d 100644 --- a/indra/newview/skins/default/xui/de/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/de/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"> - Wird geladen... - </panel.string> - <panel.string name="can_not_view"> - Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. - </panel.string> - <panel.string name="public_objects_can_not_run"> - Öffentliche Objekte können keine Skripts ausführen - </panel.string> - <panel.string name="script_running"> - Läuft - </panel.string> - <panel.string name="Title"> - Skript: [NAME] - </panel.string> - <text_editor name="Script Editor"> - Wird geladen... - </text_editor> - <button label="Speichern" label_selected="Speichern" name="Save_btn"/> - <combo_box label="Einfügen..." name="Insert..."/> - <menu_bar name="script_menu"> - <menu label="Datei" name="File"> - <menu_item_call label="Speichern" name="Save"/> - <menu_item_call label="Alle Änderungen zurücksetzen" name="Revert All Changes"/> - </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="Alle auswählen" name="Select All"/> - <menu_item_call label="Auswahl aufheben" name="Deselect"/> - <menu_item_call label="Suchen / Ersetzen..." name="Search / Replace..."/> - </menu> - <menu label="Hilfe" name="Help"> - <menu_item_call label="Hilfe..." name="Help..."/> - <menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/> - </menu> - </menu_bar> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + Wird geladen... + </panel.string> + <panel.string name="can_not_view"> + Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. + </panel.string> + <panel.string name="public_objects_can_not_run"> + Öffentliche Objekte können keine Skripts ausführen + </panel.string> + <panel.string name="script_running"> + Läuft + </panel.string> + <panel.string name="Title"> + Skript: [NAME] + </panel.string> + <text_editor name="Script Editor"> + Wird geladen... + </text_editor> + <button label="Speichern" label_selected="Speichern" name="Save_btn"/> + <combo_box label="Einfügen..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="Datei" name="File"> + <menu_item_call label="Speichern" name="Save"/> + <menu_item_call label="Alle Änderungen zurücksetzen" name="Revert All Changes"/> + </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="Alle auswählen" name="Select All"/> + <menu_item_call label="Auswahl aufheben" name="Deselect"/> + <menu_item_call label="Suchen / Ersetzen..." name="Search / Replace..."/> + </menu> + <menu label="Hilfe" name="Help"> + <menu_item_call label="Hilfe..." name="Help..."/> + <menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> 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 59fee002b8bdff5360cfb90d5274f91bb688e375..5b8137af4ad91f5f7885b22f607c6c7a248017d6 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 @@ -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="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/> - <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/> -</panel> +<?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="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/> + <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/> +</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 0ca050c81f2d9b26cba4b5d012eec37cdc65d06f..4ba867e11859edae372891d2819ef4165df6b8bb 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -1,22 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="status"> - <panel.string name="StatBarDaysOfWeek"> - Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag - </panel.string> - <panel.string name="StatBarMonthsOfYear"> - Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember - </panel.string> - <panel.string name="packet_loss_tooltip"> - Paketverlust - </panel.string> - <panel.string name="bandwidth_tooltip"> - Bandbreite - </panel.string> - <panel.string name="buycurrencylabel"> - [AMT] L$ - </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand: Hier klicken, um mehr L$ zu kaufen"/> - <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)"> - 12:00 - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember + </panel.string> + <panel.string name="packet_loss_tooltip"> + Paketverlust + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bandbreite + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand: Hier klicken, um mehr L$ zu kaufen"/> + <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)"> + 12:00 + </text> +</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 d83d32a9525e6102844d9a06668cd7d8f454201e..f7454dd63414f13913d5aa7a440337ff7318284a 100644 --- a/indra/newview/skins/default/xui/de/panel_world_map.xml +++ b/indra/newview/skins/default/xui/de/panel_world_map.xml @@ -1,57 +1,57 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="world_map"> - <panel.string name="Loading"> - Wird geladen... - </panel.string> - <panel.string name="InvalidLocation"> - Ungültige Position - </panel.string> - <panel.string name="world_map_north"> - N - </panel.string> - <panel.string name="world_map_east"> - O - </panel.string> - <panel.string name="world_map_west"> - W - </panel.string> - <panel.string name="world_map_south"> - S - </panel.string> - <panel.string name="world_map_southeast"> - SO - </panel.string> - <panel.string name="world_map_northeast"> - NO - </panel.string> - <panel.string name="world_map_southwest"> - SW - </panel.string> - <panel.string name="world_map_northwest"> - NW - </panel.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="O" name="floater_map_east" text="O"> - O - </text> - <text label="W" name="floater_map_west" text="W"> - W - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SO" name="floater_map_southeast" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northeast" text="NO"> - NO - </text> - <text label="SW" name="floater_map_southwest" text="SW"> - SW - </text> - <text label="NW" name="floater_map_northwest" text="NW"> - NW - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="world_map"> + <panel.string name="Loading"> + Wird geladen... + </panel.string> + <panel.string name="InvalidLocation"> + Ungültige Position + </panel.string> + <panel.string name="world_map_north"> + N + </panel.string> + <panel.string name="world_map_east"> + O + </panel.string> + <panel.string name="world_map_west"> + W + </panel.string> + <panel.string name="world_map_south"> + S + </panel.string> + <panel.string name="world_map_southeast"> + SO + </panel.string> + <panel.string name="world_map_northeast"> + NO + </panel.string> + <panel.string name="world_map_southwest"> + SW + </panel.string> + <panel.string name="world_map_northwest"> + NW + </panel.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="O" name="floater_map_east" text="O"> + O + </text> + <text label="W" name="floater_map_west" text="W"> + W + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SO" name="floater_map_southeast" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northeast" text="NO"> + NO + </text> + <text label="SW" name="floater_map_southwest" text="SW"> + SW + </text> + <text label="NW" name="floater_map_northwest" text="NW"> + NW + </text> +</panel> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index e1ba2025cdde1b04fea27af67ea91e897a8c56f7..86eb8b1479ba97d1c2d309cc8f29faa4cb4164e4 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1,3149 +1,3150 @@ -<?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 - that are returned from one component and may appear in many places--> -<strings> - <string name="SECOND_LIFE"> - Second Life - </string> - <string name="APP_NAME"> - Second Life - </string> - <string name="SECOND_LIFE_GRID"> - Second Life-Grid: - </string> - <string name="SUPPORT_SITE"> - Second Life Support-Portal - </string> - <string name="StartupDetectingHardware"> - Hardware wird erfasst... - </string> - <string name="StartupLoading"> - Wird geladen - </string> - <string name="Fullbright"> - Fullbright (Legacy) - </string> - <string name="LoginInProgress"> - Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten. - </string> - <string name="LoginInProgressNoFrozen"> - Anmeldung erfolgt... - </string> - <string name="LoginAuthenticating"> - Authentifizierung - </string> - <string name="LoginMaintenance"> - Account wird aktualisiert... - </string> - <string name="LoginAttempt"> - Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER] - </string> - <string name="LoginPrecaching"> - Welt wird geladen... - </string> - <string name="LoginInitializingBrowser"> - Integrierter Webbrowser wird initialisiert... - </string> - <string name="LoginInitializingMultimedia"> - Multimedia wird initialisiert... - </string> - <string name="LoginVerifyingCache"> - Cache-Dateien werden überprüft (dauert 60-90 Sekunden)... - </string> - <string name="LoginProcessingResponse"> - Antwort wird verarbeitet... - </string> - <string name="LoginInitializingWorld"> - Welt wird initialisiert... - </string> - <string name="LoginDecodingImages"> - Bilder werden entpackt... - </string> - <string name="LoginInitializingQuicktime"> - QuickTime wird initialisiert... - </string> - <string name="LoginQuicktimeNotFound"> - QuickTime nicht gefunden - Initialisierung nicht möglich. - </string> - <string name="LoginQuicktimeOK"> - QuickTime wurde initialisiert. - </string> - <string name="LoginWaitingForRegionHandshake"> - Region-Handshake... - </string> - <string name="LoginConnectingToRegion"> - Region-Verbindung... - </string> - <string name="LoginDownloadingClothing"> - Kleidung wird geladen... - </string> - <string name="AgentLostConnection"> - In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. - </string> - <string name="TooltipPerson"> - Person - </string> - <string name="TooltipNoName"> - (namenlos) - </string> - <string name="TooltipOwner"> - Eigentümer: - </string> - <string name="TooltipPublic"> - Öffentlich - </string> - <string name="TooltipIsGroup"> - (Gruppe) - </string> - <string name="TooltipForSaleL$"> - Zum Verkauf: [AMOUNT] L$ - </string> - <string name="TooltipFlagGroupBuild"> - Gruppenbau - </string> - <string name="TooltipFlagNoBuild"> - Bauen aus - </string> - <string name="TooltipFlagNoEdit"> - Gruppenbau - </string> - <string name="TooltipFlagNotSafe"> - Unsicher - </string> - <string name="TooltipFlagNoFly"> - Fliegen aus - </string> - <string name="TooltipFlagGroupScripts"> - Gruppenskripte - </string> - <string name="TooltipFlagNoScripts"> - Skripte aus - </string> - <string name="TooltipLand"> - Land: - </string> - <string name="TooltipMustSingleDrop"> - Sie können nur ein einzelnes Objekt hierher ziehen - </string> - <string name="TooltipHttpUrl"> - Anklicken, um Webseite anzuzeigen - </string> - <string name="TooltipSLURL"> - Anklicken, um Informationen zu diesem Standort anzuzeigen - </string> - <string name="TooltipAgentUrl"> - Anklicken, um das Profil dieses Einwohners anzuzeigen - </string> - <string name="TooltipGroupUrl"> - Anklicken, um Beschreibung der Gruppe anzuzeigen - </string> - <string name="TooltipEventUrl"> - Anklicken, um Beschreibung der Veranstaltung anzuzeigen - </string> - <string name="TooltipClassifiedUrl"> - Anklicken, um diese Anzeige anzuzeigen - </string> - <string name="TooltipParcelUrl"> - Anklicken, um Beschreibung der Parzelle anzuzeigen - </string> - <string name="TooltipTeleportUrl"> - Anklicken, um zu diesem Standort zu teleportieren - </string> - <string name="TooltipObjectIMUrl"> - Anklicken, um Beschreibung des Objekts anzuzeigen - </string> - <string name="TooltipSLAPP"> - Anklicken, um Befehl secondlife:// auszuführen - </string> - <string name="BUTTON_CLOSE_DARWIN"> - Schließen (⌘-W) - </string> - <string name="BUTTON_CLOSE_WIN"> - Schließen (Strg+W) - </string> - <string name="BUTTON_RESTORE"> - Wiederherstellen - </string> - <string name="BUTTON_MINIMIZE"> - Minimieren - </string> - <string name="BUTTON_TEAR_OFF"> - Abnehmen - </string> - <string name="BUTTON_DOCK"> - Andocken - </string> - <string name="BUTTON_UNDOCK"> - Abkoppeln - </string> - <string name="BUTTON_HELP"> - Hilfe anzeigen - </string> - <string name="RetrievingData"> - Laden... - </string> - <string name="ReleaseNotes"> - Versionshinweise - </string> - <string name="LoadingData"> - Wird geladen... - </string> - <string name="AvatarNameNobody"> - (niemand) - </string> - <string name="AvatarNameWaiting"> - (wartet) - </string> - <string name="AvatarNameHippos"> - (hippos) - </string> - <string name="GroupNameNone"> - (keiner) - </string> - <string name="AssetErrorNone"> - Kein Fehler - </string> - <string name="AssetErrorRequestFailed"> - Asset-Anforderung: fehlgeschlagen - </string> - <string name="AssetErrorNonexistentFile"> - Asset-Anforderung: Datei existiert nicht - </string> - <string name="AssetErrorNotInDatabase"> - Asset-Anforderung: Asset in Datenbank nicht gefunden - </string> - <string name="AssetErrorEOF"> - Ende der Datei - </string> - <string name="AssetErrorCannotOpenFile"> - Datei kann nicht geöffnet werden - </string> - <string name="AssetErrorFileNotFound"> - Datei nicht gefunden - </string> - <string name="AssetErrorTCPTimeout"> - Zeitüberschreitung bei Dateiübertragung - </string> - <string name="AssetErrorCircuitGone"> - Verbindung verloren - </string> - <string name="AssetErrorPriceMismatch"> - Viewer und Server sind sich nicht über Preis einig - </string> - <string name="AssetErrorUnknownStatus"> - Status unbekannt - </string> - <string name="texture"> - Textur - </string> - <string name="sound"> - Sound - </string> - <string name="calling card"> - Visitenkarte - </string> - <string name="landmark"> - Landmarke - </string> - <string name="legacy script"> - Skript (veraltet) - </string> - <string name="clothing"> - Kleidung - </string> - <string name="object"> - Objekt - </string> - <string name="note card"> - Notizkarte - </string> - <string name="folder"> - Ordner - </string> - <string name="root"> - Hauptverzeichnis - </string> - <string name="lsl2 script"> - LSL2 Skript - </string> - <string name="lsl bytecode"> - LSL Bytecode - </string> - <string name="tga texture"> - tga-Textur - </string> - <string name="body part"> - Körperteil - </string> - <string name="snapshot"> - Foto - </string> - <string name="lost and found"> - Fundbüro - </string> - <string name="targa image"> - targa-Bild - </string> - <string name="trash"> - Papierkorb - </string> - <string name="jpeg image"> - jpeg-Bild - </string> - <string name="animation"> - Animation - </string> - <string name="gesture"> - Geste - </string> - <string name="simstate"> - simstate - </string> - <string name="favorite"> - Favoriten - </string> - <string name="symbolic link"> - Link - </string> - <string name="AvatarAway"> - Abwesend - </string> - <string name="AvatarBusy"> - Beschäftigt - </string> - <string name="AvatarMuted"> - Stummgeschaltet - </string> - <string name="anim_express_afraid"> - Ängstlich - </string> - <string name="anim_express_anger"> - Verärgert - </string> - <string name="anim_away"> - Abwesend - </string> - <string name="anim_backflip"> - Rückwärtssalto - </string> - <string name="anim_express_laugh"> - Lachkrampf - </string> - <string name="anim_express_toothsmile"> - Grinsen - </string> - <string name="anim_blowkiss"> - Kusshand - </string> - <string name="anim_express_bored"> - Gelangweilt - </string> - <string name="anim_bow"> - Verbeugen - </string> - <string name="anim_clap"> - Klatschen - </string> - <string name="anim_courtbow"> - Diener - </string> - <string name="anim_express_cry"> - Weinen - </string> - <string name="anim_dance1"> - Tanz 1 - </string> - <string name="anim_dance2"> - Tanz 2 - </string> - <string name="anim_dance3"> - Tanz 3 - </string> - <string name="anim_dance4"> - Tanz 4 - </string> - <string name="anim_dance5"> - Tanz 5 - </string> - <string name="anim_dance6"> - Tanz 6 - </string> - <string name="anim_dance7"> - Tanz 7 - </string> - <string name="anim_dance8"> - Tanz 8 - </string> - <string name="anim_express_disdain"> - Verachten - </string> - <string name="anim_drink"> - Trinken - </string> - <string name="anim_express_embarrased"> - Verlegen - </string> - <string name="anim_angry_fingerwag"> - Drohen - </string> - <string name="anim_fist_pump"> - Faust pumpen - </string> - <string name="anim_yoga_float"> - Yogaflieger - </string> - <string name="anim_express_frown"> - Stirnrunzeln - </string> - <string name="anim_impatient"> - Ungeduldig - </string> - <string name="anim_jumpforjoy"> - Freudensprung - </string> - <string name="anim_kissmybutt"> - LMA - </string> - <string name="anim_express_kiss"> - Küssen - </string> - <string name="anim_laugh_short"> - Lachen - </string> - <string name="anim_musclebeach"> - Posen - </string> - <string name="anim_no_unhappy"> - Nein (Bedauernd) - </string> - <string name="anim_no_head"> - Nein - </string> - <string name="anim_nyanya"> - Ällabätsch - </string> - <string name="anim_punch_onetwo"> - Eins-Zwei-Punch - </string> - <string name="anim_express_open_mouth"> - Mund offen - </string> - <string name="anim_peace"> - Friede - </string> - <string name="anim_point_you"> - Auf anderen zeigen - </string> - <string name="anim_point_me"> - Auf mich zeigen - </string> - <string name="anim_punch_l"> - Linker Haken - </string> - <string name="anim_punch_r"> - Rechter Haken - </string> - <string name="anim_rps_countdown"> - SSP zählen - </string> - <string name="anim_rps_paper"> - SSP Papier - </string> - <string name="anim_rps_rock"> - SSP Stein - </string> - <string name="anim_rps_scissors"> - SSP Schere - </string> - <string name="anim_express_repulsed"> - Angewidert - </string> - <string name="anim_kick_roundhouse_r"> - Rundkick - </string> - <string name="anim_express_sad"> - Traurig - </string> - <string name="anim_salute"> - Salutieren - </string> - <string name="anim_shout"> - Rufen - </string> - <string name="anim_express_shrug"> - Schulterzucken - </string> - <string name="anim_express_smile"> - Lächeln - </string> - <string name="anim_smoke_idle"> - Zigarette halten - </string> - <string name="anim_smoke_inhale"> - Rauchen - </string> - <string name="anim_smoke_throw_down"> - Zigarette wegwerfen - </string> - <string name="anim_express_surprise"> - Überraschung - </string> - <string name="anim_sword_strike_r"> - Schwerthieb - </string> - <string name="anim_angry_tantrum"> - Wutanfall - </string> - <string name="anim_express_tongue_out"> - Zunge rausstrecken - </string> - <string name="anim_hello"> - Winken - </string> - <string name="anim_whisper"> - Flüstern - </string> - <string name="anim_whistle"> - Pfeifen - </string> - <string name="anim_express_wink"> - Zwinkern - </string> - <string name="anim_wink_hollywood"> - Zwinkern (Hollywood) - </string> - <string name="anim_express_worry"> - Sorgenvoll - </string> - <string name="anim_yes_happy"> - Ja (Erfreut) - </string> - <string name="anim_yes_head"> - Ja - </string> - <string name="texture_loading"> - Wird geladen... - </string> - <string name="worldmap_offline"> - Offline - </string> - <string name="Ok"> - OK - </string> - <string name="Premature end of file"> - Unvollständige Datei - </string> - <string name="ST_NO_JOINT"> - HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. - </string> - <string name="whisper"> - flüstert: - </string> - <string name="shout"> - ruft: - </string> - <string name="ringing"> - Verbindung mit In-Welt-Voice-Chat... - </string> - <string name="connected"> - Verbunden - </string> - <string name="unavailable"> - Der aktuelle Standort unterstützt keine Voice-Kommunikation - </string> - <string name="hang_up"> - Verbindung mit In-Welt-Voice-Chat getrennt - </string> - <string name="ScriptQuestionCautionChatGranted"> - Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Linden-Dollar (L$) von Ihnen nehmen - </string> - <string name="ActOnControlInputs"> - Steuerung festlegen - </string> - <string name="RemapControlInputs"> - Steuerung neu zuweisen - </string> - <string name="AnimateYourAvatar"> - Avatar animieren - </string> - <string name="AttachToYourAvatar"> - An Avatar anhängen - </string> - <string name="ReleaseOwnership"> - Eigentum aufgeben und öffentlich machen - </string> - <string name="LinkAndDelink"> - Mit Objekten verknüpfen und davon trennen - </string> - <string name="AddAndRemoveJoints"> - Verbindungen zu anderen Objekten hinzufügen und entfernen - </string> - <string name="ChangePermissions"> - Berechtigungen ändern - </string> - <string name="TrackYourCamera"> - Kameraverfolgung - </string> - <string name="ControlYourCamera"> - Kamerasteuerung - </string> - <string name="SIM_ACCESS_PG"> - PG - </string> - <string name="SIM_ACCESS_MATURE"> - Mature - </string> - <string name="SIM_ACCESS_ADULT"> - Adult - </string> - <string name="SIM_ACCESS_DOWN"> - Offline - </string> - <string name="SIM_ACCESS_MIN"> - Unbekannt - </string> - <string name="land_type_unknown"> - (unbekannt) - </string> - <string name="all_files"> - Alle Dateien - </string> - <string name="sound_files"> - Sounds - </string> - <string name="animation_files"> - Animationen - </string> - <string name="image_files"> - Bilder - </string> - <string name="save_file_verb"> - Speichern - </string> - <string name="load_file_verb"> - Laden - </string> - <string name="targa_image_files"> - Targa-Bilder - </string> - <string name="bitmap_image_files"> - Bitmap-Bilder - </string> - <string name="avi_movie_file"> - AVI-Filmdatei - </string> - <string name="xaf_animation_file"> - XAF Anim-Datei - </string> - <string name="xml_file"> - XML-Datei - </string> - <string name="dot_raw_file"> - RAW-Datei - </string> - <string name="compressed_image_files"> - Komprimierte Bilder - </string> - <string name="load_files"> - Dateien laden - </string> - <string name="choose_the_directory"> - Verzeichnis auswählen - </string> - <string name="AvatarSetNotAway"> - Als anwesend anzeigen - </string> - <string name="AvatarSetAway"> - Als abwesend anzeigen - </string> - <string name="AvatarSetNotBusy"> - Als nicht beschäftigt anzeigen - </string> - <string name="AvatarSetBusy"> - Als beschäftigt anzeigen - </string> - <string name="shape"> - Form - </string> - <string name="skin"> - Haut - </string> - <string name="hair"> - Haare - </string> - <string name="eyes"> - Augen - </string> - <string name="shirt"> - Hemd - </string> - <string name="pants"> - Hose - </string> - <string name="shoes"> - Schuhe - </string> - <string name="socks"> - Socken - </string> - <string name="jacket"> - Jacke - </string> - <string name="gloves"> - Handschuhe - </string> - <string name="undershirt"> - Unterhemd - </string> - <string name="underpants"> - Unterhose - </string> - <string name="skirt"> - Rock - </string> - <string name="invalid"> - ungültig - </string> - <string name="BodyPartsRightArm"> - Rechter Arm - </string> - <string name="BodyPartsHead"> - Kopf - </string> - <string name="BodyPartsLeftArm"> - Linker Arm - </string> - <string name="BodyPartsLeftLeg"> - Linkes Bein - </string> - <string name="BodyPartsTorso"> - Oberkörper - </string> - <string name="BodyPartsRightLeg"> - Rechtes Bein - </string> - <string name="GraphicsQualityLow"> - Niedrig - </string> - <string name="GraphicsQualityMid"> - Mittel - </string> - <string name="GraphicsQualityHigh"> - Hoch - </string> - <string name="LeaveMouselook"> - ESC drücken, um zur Normalansicht zurückzukehren - </string> - <string name="InventoryNoMatchingItems"> - Im Inventar wurden keine passenden Artikel gefunden. - </string> - <string name="InventoryNoTexture"> - Sie haben keine Kopie dieser Textur in Ihrem Inventar. - </string> - <string name="LoadingContents"> - Inhalte werden geladen... - </string> - <string name="NoContents"> - Keine Inhalte - </string> - <string name="InvFolder My Inventory"> - Mein Inventar - </string> - <string name="InvFolder My Favorites"> - Meine Favoriten - </string> - <string name="InvFolder Library"> - Bibliothek - </string> - <string name="InvFolder Textures"> - Texturen - </string> - <string name="InvFolder Sounds"> - Sounds - </string> - <string name="InvFolder Calling Cards"> - Visitenkarten - </string> - <string name="InvFolder Landmarks"> - Landmarken - </string> - <string name="InvFolder Scripts"> - Skripts - </string> - <string name="InvFolder Clothing"> - Kleidung - </string> - <string name="InvFolder Objects"> - Objekte - </string> - <string name="InvFolder Notecards"> - Notizkarten - </string> - <string name="InvFolder New Folder"> - Neuer Ordner - </string> - <string name="InvFolder Inventory"> - Inventar - </string> - <string name="InvFolder Uncompressed Images"> - Nicht-Komprimierte Bilder - </string> - <string name="InvFolder Body Parts"> - Körperteile - </string> - <string name="InvFolder Trash"> - Papierkorb - </string> - <string name="InvFolder Photo Album"> - Fotoalbum - </string> - <string name="InvFolder Lost And Found"> - Fundbüro - </string> - <string name="InvFolder Uncompressed Sounds"> - Nicht-Komprimierte Sounds - </string> - <string name="InvFolder Animations"> - Animationen - </string> - <string name="InvFolder Gestures"> - Gesten - </string> - <string name="InvFolder favorite"> - Favoriten - </string> - <string name="InvFolder Current Outfit"> - Aktuelles Outfit - </string> - <string name="InvFolder My Outfits"> - Meine Outfits - </string> - <string name="InvFolder Friends"> - Freunde - </string> - <string name="InvFolder All"> - Alle - </string> - <string name="Buy"> - Kaufen - </string> - <string name="BuyforL$"> - Kaufen für L$ - </string> - <string name="Stone"> - Stein - </string> - <string name="Metal"> - Metall - </string> - <string name="Glass"> - Glas - </string> - <string name="Wood"> - Holz - </string> - <string name="Flesh"> - Fleisch - </string> - <string name="Plastic"> - Plastik - </string> - <string name="Rubber"> - Gummi - </string> - <string name="Light"> - Licht - </string> - <string name="KBShift"> - Umschalt-Taste - </string> - <string name="KBCtrl"> - Strg - </string> - <string name="Chest"> - Brust - </string> - <string name="Skull"> - Schädel - </string> - <string name="Left Shoulder"> - Linke Schulter - </string> - <string name="Right Shoulder"> - Rechte Schulter - </string> - <string name="Left Hand"> - Linke Hand - </string> - <string name="Right Hand"> - Rechte Hand - </string> - <string name="Left Foot"> - Linker Fuß - </string> - <string name="Right Foot"> - Rechter Fuß - </string> - <string name="Spine"> - Wirbelsäule - </string> - <string name="Pelvis"> - Becken - </string> - <string name="Mouth"> - Mund - </string> - <string name="Chin"> - Kinn - </string> - <string name="Left Ear"> - Linkes Ohr - </string> - <string name="Right Ear"> - Rechtes Ohr - </string> - <string name="Left Eyeball"> - Linker Augapfel - </string> - <string name="Right Eyeball"> - Rechter Augapfel - </string> - <string name="Nose"> - Nase - </string> - <string name="R Upper Arm"> - R Oberarm - </string> - <string name="R Forearm"> - R Unterarm - </string> - <string name="L Upper Arm"> - L Oberarm - </string> - <string name="L Forearm"> - L Unterarm - </string> - <string name="Right Hip"> - Rechte Hüfte - </string> - <string name="R Upper Leg"> - R Oberschenkel - </string> - <string name="R Lower Leg"> - R Unterschenkel - </string> - <string name="Left Hip"> - Linke Hüfte - </string> - <string name="L Upper Leg"> - L Oberschenkel - </string> - <string name="L Lower Leg"> - L Unterschenkel - </string> - <string name="Stomach"> - Bauch - </string> - <string name="Left Pec"> - Linke Brust - </string> - <string name="Right Pec"> - Rechts - </string> - <string name="YearsMonthsOld"> - [AGEYEARS] [AGEMONTHS] alt - </string> - <string name="YearsOld"> - [AGEYEARS] alt - </string> - <string name="MonthsOld"> - [AGEMONTHS] alt - </string> - <string name="WeeksOld"> - [AGEWEEKS] alt - </string> - <string name="DaysOld"> - [AGEDAYS] alt - </string> - <string name="TodayOld"> - Seit heute Mitglied - </string> - <string name="AgeYearsA"> - [COUNT] Jahr - </string> - <string name="AgeYearsB"> - [COUNT] Jahre - </string> - <string name="AgeYearsC"> - [COUNT] Jahre - </string> - <string name="AgeMonthsA"> - [COUNT] Monat - </string> - <string name="AgeMonthsB"> - [COUNT] Monate - </string> - <string name="AgeMonthsC"> - [COUNT] Monate - </string> - <string name="AgeWeeksA"> - [COUNT] Woche - </string> - <string name="AgeWeeksB"> - [COUNT] Wochen - </string> - <string name="AgeWeeksC"> - [COUNT] Wochen - </string> - <string name="AgeDaysA"> - [COUNT] Tag - </string> - <string name="AgeDaysB"> - [COUNT] Tage - </string> - <string name="AgeDaysC"> - [COUNT] Tage - </string> - <string name="AcctTypeResident"> - Einwohner - </string> - <string name="AcctTypeTrial"> - Test - </string> - <string name="AcctTypeCharterMember"> - Charta-Mitglied - </string> - <string name="AcctTypeEmployee"> - Linden Lab-Mitarbeiter - </string> - <string name="PaymentInfoUsed"> - Zahlungsinfo verwendet - </string> - <string name="PaymentInfoOnFile"> - Zahlungsinfo archiviert - </string> - <string name="NoPaymentInfoOnFile"> - Keine Zahlungsinfo archiviert - </string> - <string name="AgeVerified"> - Altersgeprüft - </string> - <string name="NotAgeVerified"> - Nicht altersgeprüft - </string> - <string name="Center 2"> - Mitte 2 - </string> - <string name="Top Right"> - Oben rechts - </string> - <string name="Top"> - Oben - </string> - <string name="Top Left"> - Oben links - </string> - <string name="Center"> - Zentrieren - </string> - <string name="Bottom Left"> - Unten links - </string> - <string name="Bottom"> - Unten - </string> - <string name="Bottom Right"> - Unten rechts - </string> - <string name="CompileQueueDownloadedCompiling"> - Heruntergeladen, wird kompiliert - </string> - <string name="CompileQueueScriptNotFound"> - Skript wurde auf Server nicht gefunden. - </string> - <string name="CompileQueueProblemDownloading"> - Beim Herunterladen ist ein Problem aufgetreten - </string> - <string name="CompileQueueInsufficientPermDownload"> - Unzureichende Rechte zum Herunterladen eines Skripts. - </string> - <string name="CompileQueueInsufficientPermFor"> - Unzureichende Berechtigungen für - </string> - <string name="CompileQueueUnknownFailure"> - Unbekannter Fehler beim Herunterladen - </string> - <string name="CompileQueueTitle"> - Rekompilierung - </string> - <string name="CompileQueueStart"> - rekompilieren - </string> - <string name="ResetQueueTitle"> - Zurücksetzen - </string> - <string name="ResetQueueStart"> - Zurücksetzen - </string> - <string name="RunQueueTitle"> - Skript ausführen - </string> - <string name="RunQueueStart"> - Skript ausführen - </string> - <string name="NotRunQueueTitle"> - Skript anhalten - </string> - <string name="NotRunQueueStart"> - Skript anhalten - </string> - <string name="CompileSuccessful"> - Kompilieren erfolgreich abgeschlossen! - </string> - <string name="CompileSuccessfulSaving"> - Kompilieren erfolgreich abgeschlossen, speichern... - </string> - <string name="SaveComplete"> - Speichervorgang abgeschlossen. - </string> - <string name="ObjectOutOfRange"> - Skript (Objekt außerhalb des Bereichs) - </string> - <string name="GodToolsObjectOwnedBy"> - Objekt [OBJECT], Besitzer [OWNER] - </string> - <string name="GroupsNone"> - keine - </string> - <string name="Unknown"> - (unbekannt) - </string> - <string name="Balance"> - Kontostand - </string> - <string name="Credits"> - Danksagung - </string> - <string name="Debits"> - Soll - </string> - <string name="Total"> - Gesamtbetrag - </string> - <string name="NoGroupDataFound"> - Für Gruppe wurden keine Gruppendaten gefunden - </string> - <string name="IMParentEstate"> - parent estate - </string> - <string name="IMMainland"> - Mainland - </string> - <string name="IMTeen"> - Teen - </string> - <string name="RegionInfoError"> - Fehler - </string> - <string name="RegionInfoAllEstatesOwnedBy"> - alle Grundstücke gehören [OWNER] - </string> - <string name="RegionInfoAllEstatesYouOwn"> - alle Grundstücke, die Ihnen gehört haben - </string> - <string name="RegionInfoAllEstatesYouManage"> - alle Grundstücke, die Sie für [OWNER] verwaltet haben - </string> - <string name="RegionInfoAllowedResidents"> - Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS]) - </string> - <string name="RegionInfoAllowedGroups"> - Zulässige Gruppen: ([ALLOWEDGROUPS], max [MAXACCESS]) - </string> - <string name="CursorPos"> - Zeile [LINE], Spalte [COLUMN] - </string> - <string name="PanelDirCountFound"> - [COUNT] gefunden - </string> - <string name="PanelContentsNewScript"> - Neues Skript - </string> - <string name="MuteByName"> - (nach Namen) - </string> - <string name="MuteAgent"> - (Einwohner) - </string> - <string name="MuteObject"> - (Objekt) - </string> - <string name="MuteGroup"> - (Gruppe) - </string> - <string name="RegionNoCovenant"> - Für dieses Grundstück 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: - </string> - <string name="GroupOwned"> - In Gruppenbesitz - </string> - <string name="Public"> - Öffentlich - </string> - <string name="ClassifiedClicksTxt"> - Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil - </string> - <string name="ClassifiedUpdateAfterPublish"> - (wird nach Veröffentlichung aktualisiert) - </string> - <string name="GroupVoteYes"> - Ja - </string> - <string name="GroupVoteNo"> - Nein - </string> - <string name="GroupVoteNoActiveProposals"> - Zurzeit sind keine Umfragen aktiv - </string> - <string name="GroupVoteNoArchivedProposals"> - Zurzeit sind keine Umfragen aktiv - </string> - <string name="GroupVoteRetrievingArchivedProposals"> - Archivierte Umfragen werden geladen - </string> - <string name="GroupVoteRetrievingActiveProposals"> - Aktive Umfragen werden geladen - </string> - <string name="MultiPreviewTitle"> - Vorschau - </string> - <string name="MultiPropertiesTitle"> - Eigenschaften - </string> - <string name="InvOfferAnObjectNamed"> - Ein Objekt namens - </string> - <string name="InvOfferOwnedByGroup"> - im Besitz der Gruppe - </string> - <string name="InvOfferOwnedByUnknownGroup"> - im Besitz einer unbekannten Gruppe - </string> - <string name="InvOfferOwnedBy"> - im Besitz von - </string> - <string name="InvOfferOwnedByUnknownUser"> - im Besitz eines unbekannten Einwohners - </string> - <string name="InvOfferGaveYou"> - hat Ihnen folgendes übergeben - </string> - <string name="InvOfferYouDecline"> - Sie lehnen folgendes ab: - </string> - <string name="InvOfferFrom"> - von - </string> - <string name="GroupMoneyTotal"> - Gesamtbetrag - </string> - <string name="GroupMoneyBought"> - gekauft - </string> - <string name="GroupMoneyPaidYou"> - bezahlte Ihnen - </string> - <string name="GroupMoneyPaidInto"> - bezahlte an - </string> - <string name="GroupMoneyBoughtPassTo"> - kaufte Pass für - </string> - <string name="GroupMoneyPaidFeeForEvent"> - bezahlte Gebühr für Event - </string> - <string name="GroupMoneyPaidPrizeForEvent"> - bezahlte Preis für Event - </string> - <string name="GroupMoneyBalance"> - Kontostand - </string> - <string name="GroupMoneyCredits"> - Danksagung - </string> - <string name="GroupMoneyDebits"> - Soll - </string> - <string name="ViewerObjectContents"> - Inhalte - </string> - <string name="AcquiredItems"> - Erworbene Artikel - </string> - <string name="Cancel"> - Abbrechen - </string> - <string name="UploadingCosts"> - Hochladen von %s kostet - </string> - <string name="UnknownFileExtension"> - Unbekanntes Dateiformat .%s -Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh - </string> - <string name="AddLandmarkNavBarMenu"> - Landmarke hinzufügen... - </string> - <string name="EditLandmarkNavBarMenu"> - Landmarke bearbeiten... - </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"> - Strg+ - </string> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Umschalt+ - </string> - <string name="FileSaved"> - Datei wurde gespeichert - </string> - <string name="Receiving"> - Daten werden empfangen - </string> - <string name="AM"> - Uhr - </string> - <string name="PM"> - Uhr - </string> - <string name="PST"> - PST - </string> - <string name="PDT"> - PDT - </string> - <string name="Forward"> - Vorwärts - </string> - <string name="Left"> - Links - </string> - <string name="Right"> - Rechts - </string> - <string name="Back"> - Zurück - </string> - <string name="North"> - Norden - </string> - <string name="South"> - Süden - </string> - <string name="West"> - Westen - </string> - <string name="East"> - Osten - </string> - <string name="Up"> - Nach oben - </string> - <string name="Down"> - Nach unten - </string> - <string name="Any Category"> - Alle Kategorien - </string> - <string name="Shopping"> - Shopping - </string> - <string name="Land Rental"> - Land mieten - </string> - <string name="Property Rental"> - Immobilie mieten - </string> - <string name="Special Attraction"> - Attraktionen - </string> - <string name="New Products"> - Neue Produkte - </string> - <string name="Employment"> - Stellenangebote - </string> - <string name="Wanted"> - Gesucht - </string> - <string name="Service"> - Dienstleistungen - </string> - <string name="Personal"> - Verschiedenes - </string> - <string name="None"> - Keiner - </string> - <string name="Linden Location"> - Lindenort - </string> - <string name="Adult"> - Adult - </string> - <string name="Arts&Culture"> - Kunst & Kultur - </string> - <string name="Business"> - Business - </string> - <string name="Educational"> - Bildung - </string> - <string name="Gaming"> - Spielen - </string> - <string name="Hangout"> - Treffpunkt - </string> - <string name="Newcomer Friendly"> - Anfängergerecht - </string> - <string name="Parks&Nature"> - Parks und Natur - </string> - <string name="Residential"> - Wohngebiet - </string> - <string name="Stage"> - Phase - </string> - <string name="Other"> - Sonstige - </string> - <string name="Any"> - Alle - </string> - <string name="You"> - Sie - </string> - <string name=":"> - : - </string> - <string name=","> - , - </string> - <string name="..."> - ... - </string> - <string name="***"> - *** - </string> - <string name="("> - ( - </string> - <string name=")"> - ) - </string> - <string name="."> - . - </string> - <string name="'"> - ' - </string> - <string name="---"> - --- - </string> - <string name="MBCmdLineError"> - Beim Parsen der Befehlszeile wurde ein Fehler festgestellt. -Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN) -Fehler: - </string> - <string name="MBCmdLineUsg"> - [APP_NAME] Verwendung in Befehlszeile: - </string> - <string name="MBUnableToAccessFile"> - [APP_NAME] kann auf die erforderliche Datei nicht zugreifen. - -Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet. -Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal. -Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren. - </string> - <string name="MBFatalError"> - Unbehebbarer Fehler - </string> - <string name="MBRequiresAltiVec"> - [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später). - </string> - <string name="MBAlreadyRunning"> - [APP_NAME] läuft bereits. -Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden. -Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu. - </string> - <string name="MBFrozenCrashed"> - [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt. -Möchten Sie einen Absturz-Bericht einschicken? - </string> - <string name="MBAlert"> - Alarm - </string> - <string name="MBNoDirectX"> - [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen. -[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird. - -Möchten Sie fortfahren? - </string> - <string name="MBWarning"> - Hinweis - </string> - <string name="MBNoAutoUpdate"> - Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich. -Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. - </string> - <string name="MBRegClassFailed"> - RegisterClass fehlgeschlagen - </string> - <string name="MBError"> - Fehler - </string> - <string name="MBFullScreenErr"> - Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden. -Ausführung erfolgt in Fenster. - </string> - <string name="MBDestroyWinFailed"> - Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen) - </string> - <string name="MBShutdownErr"> - Fehler beim Herunterfahren - </string> - <string name="MBDevContextErr"> - Kann keinen Kontext für GL-Gerät erstellen - </string> - <string name="MBPixelFmtErr"> - Passendes Pixelformat wurde nicht gefunden - </string> - <string name="MBPixelFmtDescErr"> - Beschreibung für Pixelformat nicht verfügbar - </string> - <string name="MBTrueColorWindow"> - Um [APP_NAME] in einem Fenster auszuführen, ist True Color (32-bit) erforderlich. -Klicken Sie auf Systemsteuerung > Anzeige > Einstellungen und stellen Sie den Bildschirm auf 32-bit Farbe ein. -Wenn Sie die Anwendung im Modus Vollbildschirm ausführen möchten, dann wird [APP_NAME] den Bildschirm automatisch während der Ausführung anpassen. - </string> - <string name="MBAlpha"> - [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte. -Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben. -Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung > Anzeige > Einstellungen). -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - </string> - <string name="MBPixelFmtSetErr"> - Pixel-Format kann nicht eingestellt werden. - </string> - <string name="MBGLContextErr"> - Kann keinen Kontext für GL-Gerät erstellen - </string> - <string name="MBGLContextActErr"> - Kann keinen Kontext für GL-Gerät aktivieren - </string> - <string name="MBVideoDrvErr"> - [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut. - -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - </string> - <string name="5 O'Clock Shadow"> - Bartschatten - </string> - <string name="All White"> - Ganz weiß - </string> - <string name="Anime Eyes"> - Anime-Augen - </string> - <string name="Arced"> - Gewölbt - </string> - <string name="Arm Length"> - Armlänge - </string> - <string name="Attached"> - Angewachsen - </string> - <string name="Attached Earlobes"> - Angewachsene Ohrläppchen - </string> - <string name="Back Bangs"> - Nackenhaar - </string> - <string name="Back Bangs Down"> - Lang - </string> - <string name="Back Bangs Up"> - Kurz - </string> - <string name="Back Fringe"> - Nackenfransen - </string> - <string name="Back Hair"> - Hinterkopfhaar - </string> - <string name="Back Hair Down"> - lang - </string> - <string name="Back Hair Up"> - kurz - </string> - <string name="Baggy"> - Tränensäcke - </string> - <string name="Bangs"> - Pony - </string> - <string name="Bangs Down"> - Pony lang - </string> - <string name="Bangs Up"> - Pony kurz - </string> - <string name="Beady Eyes"> - Knopfaugen - </string> - <string name="Belly Size"> - Bauchgröße - </string> - <string name="Big"> - Groß - </string> - <string name="Big Butt"> - Großer Hintern - </string> - <string name="Big Eyeball"> - Großer Augapfel - </string> - <string name="Big Hair Back"> - Volumen: Hinten - </string> - <string name="Big Hair Front"> - Volumen: Vorne - </string> - <string name="Big Hair Top"> - Volumen: Oben - </string> - <string name="Big Head"> - Großer Kopf - </string> - <string name="Big Pectorals"> - Große Brustmuskeln - </string> - <string name="Big Spikes"> - Große Stacheln - </string> - <string name="Black"> - Schwarz - </string> - <string name="Blonde"> - Blond - </string> - <string name="Blonde Hair"> - Blondes Haar - </string> - <string name="Blush"> - Rouge - </string> - <string name="Blush Color"> - Rougefarbe - </string> - <string name="Blush Opacity"> - Rouge Deckkraft - </string> - <string name="Body Definition"> - Körperkonturen - </string> - <string name="Body Fat"> - Körperfett - </string> - <string name="Body Freckles"> - Sommersprossen - </string> - <string name="Body Thick"> - Körper - breit - </string> - <string name="Body Thickness"> - Körperbreite - </string> - <string name="Body Thin"> - Körper - schmal - </string> - <string name="Bow Legged"> - o-beinig - </string> - <string name="Breast Buoyancy"> - Brust, Straffheit - </string> - <string name="Breast Cleavage"> - Dekolleté - </string> - <string name="Breast Size"> - Brustgröße - </string> - <string name="Bridge Width"> - Rückenbreite - </string> - <string name="Broad"> - Breit - </string> - <string name="Brow Size"> - Brauengröße - </string> - <string name="Bug Eyes"> - Glubschaugen - </string> - <string name="Bugged Eyes"> - Hervortretend - </string> - <string name="Bulbous"> - Knollennase - </string> - <string name="Bulbous Nose"> - Knollennase - </string> - <string name="Bushy Eyebrows"> - Buschige Augenbrauen - </string> - <string name="Bushy Hair"> - Buschiges Haar - </string> - <string name="Butt Size"> - Hintern, Größe - </string> - <string name="bustle skirt"> - Tournürenrock - </string> - <string name="no bustle"> - Ohne - </string> - <string name="more bustle"> - Mit - </string> - <string name="Chaplin"> - Chaplin - </string> - <string name="Cheek Bones"> - Wangenknochen - </string> - <string name="Chest Size"> - Brustgröße - </string> - <string name="Chin Angle"> - Kinnwinkel - </string> - <string name="Chin Cleft"> - Kinnspalte - </string> - <string name="Chin Curtains"> - Schifferfräse - </string> - <string name="Chin Depth"> - Kinnlänge - </string> - <string name="Chin Heavy"> - Kinn ausgeprägt - </string> - <string name="Chin In"> - Kinn zurück - </string> - <string name="Chin Out"> - Kinn nach vorne - </string> - <string name="Chin-Neck"> - Kinn-Hals - </string> - <string name="Clear"> - Löschen - </string> - <string name="Cleft"> - Spalte - </string> - <string name="Close Set Eyes"> - Eng stehende Augen - </string> - <string name="Closed"> - Geschlossen - </string> - <string name="Closed Back"> - Hinten geschlossen - </string> - <string name="Closed Front"> - Vorne geschlossen - </string> - <string name="Closed Left"> - Links geschlossen - </string> - <string name="Closed Right"> - Rechts geschlossen - </string> - <string name="Coin Purse"> - Klein - </string> - <string name="Collar Back"> - Kragen hinten - </string> - <string name="Collar Front"> - Kragen vorne - </string> - <string name="Corner Down"> - Nach unten - </string> - <string name="Corner Normal"> - Normal - </string> - <string name="Corner Up"> - Nach oben - </string> - <string name="Creased"> - Schlupflid - </string> - <string name="Crooked Nose"> - Krumme Nase - </string> - <string name="Cropped Hair"> - Kurze Haare - </string> - <string name="Cuff Flare"> - Hosenaufschlag - </string> - <string name="Dark"> - Dunkel - </string> - <string name="Dark Green"> - Dunkelgrün - </string> - <string name="Darker"> - Dunkler - </string> - <string name="Deep"> - Tief - </string> - <string name="Default Heels"> - Standardabsätze - </string> - <string name="Default Toe"> - Standardspitze - </string> - <string name="Dense"> - Dicht - </string> - <string name="Dense hair"> - Dichtes Haar - </string> - <string name="Double Chin"> - Doppelkinn - </string> - <string name="Downturned"> - Nach unten - </string> - <string name="Duffle Bag"> - Groß - </string> - <string name="Ear Angle"> - Ohrenwinkel - </string> - <string name="Ear Size"> - Ohrengröße - </string> - <string name="Ear Tips"> - Ohrenspitzen - </string> - <string name="Egg Head"> - Eierkopf - </string> - <string name="Eye Bags"> - Augenränder - </string> - <string name="Eye Color"> - Augenfarbe - </string> - <string name="Eye Depth"> - Augentiefe - </string> - <string name="Eye Lightness"> - Helligkeit - </string> - <string name="Eye Opening"> - Öffnung - </string> - <string name="Eye Pop"> - Symmetrie - </string> - <string name="Eye Size"> - Augengröße - </string> - <string name="Eye Spacing"> - Augenstand - </string> - <string name="Eyeball Size"> - Größe des Augapfels - </string> - <string name="Eyebrow Arc"> - Brauenbogen - </string> - <string name="Eyebrow Density"> - Brauendichte - </string> - <string name="Eyebrow Height"> - Brauenhöhe - </string> - <string name="Eyebrow Points"> - Brauenenden - </string> - <string name="Eyebrow Size"> - Brauengröße - </string> - <string name="Eyelash Length"> - Wimpernlänge - </string> - <string name="Eyeliner"> - Eyeliner - </string> - <string name="Eyeliner Color"> - Farbe des Eyeliners - </string> - <string name="Eyes Back"> - Augen zurück - </string> - <string name="Eyes Bugged"> - Glubschaugen - </string> - <string name="Eyes Forward"> - Augen nach vorne - </string> - <string name="Eyes Long Head"> - Augen langer Kopf - </string> - <string name="Eyes Shear Left Up"> - Augen Verzerrung links hoch - </string> - <string name="Eyes Shear Right Up"> - Augen Verzerrung rechts hoch - </string> - <string name="Eyes Short Head"> - Augen kurzer Kopf - </string> - <string name="Eyes Spread"> - Augen auseinander - </string> - <string name="Eyes Sunken"> - eingesunkene Augen - </string> - <string name="Eyes Together"> - Augen zusammen - </string> - <string name="Face Shear"> - Gesichtsverzerrung - </string> - <string name="Facial Definition"> - Gesichtskonturen - </string> - <string name="Far Set Eyes"> - Weit auseinander - </string> - <string name="Fat"> - Dick - </string> - <string name="Fat Head"> - Dicker Kopf - </string> - <string name="Fat Lips"> - Volle Lippen - </string> - <string name="Fat Lower"> - Volle Unterlippe - </string> - <string name="Fat Lower Lip"> - Volle Unterlippe - </string> - <string name="Fat Torso"> - Dicker Körper - </string> - <string name="Fat Upper"> - Volle Oberlippe - </string> - <string name="Fat Upper Lip"> - Volle Oberlippe - </string> - <string name="Female"> - weiblich - </string> - <string name="Fingerless"> - Ohne Finger - </string> - <string name="Fingers"> - Finger - </string> - <string name="Flared Cuffs"> - Ausgestellt - </string> - <string name="Flat"> - Flach - </string> - <string name="Flat Butt"> - Flacher Hintern - </string> - <string name="Flat Head"> - Flacher Kopf - </string> - <string name="Flat Toe"> - Flache Spitze - </string> - <string name="Foot Size"> - Fußgröße - </string> - <string name="Forehead Angle"> - Stirnwinkel - </string> - <string name="Forehead Heavy"> - Stirn ausgeprägt - </string> - <string name="Freckles"> - Sommersprossen - </string> - <string name="Front Bangs Down"> - Langer Pony - </string> - <string name="Front Bangs Up"> - Kurzer Pony - </string> - <string name="Front Fringe"> - Fransen, vorne - </string> - <string name="Front Hair"> - Vorderhaar - </string> - <string name="Front Hair Down"> - langes Vorderhaar - </string> - <string name="Front Hair Up"> - Kurzes Vorderhaar - </string> - <string name="Full Back"> - Hinten volles Haar - </string> - <string name="Full Eyeliner"> - Starker Eyeliner - </string> - <string name="Full Front"> - Vorne volles Haar - </string> - <string name="Full Hair Sides"> - Seitlich volles Haar - </string> - <string name="Full Sides"> - Volle Seiten - </string> - <string name="Glossy"> - Glänzend - </string> - <string name="Glove Fingers"> - Handschuhfinger - </string> - <string name="Glove Length"> - Handschuhlänge - </string> - <string name="Hair"> - Haare - </string> - <string name="Hair Back"> - Haare: Hinten - </string> - <string name="Hair Front"> - Haare: Vorne - </string> - <string name="Hair Sides"> - Haare: Seiten - </string> - <string name="Hair Sweep"> - Haartolle - </string> - <string name="Hair Thickess"> - Haardicke - </string> - <string name="Hair Thickness"> - Haardicke - </string> - <string name="Hair Tilt"> - Haarneigung - </string> - <string name="Hair Tilted Left"> - Nach links - </string> - <string name="Hair Tilted Right"> - Nach rechts - </string> - <string name="Hair Volume"> - Haare: Volumen - </string> - <string name="Hand Size"> - Handgröße - </string> - <string name="Handlebars"> - Zwirbelbart - </string> - <string name="Head Length"> - Kopflänge - </string> - <string name="Head Shape"> - Kopfform - </string> - <string name="Head Size"> - Kopfgröße - </string> - <string name="Head Stretch"> - Kopfstreckung - </string> - <string name="Heel Height"> - Absatzhöhe - </string> - <string name="Heel Shape"> - Absatzform - </string> - <string name="Height"> - Höhe - </string> - <string name="High"> - Hoch - </string> - <string name="High Heels"> - Hohe Absätze - </string> - <string name="High Jaw"> - Hoch - </string> - <string name="High Platforms"> - Hohe Plattformsohlen - </string> - <string name="High and Tight"> - Hoch und eng - </string> - <string name="Higher"> - Höhere - </string> - <string name="Hip Length"> - Länge der Hüfte - </string> - <string name="Hip Width"> - Breite der Hüfte - </string> - <string name="In"> - In - </string> - <string name="In Shdw Color"> - Farbe Innenseite - </string> - <string name="In Shdw Opacity"> - Deckkraft: innerer Lidschatten - </string> - <string name="Inner Eye Corner"> - Ecke: Nasenseite - </string> - <string name="Inner Eye Shadow"> - Innerer Lidschatten - </string> - <string name="Inner Shadow"> - Innerer Lidschatten - </string> - <string name="Jacket Length"> - Jackenlänge - </string> - <string name="Jacket Wrinkles"> - Jackenfalten - </string> - <string name="Jaw Angle"> - Kinnansatz - </string> - <string name="Jaw Jut"> - Kinnposition - </string> - <string name="Jaw Shape"> - Kinnform - </string> - <string name="Join"> - Zusammen - </string> - <string name="Jowls"> - Hängebacken - </string> - <string name="Knee Angle"> - Kniewinkel - </string> - <string name="Knock Kneed"> - X-beinig - </string> - <string name="Large"> - Groß - </string> - <string name="Large Hands"> - Große Hände - </string> - <string name="Left Part"> - Linksscheitel - </string> - <string name="Leg Length"> - Beinlänge - </string> - <string name="Leg Muscles"> - Beinmuskeln - </string> - <string name="Less"> - Weniger - </string> - <string name="Less Body Fat"> - Weniger Speck - </string> - <string name="Less Curtains"> - Weniger - </string> - <string name="Less Freckles"> - Weniger - </string> - <string name="Less Full"> - Weniger - </string> - <string name="Less Gravity"> - Weniger - </string> - <string name="Less Love"> - Weniger - </string> - <string name="Less Muscles"> - Weniger - </string> - <string name="Less Muscular"> - Weniger - </string> - <string name="Less Rosy"> - Weniger - </string> - <string name="Less Round"> - Weniger - </string> - <string name="Less Saddle"> - Weniger - </string> - <string name="Less Square"> - Weniger - </string> - <string name="Less Volume"> - Weniger - </string> - <string name="Less soul"> - Weniger - </string> - <string name="Lighter"> - Heller - </string> - <string name="Lip Cleft"> - Amorbogen - </string> - <string name="Lip Cleft Depth"> - Tiefe: Amorbogen - </string> - <string name="Lip Fullness"> - Fülle - </string> - <string name="Lip Pinkness"> - Pinkton - </string> - <string name="Lip Ratio"> - Lippenproportionen - </string> - <string name="Lip Thickness"> - Lippendicke - </string> - <string name="Lip Width"> - Mundbreite - </string> - <string name="Lipgloss"> - Lipgloss - </string> - <string name="Lipstick"> - Lippenstift - </string> - <string name="Lipstick Color"> - Farbe - </string> - <string name="Long"> - Lang - </string> - <string name="Long Head"> - Langer Kopf - </string> - <string name="Long Hips"> - Lange Hüften - </string> - <string name="Long Legs"> - Lange Beine - </string> - <string name="Long Neck"> - Langer Hals - </string> - <string name="Long Pigtails"> - Lange Zöpfe - </string> - <string name="Long Ponytail"> - Langer Pferdeschwanz - </string> - <string name="Long Torso"> - Langer Oberkörper - </string> - <string name="Long arms"> - Lange Arme - </string> - <string name="Longcuffs"> - Manschetten - </string> - <string name="Loose Pants"> - Weite Hosen - </string> - <string name="Loose Shirt"> - Weites Hemd - </string> - <string name="Loose Sleeves"> - Weite Ärmel - </string> - <string name="Love Handles"> - Fettpölsterchen - </string> - <string name="Low"> - Niedrig - </string> - <string name="Low Heels"> - Niedrig - </string> - <string name="Low Jaw"> - Niedrig - </string> - <string name="Low Platforms"> - Niedrig - </string> - <string name="Low and Loose"> - Weit - </string> - <string name="Lower"> - Absenken - </string> - <string name="Lower Bridge"> - Brücke, Unterer Teil - </string> - <string name="Lower Cheeks"> - Wangen, unterer Bereich - </string> - <string name="Male"> - Männlich - </string> - <string name="Middle Part"> - Mittelscheitel - </string> - <string name="More"> - Mehr - </string> - <string name="More Blush"> - Mehr - </string> - <string name="More Body Fat"> - Mehr Speck - </string> - <string name="More Curtains"> - Mehr - </string> - <string name="More Eyeshadow"> - Mehr - </string> - <string name="More Freckles"> - Mehr - </string> - <string name="More Full"> - Voller - </string> - <string name="More Gravity"> - Mehr - </string> - <string name="More Lipstick"> - Mehr - </string> - <string name="More Love"> - Mehr - </string> - <string name="More Lower Lip"> - Größer - </string> - <string name="More Muscles"> - Mehr - </string> - <string name="More Muscular"> - Mehr - </string> - <string name="More Rosy"> - Mehr - </string> - <string name="More Round"> - Runder - </string> - <string name="More Saddle"> - Mehr - </string> - <string name="More Sloped"> - Mehr - </string> - <string name="More Square"> - Mehr - </string> - <string name="More Upper Lip"> - Mehr - </string> - <string name="More Vertical"> - Mehr - </string> - <string name="More Volume"> - Mehr - </string> - <string name="More soul"> - Mehr - </string> - <string name="Moustache"> - Schnauzer - </string> - <string name="Mouth Corner"> - Mundwinkel - </string> - <string name="Mouth Position"> - Mundposition - </string> - <string name="Mowhawk"> - Irokese - </string> - <string name="Muscular"> - Muskulös - </string> - <string name="Mutton Chops"> - Koteletten - </string> - <string name="Nail Polish"> - Nagellack - </string> - <string name="Nail Polish Color"> - Farbe - </string> - <string name="Narrow"> - Schmal - </string> - <string name="Narrow Back"> - Wenig - </string> - <string name="Narrow Front"> - Wenig - </string> - <string name="Narrow Lips"> - Schmale Lippen - </string> - <string name="Natural"> - Natürlich - </string> - <string name="Neck Length"> - Halslänge - </string> - <string name="Neck Thickness"> - Halsdicke - </string> - <string name="No Blush"> - Kein Rouge - </string> - <string name="No Eyeliner"> - Kein Eyeliner - </string> - <string name="No Eyeshadow"> - Kein Lidschatten - </string> - <string name="No Heels"> - Keine Absätze - </string> - <string name="No Lipgloss"> - Kein Lipgloss - </string> - <string name="No Lipstick"> - Kein Lippenstift - </string> - <string name="No Part"> - Kein Scheitel - </string> - <string name="No Polish"> - Kein Nagellack - </string> - <string name="No Red"> - Nicht rot - </string> - <string name="No Spikes"> - Keine Stachel - </string> - <string name="No White"> - Kein Weiß - </string> - <string name="No Wrinkles"> - Keine Falten - </string> - <string name="Normal Lower"> - Normal unten - </string> - <string name="Normal Upper"> - Normal oben - </string> - <string name="Nose Left"> - Links - </string> - <string name="Nose Right"> - Rechts - </string> - <string name="Nose Size"> - Größe - </string> - <string name="Nose Thickness"> - Dicke - </string> - <string name="Nose Tip Angle"> - Nasenspitze - </string> - <string name="Nose Tip Shape"> - Nasenspitze - </string> - <string name="Nose Width"> - Nasenbreite - </string> - <string name="Nostril Division"> - Teilung - </string> - <string name="Nostril Width"> - Größe - </string> - <string name="Old"> - Alt - </string> - <string name="Opaque"> - Deckend - </string> - <string name="Open"> - Öffnen - </string> - <string name="Open Back"> - Hinten offen - </string> - <string name="Open Front"> - Vorne offen - </string> - <string name="Open Left"> - Links offen - </string> - <string name="Open Right"> - Rechts offen - </string> - <string name="Orange"> - Orange - </string> - <string name="Out"> - Aus - </string> - <string name="Out Shdw Color"> - Farbe: Oberer Lidschatten - </string> - <string name="Out Shdw Opacity"> - Deckkraft: Oberer Lidschatten - </string> - <string name="Outer Eye Corner"> - Äußerer Augenwinkel - </string> - <string name="Outer Eye Shadow"> - Lidschatten: Oben - </string> - <string name="Outer Shadow"> - Lidschatten: Oben - </string> - <string name="Overbite"> - Überbiss - </string> - <string name="Package"> - Ausbeulung - </string> - <string name="Painted Nails"> - Lackierte Nägel - </string> - <string name="Pale"> - Blass - </string> - <string name="Pants Crotch"> - Schritt - </string> - <string name="Pants Fit"> - Passform - </string> - <string name="Pants Length"> - Hosenlänge - </string> - <string name="Pants Waist"> - Hüfte - </string> - <string name="Pants Wrinkles"> - Falten - </string> - <string name="Part"> - Scheitel - </string> - <string name="Part Bangs"> - Pony scheiteln - </string> - <string name="Pectorals"> - Brustmuskel - </string> - <string name="Pigment"> - Pigmentierung - </string> - <string name="Pigtails"> - Zöpfe - </string> - <string name="Pink"> - Pink - </string> - <string name="Pinker"> - Mehr Pink - </string> - <string name="Platform Height"> - Höhe - </string> - <string name="Platform Width"> - Breite - </string> - <string name="Pointy"> - Spitz - </string> - <string name="Pointy Heels"> - Pfennigabsätze - </string> - <string name="Pointy Toe"> - Spitz - </string> - <string name="Ponytail"> - Pferdeschwanz - </string> - <string name="Poofy Skirt"> - Weit ausgestellt - </string> - <string name="Pop Left Eye"> - Linkes Auge größer - </string> - <string name="Pop Right Eye"> - Rechtes Auge größer - </string> - <string name="Puffy"> - Geschwollen - </string> - <string name="Puffy Eyelids"> - Geschwollene Lider - </string> - <string name="Rainbow Color"> - Regenbogenfarben - </string> - <string name="Red Hair"> - Rote Haare - </string> - <string name="Red Skin"> - Rote Haut - </string> - <string name="Regular"> - Normal - </string> - <string name="Regular Muscles"> - Normal muskulös - </string> - <string name="Right Part"> - Scheitel rechts - </string> - <string name="Rosy Complexion"> - Rosiger Teint - </string> - <string name="Round"> - Rund - </string> - <string name="Round Forehead"> - Runde Stirn - </string> - <string name="Ruddiness"> - Röte - </string> - <string name="Ruddy"> - Rötlich - </string> - <string name="Rumpled Hair"> - Zerzauste Haare - </string> - <string name="Saddle Bags"> - Hüftspeck - </string> - <string name="Saddlebags"> - Hüftspeck - </string> - <string name="Scrawny"> - Dürr - </string> - <string name="Scrawny Leg"> - Dürres Bein - </string> - <string name="Separate"> - Auseinander - </string> - <string name="Shading"> - Schattierung - </string> - <string name="Shadow hair"> - Schattenhaar - </string> - <string name="Shallow"> - Flach - </string> - <string name="Shear Back"> - Hinterkopf rasiert - </string> - <string name="Shear Face"> - Gesicht verzerren - </string> - <string name="Shear Front"> - Vorne rasiert - </string> - <string name="Shear Left"> - Links - </string> - <string name="Shear Left Up"> - Links - </string> - <string name="Shear Right"> - Rechts - </string> - <string name="Shear Right Up"> - Rechts - </string> - <string name="Sheared Back"> - Hinterkopf rasiert - </string> - <string name="Sheared Front"> - Vorne rasiert - </string> - <string name="Shift Left"> - Nach links - </string> - <string name="Shift Mouth"> - Mund verschieben - </string> - <string name="Shift Right"> - Nach rechts - </string> - <string name="Shirt Bottom"> - Hemdlänge - </string> - <string name="Shirt Fit"> - Passform - </string> - <string name="Shirt Wrinkles"> - Falten - </string> - <string name="Shoe Height"> - Höhe - </string> - <string name="Short"> - Kurz - </string> - <string name="Short Arms"> - Kurze Arme - </string> - <string name="Short Legs"> - Kurze Beine - </string> - <string name="Short Neck"> - Kurzer Hals - </string> - <string name="Short Pigtails"> - Kurze Zöpfe - </string> - <string name="Short Ponytail"> - Kurzer Pferdeschwanz - </string> - <string name="Short Sideburns"> - Kurze Koteletten - </string> - <string name="Short Torso"> - Kurzer Oberkörper - </string> - <string name="Short hips"> - Kurze Hüften - </string> - <string name="Shoulders"> - Schultern - </string> - <string name="Side Bangs"> - Seitlicher Pony - </string> - <string name="Side Bangs Down"> - Lang - </string> - <string name="Side Bangs Up"> - Kurz - </string> - <string name="Side Fringe"> - Seitliche Fransen - </string> - <string name="Sideburns"> - Koteletten - </string> - <string name="Sides Hair"> - Seitliches Haar - </string> - <string name="Sides Hair Down"> - Lang - </string> - <string name="Sides Hair Up"> - Kurz - </string> - <string name="Skinny"> - Dünn - </string> - <string name="Skinny Neck"> - Dünner Hals - </string> - <string name="Skirt Fit"> - Passform - </string> - <string name="Skirt Length"> - Rocklänge - </string> - <string name="Slanted Forehead"> - Fliehende Stirn - </string> - <string name="Sleeve Length"> - Ärmellänge - </string> - <string name="Sleeve Looseness"> - Passform Ärmel - </string> - <string name="Slit Back"> - Schlitz: Hinten - </string> - <string name="Slit Front"> - Schlitz: Vorne - </string> - <string name="Slit Left"> - Schlitz: Links - </string> - <string name="Slit Right"> - Schlitz: Rechts - </string> - <string name="Small"> - Klein - </string> - <string name="Small Hands"> - Kleine Hände - </string> - <string name="Small Head"> - Kleiner Kopf - </string> - <string name="Smooth"> - Glätten - </string> - <string name="Smooth Hair"> - Glattes Haar - </string> - <string name="Socks Length"> - Strumpflänge - </string> - <string name="Some"> - Etwas - </string> - <string name="Soulpatch"> - Unterlippenbart - </string> - <string name="Sparse"> - Wenig - </string> - <string name="Spiked Hair"> - Stachelhaare - </string> - <string name="Square"> - Rechteck - </string> - <string name="Square Toe"> - Eckig - </string> - <string name="Squash Head"> - Gestaucht - </string> - <string name="Squash/Stretch Head"> - Gestretcht/Gestaucht - </string> - <string name="Stretch Head"> - Gestreckt - </string> - <string name="Sunken"> - Eingefallen - </string> - <string name="Sunken Chest"> - Trichterbrust - </string> - <string name="Sunken Eyes"> - Eingesunkene Augen - </string> - <string name="Sweep Back"> - Nach hinten - </string> - <string name="Sweep Forward"> - Nach vorne - </string> - <string name="Swept Back"> - Nach hinten - </string> - <string name="Swept Back Hair"> - Haar nach hinten - </string> - <string name="Swept Forward"> - Haare nach vorne - </string> - <string name="Swept Forward Hair"> - Haare nach vorne - </string> - <string name="Tall"> - Groß - </string> - <string name="Taper Back"> - Ansatzbreite hinten - </string> - <string name="Taper Front"> - Ansatzbreite vorne - </string> - <string name="Thick Heels"> - Dicke Absätze - </string> - <string name="Thick Neck"> - Dicker Hals - </string> - <string name="Thick Toe"> - Dick - </string> - <string name="Thickness"> - Dicke - </string> - <string name="Thin"> - Dünn - </string> - <string name="Thin Eyebrows"> - Dünne Augenbrauen - </string> - <string name="Thin Lips"> - Dünne Lippen - </string> - <string name="Thin Nose"> - Dünne Nase - </string> - <string name="Tight Chin"> - Straffes Kinn - </string> - <string name="Tight Cuffs"> - Eng - </string> - <string name="Tight Pants"> - Enge Hosen - </string> - <string name="Tight Shirt"> - Enges Hemd - </string> - <string name="Tight Skirt"> - Enger Rock - </string> - <string name="Tight Sleeves"> - Enge Ärmel - </string> - <string name="Tilt Left"> - Nach links - </string> - <string name="Tilt Right"> - Nach rechts - </string> - <string name="Toe Shape"> - Spitze - </string> - <string name="Toe Thickness"> - Dicke - </string> - <string name="Torso Length"> - Länge des Oberkörpers - </string> - <string name="Torso Muscles"> - Muskeln - </string> - <string name="Torso Scrawny"> - Dürr - </string> - <string name="Unattached"> - Frei - </string> - <string name="Uncreased"> - Straffes Lid - </string> - <string name="Underbite"> - Unterbiss - </string> - <string name="Unnatural"> - Unnatürlich - </string> - <string name="Upper Bridge"> - Brücke, oberer Teil - </string> - <string name="Upper Cheeks"> - Obere Wangen - </string> - <string name="Upper Chin Cleft"> - Obere Kinnspalte - </string> - <string name="Upper Eyelid Fold"> - Obere Lidfalte - </string> - <string name="Upturned"> - Stupsnase - </string> - <string name="Very Red"> - Sehr rot - </string> - <string name="Waist Height"> - Bund - </string> - <string name="Well-Fed"> - Gut genährt - </string> - <string name="White Hair"> - Weiße Haare - </string> - <string name="Wide"> - Breit - </string> - <string name="Wide Back"> - Breit - </string> - <string name="Wide Front"> - Breit - </string> - <string name="Wide Lips"> - Breit - </string> - <string name="Wild"> - Wild - </string> - <string name="Wrinkles"> - Falten - </string> - <string name="LocationCtrlAddLandmarkTooltip"> - Zu meinen Landmarken hinzufügen - </string> - <string name="LocationCtrlEditLandmarkTooltip"> - Meine Landmarken bearbeiten - </string> - <string name="UpdaterWindowTitle"> - [APP_NAME] Aktualisierung - </string> - <string name="UpdaterNowUpdating"> - [APP_NAME] wird aktualisiert... - </string> - <string name="UpdaterNowInstalling"> - [APP_NAME] wird installiert... - </string> - <string name="UpdaterUpdatingDescriptive"> - Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis. - </string> - <string name="UpdaterProgressBarTextWithEllipses"> - Aktualisierung wird heruntergeladen... - </string> - <string name="UpdaterProgressBarText"> - Aktualisierung wird heruntergeladen - </string> - <string name="UpdaterFailDownloadTitle"> - Herunterladen ist fehlgeschlagen - </string> - <string name="UpdaterFailUpdateDescriptive"> - Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. - </string> - <string name="UpdaterFailInstallTitle"> - Aktualisierung konnte nicht installiert werden - </string> - <string name="UpdaterFailStartTitle"> - Viewer konnte nicht gestartet werden - </string> - <string name="only_user_message"> - Sie sind der einzige Benutzer in dieser Sitzung. - </string> - <string name="offline_message"> - [FIRST] [LAST] ist offline. - </string> - <string name="invite_message"> - Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. - </string> - <string name="generic_request_error"> - Fehler bei Anfrage, bitte versuchen Sie es später. - </string> - <string name="insufficient_perms_error"> - Sie sind dazu nicht berechtigt. - </string> - <string name="session_does_not_exist_error"> - Die Sitzung ist abgelaufen - </string> - <string name="no_ability_error"> - Sie besitzen diese Fähigkeit nicht. - </string> - <string name="no_ability"> - Sie besitzen diese Fähigkeit nicht. - </string> - <string name="not_a_mod_error"> - Sie sind kein Sitzungsmoderator. - </string> - <string name="muted_error"> - Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. - </string> - <string name="add_session_event"> - Es konnten keine Benutzer 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. - </string> - <string name="removed_from_group"> - Sie wurden von der Gruppe ausgeschlossen. - </string> - <string name="close_on_no_ability"> - Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. - </string> -</strings> +<?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 + 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=de-DE</string> + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Second Life + </string> + <string name="SECOND_LIFE_GRID"> + Second Life-Grid: + </string> + <string name="SUPPORT_SITE"> + Second Life Support-Portal + </string> + <string name="StartupDetectingHardware"> + Hardware wird erfasst... + </string> + <string name="StartupLoading"> + Wird geladen + </string> + <string name="Fullbright"> + Fullbright (Legacy) + </string> + <string name="LoginInProgress"> + Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten. + </string> + <string name="LoginInProgressNoFrozen"> + Anmeldung erfolgt... + </string> + <string name="LoginAuthenticating"> + Authentifizierung + </string> + <string name="LoginMaintenance"> + Account wird aktualisiert... + </string> + <string name="LoginAttempt"> + Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER] + </string> + <string name="LoginPrecaching"> + Welt wird geladen... + </string> + <string name="LoginInitializingBrowser"> + Integrierter Webbrowser wird initialisiert... + </string> + <string name="LoginInitializingMultimedia"> + Multimedia wird initialisiert... + </string> + <string name="LoginVerifyingCache"> + Cache-Dateien werden überprüft (dauert 60-90 Sekunden)... + </string> + <string name="LoginProcessingResponse"> + Antwort wird verarbeitet... + </string> + <string name="LoginInitializingWorld"> + Welt wird initialisiert... + </string> + <string name="LoginDecodingImages"> + Bilder werden entpackt... + </string> + <string name="LoginInitializingQuicktime"> + QuickTime wird initialisiert... + </string> + <string name="LoginQuicktimeNotFound"> + QuickTime nicht gefunden - Initialisierung nicht möglich. + </string> + <string name="LoginQuicktimeOK"> + QuickTime wurde initialisiert. + </string> + <string name="LoginWaitingForRegionHandshake"> + Region-Handshake... + </string> + <string name="LoginConnectingToRegion"> + Region-Verbindung... + </string> + <string name="LoginDownloadingClothing"> + Kleidung wird geladen... + </string> + <string name="AgentLostConnection"> + In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. + </string> + <string name="TooltipPerson"> + Person + </string> + <string name="TooltipNoName"> + (namenlos) + </string> + <string name="TooltipOwner"> + Eigentümer: + </string> + <string name="TooltipPublic"> + Öffentlich + </string> + <string name="TooltipIsGroup"> + (Gruppe) + </string> + <string name="TooltipForSaleL$"> + Zum Verkauf: [AMOUNT] L$ + </string> + <string name="TooltipFlagGroupBuild"> + Gruppenbau + </string> + <string name="TooltipFlagNoBuild"> + Bauen aus + </string> + <string name="TooltipFlagNoEdit"> + Gruppenbau + </string> + <string name="TooltipFlagNotSafe"> + Unsicher + </string> + <string name="TooltipFlagNoFly"> + Fliegen aus + </string> + <string name="TooltipFlagGroupScripts"> + Gruppenskripte + </string> + <string name="TooltipFlagNoScripts"> + Skripte aus + </string> + <string name="TooltipLand"> + Land: + </string> + <string name="TooltipMustSingleDrop"> + Sie können nur ein einzelnes Objekt hierher ziehen + </string> + <string name="TooltipHttpUrl"> + Anklicken, um Webseite anzuzeigen + </string> + <string name="TooltipSLURL"> + Anklicken, um Informationen zu diesem Standort anzuzeigen + </string> + <string name="TooltipAgentUrl"> + Anklicken, um das Profil dieses Einwohners anzuzeigen + </string> + <string name="TooltipGroupUrl"> + Anklicken, um Beschreibung der Gruppe anzuzeigen + </string> + <string name="TooltipEventUrl"> + Anklicken, um Beschreibung der Veranstaltung anzuzeigen + </string> + <string name="TooltipClassifiedUrl"> + Anklicken, um diese Anzeige anzuzeigen + </string> + <string name="TooltipParcelUrl"> + Anklicken, um Beschreibung der Parzelle anzuzeigen + </string> + <string name="TooltipTeleportUrl"> + Anklicken, um zu diesem Standort zu teleportieren + </string> + <string name="TooltipObjectIMUrl"> + Anklicken, um Beschreibung des Objekts anzuzeigen + </string> + <string name="TooltipSLAPP"> + Anklicken, um Befehl secondlife:// auszuführen + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Schließen (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Schließen (Strg+W) + </string> + <string name="BUTTON_RESTORE"> + Wiederherstellen + </string> + <string name="BUTTON_MINIMIZE"> + Minimieren + </string> + <string name="BUTTON_TEAR_OFF"> + Abnehmen + </string> + <string name="BUTTON_DOCK"> + Andocken + </string> + <string name="BUTTON_UNDOCK"> + Abkoppeln + </string> + <string name="BUTTON_HELP"> + Hilfe anzeigen + </string> + <string name="RetrievingData"> + Laden... + </string> + <string name="ReleaseNotes"> + Versionshinweise + </string> + <string name="LoadingData"> + Wird geladen... + </string> + <string name="AvatarNameNobody"> + (niemand) + </string> + <string name="AvatarNameWaiting"> + (wartet) + </string> + <string name="AvatarNameHippos"> + (hippos) + </string> + <string name="GroupNameNone"> + (keiner) + </string> + <string name="AssetErrorNone"> + Kein Fehler + </string> + <string name="AssetErrorRequestFailed"> + Asset-Anforderung: fehlgeschlagen + </string> + <string name="AssetErrorNonexistentFile"> + Asset-Anforderung: Datei existiert nicht + </string> + <string name="AssetErrorNotInDatabase"> + Asset-Anforderung: Asset in Datenbank nicht gefunden + </string> + <string name="AssetErrorEOF"> + Ende der Datei + </string> + <string name="AssetErrorCannotOpenFile"> + Datei kann nicht geöffnet werden + </string> + <string name="AssetErrorFileNotFound"> + Datei nicht gefunden + </string> + <string name="AssetErrorTCPTimeout"> + Zeitüberschreitung bei Dateiübertragung + </string> + <string name="AssetErrorCircuitGone"> + Verbindung verloren + </string> + <string name="AssetErrorPriceMismatch"> + Viewer und Server sind sich nicht über Preis einig + </string> + <string name="AssetErrorUnknownStatus"> + Status unbekannt + </string> + <string name="texture"> + Textur + </string> + <string name="sound"> + Sound + </string> + <string name="calling card"> + Visitenkarte + </string> + <string name="landmark"> + Landmarke + </string> + <string name="legacy script"> + Skript (veraltet) + </string> + <string name="clothing"> + Kleidung + </string> + <string name="object"> + Objekt + </string> + <string name="note card"> + Notizkarte + </string> + <string name="folder"> + Ordner + </string> + <string name="root"> + Hauptverzeichnis + </string> + <string name="lsl2 script"> + LSL2 Skript + </string> + <string name="lsl bytecode"> + LSL Bytecode + </string> + <string name="tga texture"> + tga-Textur + </string> + <string name="body part"> + Körperteil + </string> + <string name="snapshot"> + Foto + </string> + <string name="lost and found"> + Fundbüro + </string> + <string name="targa image"> + targa-Bild + </string> + <string name="trash"> + Papierkorb + </string> + <string name="jpeg image"> + jpeg-Bild + </string> + <string name="animation"> + Animation + </string> + <string name="gesture"> + Geste + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + Favoriten + </string> + <string name="symbolic link"> + Link + </string> + <string name="AvatarAway"> + Abwesend + </string> + <string name="AvatarBusy"> + Beschäftigt + </string> + <string name="AvatarMuted"> + Stummgeschaltet + </string> + <string name="anim_express_afraid"> + Ängstlich + </string> + <string name="anim_express_anger"> + Verärgert + </string> + <string name="anim_away"> + Abwesend + </string> + <string name="anim_backflip"> + Rückwärtssalto + </string> + <string name="anim_express_laugh"> + Lachkrampf + </string> + <string name="anim_express_toothsmile"> + Grinsen + </string> + <string name="anim_blowkiss"> + Kusshand + </string> + <string name="anim_express_bored"> + Gelangweilt + </string> + <string name="anim_bow"> + Verbeugen + </string> + <string name="anim_clap"> + Klatschen + </string> + <string name="anim_courtbow"> + Diener + </string> + <string name="anim_express_cry"> + Weinen + </string> + <string name="anim_dance1"> + Tanz 1 + </string> + <string name="anim_dance2"> + Tanz 2 + </string> + <string name="anim_dance3"> + Tanz 3 + </string> + <string name="anim_dance4"> + Tanz 4 + </string> + <string name="anim_dance5"> + Tanz 5 + </string> + <string name="anim_dance6"> + Tanz 6 + </string> + <string name="anim_dance7"> + Tanz 7 + </string> + <string name="anim_dance8"> + Tanz 8 + </string> + <string name="anim_express_disdain"> + Verachten + </string> + <string name="anim_drink"> + Trinken + </string> + <string name="anim_express_embarrased"> + Verlegen + </string> + <string name="anim_angry_fingerwag"> + Drohen + </string> + <string name="anim_fist_pump"> + Faust pumpen + </string> + <string name="anim_yoga_float"> + Yogaflieger + </string> + <string name="anim_express_frown"> + Stirnrunzeln + </string> + <string name="anim_impatient"> + Ungeduldig + </string> + <string name="anim_jumpforjoy"> + Freudensprung + </string> + <string name="anim_kissmybutt"> + LMA + </string> + <string name="anim_express_kiss"> + Küssen + </string> + <string name="anim_laugh_short"> + Lachen + </string> + <string name="anim_musclebeach"> + Posen + </string> + <string name="anim_no_unhappy"> + Nein (Bedauernd) + </string> + <string name="anim_no_head"> + Nein + </string> + <string name="anim_nyanya"> + Ällabätsch + </string> + <string name="anim_punch_onetwo"> + Eins-Zwei-Punch + </string> + <string name="anim_express_open_mouth"> + Mund offen + </string> + <string name="anim_peace"> + Friede + </string> + <string name="anim_point_you"> + Auf anderen zeigen + </string> + <string name="anim_point_me"> + Auf mich zeigen + </string> + <string name="anim_punch_l"> + Linker Haken + </string> + <string name="anim_punch_r"> + Rechter Haken + </string> + <string name="anim_rps_countdown"> + SSP zählen + </string> + <string name="anim_rps_paper"> + SSP Papier + </string> + <string name="anim_rps_rock"> + SSP Stein + </string> + <string name="anim_rps_scissors"> + SSP Schere + </string> + <string name="anim_express_repulsed"> + Angewidert + </string> + <string name="anim_kick_roundhouse_r"> + Rundkick + </string> + <string name="anim_express_sad"> + Traurig + </string> + <string name="anim_salute"> + Salutieren + </string> + <string name="anim_shout"> + Rufen + </string> + <string name="anim_express_shrug"> + Schulterzucken + </string> + <string name="anim_express_smile"> + Lächeln + </string> + <string name="anim_smoke_idle"> + Zigarette halten + </string> + <string name="anim_smoke_inhale"> + Rauchen + </string> + <string name="anim_smoke_throw_down"> + Zigarette wegwerfen + </string> + <string name="anim_express_surprise"> + Überraschung + </string> + <string name="anim_sword_strike_r"> + Schwerthieb + </string> + <string name="anim_angry_tantrum"> + Wutanfall + </string> + <string name="anim_express_tongue_out"> + Zunge rausstrecken + </string> + <string name="anim_hello"> + Winken + </string> + <string name="anim_whisper"> + Flüstern + </string> + <string name="anim_whistle"> + Pfeifen + </string> + <string name="anim_express_wink"> + Zwinkern + </string> + <string name="anim_wink_hollywood"> + Zwinkern (Hollywood) + </string> + <string name="anim_express_worry"> + Sorgenvoll + </string> + <string name="anim_yes_happy"> + Ja (Erfreut) + </string> + <string name="anim_yes_head"> + Ja + </string> + <string name="texture_loading"> + Wird geladen... + </string> + <string name="worldmap_offline"> + Offline + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Unvollständige Datei + </string> + <string name="ST_NO_JOINT"> + HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. + </string> + <string name="whisper"> + flüstert: + </string> + <string name="shout"> + ruft: + </string> + <string name="ringing"> + Verbindung mit In-Welt-Voice-Chat... + </string> + <string name="connected"> + Verbunden + </string> + <string name="unavailable"> + Der aktuelle Standort unterstützt keine Voice-Kommunikation + </string> + <string name="hang_up"> + Verbindung mit In-Welt-Voice-Chat getrennt + </string> + <string name="ScriptQuestionCautionChatGranted"> + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS]. + </string> + <string name="ScriptTakeMoney"> + Linden-Dollar (L$) von Ihnen nehmen + </string> + <string name="ActOnControlInputs"> + Steuerung festlegen + </string> + <string name="RemapControlInputs"> + Steuerung neu zuweisen + </string> + <string name="AnimateYourAvatar"> + Avatar animieren + </string> + <string name="AttachToYourAvatar"> + An Avatar anhängen + </string> + <string name="ReleaseOwnership"> + Eigentum aufgeben und öffentlich machen + </string> + <string name="LinkAndDelink"> + Mit Objekten verknüpfen und davon trennen + </string> + <string name="AddAndRemoveJoints"> + Verbindungen zu anderen Objekten hinzufügen und entfernen + </string> + <string name="ChangePermissions"> + Berechtigungen ändern + </string> + <string name="TrackYourCamera"> + Kameraverfolgung + </string> + <string name="ControlYourCamera"> + Kamerasteuerung + </string> + <string name="SIM_ACCESS_PG"> + PG + </string> + <string name="SIM_ACCESS_MATURE"> + Mature + </string> + <string name="SIM_ACCESS_ADULT"> + Adult + </string> + <string name="SIM_ACCESS_DOWN"> + Offline + </string> + <string name="SIM_ACCESS_MIN"> + Unbekannt + </string> + <string name="land_type_unknown"> + (unbekannt) + </string> + <string name="all_files"> + Alle Dateien + </string> + <string name="sound_files"> + Sounds + </string> + <string name="animation_files"> + Animationen + </string> + <string name="image_files"> + Bilder + </string> + <string name="save_file_verb"> + Speichern + </string> + <string name="load_file_verb"> + Laden + </string> + <string name="targa_image_files"> + Targa-Bilder + </string> + <string name="bitmap_image_files"> + Bitmap-Bilder + </string> + <string name="avi_movie_file"> + AVI-Filmdatei + </string> + <string name="xaf_animation_file"> + XAF Anim-Datei + </string> + <string name="xml_file"> + XML-Datei + </string> + <string name="dot_raw_file"> + RAW-Datei + </string> + <string name="compressed_image_files"> + Komprimierte Bilder + </string> + <string name="load_files"> + Dateien laden + </string> + <string name="choose_the_directory"> + Verzeichnis auswählen + </string> + <string name="AvatarSetNotAway"> + Als anwesend anzeigen + </string> + <string name="AvatarSetAway"> + Als abwesend anzeigen + </string> + <string name="AvatarSetNotBusy"> + Als nicht beschäftigt anzeigen + </string> + <string name="AvatarSetBusy"> + Als beschäftigt anzeigen + </string> + <string name="shape"> + Form + </string> + <string name="skin"> + Haut + </string> + <string name="hair"> + Haare + </string> + <string name="eyes"> + Augen + </string> + <string name="shirt"> + Hemd + </string> + <string name="pants"> + Hose + </string> + <string name="shoes"> + Schuhe + </string> + <string name="socks"> + Socken + </string> + <string name="jacket"> + Jacke + </string> + <string name="gloves"> + Handschuhe + </string> + <string name="undershirt"> + Unterhemd + </string> + <string name="underpants"> + Unterhose + </string> + <string name="skirt"> + Rock + </string> + <string name="invalid"> + ungültig + </string> + <string name="BodyPartsRightArm"> + Rechter Arm + </string> + <string name="BodyPartsHead"> + Kopf + </string> + <string name="BodyPartsLeftArm"> + Linker Arm + </string> + <string name="BodyPartsLeftLeg"> + Linkes Bein + </string> + <string name="BodyPartsTorso"> + Oberkörper + </string> + <string name="BodyPartsRightLeg"> + Rechtes Bein + </string> + <string name="GraphicsQualityLow"> + Niedrig + </string> + <string name="GraphicsQualityMid"> + Mittel + </string> + <string name="GraphicsQualityHigh"> + Hoch + </string> + <string name="LeaveMouselook"> + ESC drücken, um zur Normalansicht zurückzukehren + </string> + <string name="InventoryNoMatchingItems"> + Im Inventar wurden keine passenden Artikel gefunden. + </string> + <string name="InventoryNoTexture"> + Sie haben keine Kopie dieser Textur in Ihrem Inventar. + </string> + <string name="LoadingContents"> + Inhalte werden geladen... + </string> + <string name="NoContents"> + Keine Inhalte + </string> + <string name="InvFolder My Inventory"> + Mein Inventar + </string> + <string name="InvFolder My Favorites"> + Meine Favoriten + </string> + <string name="InvFolder Library"> + Bibliothek + </string> + <string name="InvFolder Textures"> + Texturen + </string> + <string name="InvFolder Sounds"> + Sounds + </string> + <string name="InvFolder Calling Cards"> + Visitenkarten + </string> + <string name="InvFolder Landmarks"> + Landmarken + </string> + <string name="InvFolder Scripts"> + Skripts + </string> + <string name="InvFolder Clothing"> + Kleidung + </string> + <string name="InvFolder Objects"> + Objekte + </string> + <string name="InvFolder Notecards"> + Notizkarten + </string> + <string name="InvFolder New Folder"> + Neuer Ordner + </string> + <string name="InvFolder Inventory"> + Inventar + </string> + <string name="InvFolder Uncompressed Images"> + Nicht-Komprimierte Bilder + </string> + <string name="InvFolder Body Parts"> + Körperteile + </string> + <string name="InvFolder Trash"> + Papierkorb + </string> + <string name="InvFolder Photo Album"> + Fotoalbum + </string> + <string name="InvFolder Lost And Found"> + Fundbüro + </string> + <string name="InvFolder Uncompressed Sounds"> + Nicht-Komprimierte Sounds + </string> + <string name="InvFolder Animations"> + Animationen + </string> + <string name="InvFolder Gestures"> + Gesten + </string> + <string name="InvFolder favorite"> + Favoriten + </string> + <string name="InvFolder Current Outfit"> + Aktuelles Outfit + </string> + <string name="InvFolder My Outfits"> + Meine Outfits + </string> + <string name="InvFolder Friends"> + Freunde + </string> + <string name="InvFolder All"> + Alle + </string> + <string name="Buy"> + Kaufen + </string> + <string name="BuyforL$"> + Kaufen für L$ + </string> + <string name="Stone"> + Stein + </string> + <string name="Metal"> + Metall + </string> + <string name="Glass"> + Glas + </string> + <string name="Wood"> + Holz + </string> + <string name="Flesh"> + Fleisch + </string> + <string name="Plastic"> + Plastik + </string> + <string name="Rubber"> + Gummi + </string> + <string name="Light"> + Licht + </string> + <string name="KBShift"> + Umschalt-Taste + </string> + <string name="KBCtrl"> + Strg + </string> + <string name="Chest"> + Brust + </string> + <string name="Skull"> + Schädel + </string> + <string name="Left Shoulder"> + Linke Schulter + </string> + <string name="Right Shoulder"> + Rechte Schulter + </string> + <string name="Left Hand"> + Linke Hand + </string> + <string name="Right Hand"> + Rechte Hand + </string> + <string name="Left Foot"> + Linker Fuß + </string> + <string name="Right Foot"> + Rechter Fuß + </string> + <string name="Spine"> + Wirbelsäule + </string> + <string name="Pelvis"> + Becken + </string> + <string name="Mouth"> + Mund + </string> + <string name="Chin"> + Kinn + </string> + <string name="Left Ear"> + Linkes Ohr + </string> + <string name="Right Ear"> + Rechtes Ohr + </string> + <string name="Left Eyeball"> + Linker Augapfel + </string> + <string name="Right Eyeball"> + Rechter Augapfel + </string> + <string name="Nose"> + Nase + </string> + <string name="R Upper Arm"> + R Oberarm + </string> + <string name="R Forearm"> + R Unterarm + </string> + <string name="L Upper Arm"> + L Oberarm + </string> + <string name="L Forearm"> + L Unterarm + </string> + <string name="Right Hip"> + Rechte Hüfte + </string> + <string name="R Upper Leg"> + R Oberschenkel + </string> + <string name="R Lower Leg"> + R Unterschenkel + </string> + <string name="Left Hip"> + Linke Hüfte + </string> + <string name="L Upper Leg"> + L Oberschenkel + </string> + <string name="L Lower Leg"> + L Unterschenkel + </string> + <string name="Stomach"> + Bauch + </string> + <string name="Left Pec"> + Linke Brust + </string> + <string name="Right Pec"> + Rechts + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] alt + </string> + <string name="YearsOld"> + [AGEYEARS] alt + </string> + <string name="MonthsOld"> + [AGEMONTHS] alt + </string> + <string name="WeeksOld"> + [AGEWEEKS] alt + </string> + <string name="DaysOld"> + [AGEDAYS] alt + </string> + <string name="TodayOld"> + Seit heute Mitglied + </string> + <string name="AgeYearsA"> + [COUNT] Jahr + </string> + <string name="AgeYearsB"> + [COUNT] Jahre + </string> + <string name="AgeYearsC"> + [COUNT] Jahre + </string> + <string name="AgeMonthsA"> + [COUNT] Monat + </string> + <string name="AgeMonthsB"> + [COUNT] Monate + </string> + <string name="AgeMonthsC"> + [COUNT] Monate + </string> + <string name="AgeWeeksA"> + [COUNT] Woche + </string> + <string name="AgeWeeksB"> + [COUNT] Wochen + </string> + <string name="AgeWeeksC"> + [COUNT] Wochen + </string> + <string name="AgeDaysA"> + [COUNT] Tag + </string> + <string name="AgeDaysB"> + [COUNT] Tage + </string> + <string name="AgeDaysC"> + [COUNT] Tage + </string> + <string name="AcctTypeResident"> + Einwohner + </string> + <string name="AcctTypeTrial"> + Test + </string> + <string name="AcctTypeCharterMember"> + Charta-Mitglied + </string> + <string name="AcctTypeEmployee"> + Linden Lab-Mitarbeiter + </string> + <string name="PaymentInfoUsed"> + Zahlungsinfo verwendet + </string> + <string name="PaymentInfoOnFile"> + Zahlungsinfo archiviert + </string> + <string name="NoPaymentInfoOnFile"> + Keine Zahlungsinfo archiviert + </string> + <string name="AgeVerified"> + Altersgeprüft + </string> + <string name="NotAgeVerified"> + Nicht altersgeprüft + </string> + <string name="Center 2"> + Mitte 2 + </string> + <string name="Top Right"> + Oben rechts + </string> + <string name="Top"> + Oben + </string> + <string name="Top Left"> + Oben links + </string> + <string name="Center"> + Zentrieren + </string> + <string name="Bottom Left"> + Unten links + </string> + <string name="Bottom"> + Unten + </string> + <string name="Bottom Right"> + Unten rechts + </string> + <string name="CompileQueueDownloadedCompiling"> + Heruntergeladen, wird kompiliert + </string> + <string name="CompileQueueScriptNotFound"> + Skript wurde auf Server nicht gefunden. + </string> + <string name="CompileQueueProblemDownloading"> + Beim Herunterladen ist ein Problem aufgetreten + </string> + <string name="CompileQueueInsufficientPermDownload"> + Unzureichende Rechte zum Herunterladen eines Skripts. + </string> + <string name="CompileQueueInsufficientPermFor"> + Unzureichende Berechtigungen für + </string> + <string name="CompileQueueUnknownFailure"> + Unbekannter Fehler beim Herunterladen + </string> + <string name="CompileQueueTitle"> + Rekompilierung + </string> + <string name="CompileQueueStart"> + rekompilieren + </string> + <string name="ResetQueueTitle"> + Zurücksetzen + </string> + <string name="ResetQueueStart"> + Zurücksetzen + </string> + <string name="RunQueueTitle"> + Skript ausführen + </string> + <string name="RunQueueStart"> + Skript ausführen + </string> + <string name="NotRunQueueTitle"> + Skript anhalten + </string> + <string name="NotRunQueueStart"> + Skript anhalten + </string> + <string name="CompileSuccessful"> + Kompilieren erfolgreich abgeschlossen! + </string> + <string name="CompileSuccessfulSaving"> + Kompilieren erfolgreich abgeschlossen, speichern... + </string> + <string name="SaveComplete"> + Speichervorgang abgeschlossen. + </string> + <string name="ObjectOutOfRange"> + Skript (Objekt außerhalb des Bereichs) + </string> + <string name="GodToolsObjectOwnedBy"> + Objekt [OBJECT], Besitzer [OWNER] + </string> + <string name="GroupsNone"> + keine + </string> + <string name="Unknown"> + (unbekannt) + </string> + <string name="Balance"> + Kontostand + </string> + <string name="Credits"> + Danksagung + </string> + <string name="Debits"> + Soll + </string> + <string name="Total"> + Gesamtbetrag + </string> + <string name="NoGroupDataFound"> + Für Gruppe wurden keine Gruppendaten gefunden + </string> + <string name="IMParentEstate"> + parent estate + </string> + <string name="IMMainland"> + Mainland + </string> + <string name="IMTeen"> + Teen + </string> + <string name="RegionInfoError"> + Fehler + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + alle Grundstücke gehören [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + alle Grundstücke, die Ihnen gehört haben + </string> + <string name="RegionInfoAllEstatesYouManage"> + alle Grundstücke, die Sie für [OWNER] verwaltet haben + </string> + <string name="RegionInfoAllowedResidents"> + Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Zulässige Gruppen: ([ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="CursorPos"> + Zeile [LINE], Spalte [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] gefunden + </string> + <string name="PanelContentsNewScript"> + Neues Skript + </string> + <string name="MuteByName"> + (nach Namen) + </string> + <string name="MuteAgent"> + (Einwohner) + </string> + <string name="MuteObject"> + (Objekt) + </string> + <string name="MuteGroup"> + (Gruppe) + </string> + <string name="RegionNoCovenant"> + Für dieses Grundstück 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: + </string> + <string name="GroupOwned"> + In Gruppenbesitz + </string> + <string name="Public"> + Öffentlich + </string> + <string name="ClassifiedClicksTxt"> + Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil + </string> + <string name="ClassifiedUpdateAfterPublish"> + (wird nach Veröffentlichung aktualisiert) + </string> + <string name="GroupVoteYes"> + Ja + </string> + <string name="GroupVoteNo"> + Nein + </string> + <string name="GroupVoteNoActiveProposals"> + Zurzeit sind keine Umfragen aktiv + </string> + <string name="GroupVoteNoArchivedProposals"> + Zurzeit sind keine Umfragen aktiv + </string> + <string name="GroupVoteRetrievingArchivedProposals"> + Archivierte Umfragen werden geladen + </string> + <string name="GroupVoteRetrievingActiveProposals"> + Aktive Umfragen werden geladen + </string> + <string name="MultiPreviewTitle"> + Vorschau + </string> + <string name="MultiPropertiesTitle"> + Eigenschaften + </string> + <string name="InvOfferAnObjectNamed"> + Ein Objekt namens + </string> + <string name="InvOfferOwnedByGroup"> + im Besitz der Gruppe + </string> + <string name="InvOfferOwnedByUnknownGroup"> + im Besitz einer unbekannten Gruppe + </string> + <string name="InvOfferOwnedBy"> + im Besitz von + </string> + <string name="InvOfferOwnedByUnknownUser"> + im Besitz eines unbekannten Einwohners + </string> + <string name="InvOfferGaveYou"> + hat Ihnen folgendes übergeben + </string> + <string name="InvOfferYouDecline"> + Sie lehnen folgendes ab: + </string> + <string name="InvOfferFrom"> + von + </string> + <string name="GroupMoneyTotal"> + Gesamtbetrag + </string> + <string name="GroupMoneyBought"> + gekauft + </string> + <string name="GroupMoneyPaidYou"> + bezahlte Ihnen + </string> + <string name="GroupMoneyPaidInto"> + bezahlte an + </string> + <string name="GroupMoneyBoughtPassTo"> + kaufte Pass für + </string> + <string name="GroupMoneyPaidFeeForEvent"> + bezahlte Gebühr für Event + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + bezahlte Preis für Event + </string> + <string name="GroupMoneyBalance"> + Kontostand + </string> + <string name="GroupMoneyCredits"> + Danksagung + </string> + <string name="GroupMoneyDebits"> + Soll + </string> + <string name="ViewerObjectContents"> + Inhalte + </string> + <string name="AcquiredItems"> + Erworbene Artikel + </string> + <string name="Cancel"> + Abbrechen + </string> + <string name="UploadingCosts"> + Hochladen von %s kostet + </string> + <string name="UnknownFileExtension"> + Unbekanntes Dateiformat .%s +Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh + </string> + <string name="AddLandmarkNavBarMenu"> + Landmarke hinzufügen... + </string> + <string name="EditLandmarkNavBarMenu"> + Landmarke bearbeiten... + </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"> + Strg+ + </string> + <string name="accel-win-alt"> + Alt+ + </string> + <string name="accel-win-shift"> + Umschalt+ + </string> + <string name="FileSaved"> + Datei wurde gespeichert + </string> + <string name="Receiving"> + Daten werden empfangen + </string> + <string name="AM"> + Uhr + </string> + <string name="PM"> + Uhr + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Forward"> + Vorwärts + </string> + <string name="Left"> + Links + </string> + <string name="Right"> + Rechts + </string> + <string name="Back"> + Zurück + </string> + <string name="North"> + Norden + </string> + <string name="South"> + Süden + </string> + <string name="West"> + Westen + </string> + <string name="East"> + Osten + </string> + <string name="Up"> + Nach oben + </string> + <string name="Down"> + Nach unten + </string> + <string name="Any Category"> + Alle Kategorien + </string> + <string name="Shopping"> + Shopping + </string> + <string name="Land Rental"> + Land mieten + </string> + <string name="Property Rental"> + Immobilie mieten + </string> + <string name="Special Attraction"> + Attraktionen + </string> + <string name="New Products"> + Neue Produkte + </string> + <string name="Employment"> + Stellenangebote + </string> + <string name="Wanted"> + Gesucht + </string> + <string name="Service"> + Dienstleistungen + </string> + <string name="Personal"> + Verschiedenes + </string> + <string name="None"> + Keiner + </string> + <string name="Linden Location"> + Lindenort + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + Kunst & Kultur + </string> + <string name="Business"> + Business + </string> + <string name="Educational"> + Bildung + </string> + <string name="Gaming"> + Spielen + </string> + <string name="Hangout"> + Treffpunkt + </string> + <string name="Newcomer Friendly"> + Anfängergerecht + </string> + <string name="Parks&Nature"> + Parks und Natur + </string> + <string name="Residential"> + Wohngebiet + </string> + <string name="Stage"> + Phase + </string> + <string name="Other"> + Sonstige + </string> + <string name="Any"> + Alle + </string> + <string name="You"> + Sie + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="MBCmdLineError"> + Beim Parsen der Befehlszeile wurde ein Fehler festgestellt. +Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN) +Fehler: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Verwendung in Befehlszeile: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] kann auf die erforderliche Datei nicht zugreifen. + +Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet. +Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal. +Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren. + </string> + <string name="MBFatalError"> + Unbehebbarer Fehler + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] läuft bereits. +Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden. +Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt. +Möchten Sie einen Absturz-Bericht einschicken? + </string> + <string name="MBAlert"> + Alarm + </string> + <string name="MBNoDirectX"> + [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen. +[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird. + +Möchten Sie fortfahren? + </string> + <string name="MBWarning"> + Hinweis + </string> + <string name="MBNoAutoUpdate"> + Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich. +Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + </string> + <string name="MBRegClassFailed"> + RegisterClass fehlgeschlagen + </string> + <string name="MBError"> + Fehler + </string> + <string name="MBFullScreenErr"> + Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden. +Ausführung erfolgt in Fenster. + </string> + <string name="MBDestroyWinFailed"> + Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen) + </string> + <string name="MBShutdownErr"> + Fehler beim Herunterfahren + </string> + <string name="MBDevContextErr"> + Kann keinen Kontext für GL-Gerät erstellen + </string> + <string name="MBPixelFmtErr"> + Passendes Pixelformat wurde nicht gefunden + </string> + <string name="MBPixelFmtDescErr"> + Beschreibung für Pixelformat nicht verfügbar + </string> + <string name="MBTrueColorWindow"> + Um [APP_NAME] in einem Fenster auszuführen, ist True Color (32-bit) erforderlich. +Klicken Sie auf Systemsteuerung > Anzeige > Einstellungen und stellen Sie den Bildschirm auf 32-bit Farbe ein. +Wenn Sie die Anwendung im Modus Vollbildschirm ausführen möchten, dann wird [APP_NAME] den Bildschirm automatisch während der Ausführung anpassen. + </string> + <string name="MBAlpha"> + [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte. +Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben. +Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung > Anzeige > Einstellungen). +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Pixel-Format kann nicht eingestellt werden. + </string> + <string name="MBGLContextErr"> + Kann keinen Kontext für GL-Gerät erstellen + </string> + <string name="MBGLContextActErr"> + Kann keinen Kontext für GL-Gerät aktivieren + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut. + +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Bartschatten + </string> + <string name="All White"> + Ganz weiß + </string> + <string name="Anime Eyes"> + Anime-Augen + </string> + <string name="Arced"> + Gewölbt + </string> + <string name="Arm Length"> + Armlänge + </string> + <string name="Attached"> + Angewachsen + </string> + <string name="Attached Earlobes"> + Angewachsene Ohrläppchen + </string> + <string name="Back Bangs"> + Nackenhaar + </string> + <string name="Back Bangs Down"> + Lang + </string> + <string name="Back Bangs Up"> + Kurz + </string> + <string name="Back Fringe"> + Nackenfransen + </string> + <string name="Back Hair"> + Hinterkopfhaar + </string> + <string name="Back Hair Down"> + lang + </string> + <string name="Back Hair Up"> + kurz + </string> + <string name="Baggy"> + Tränensäcke + </string> + <string name="Bangs"> + Pony + </string> + <string name="Bangs Down"> + Pony lang + </string> + <string name="Bangs Up"> + Pony kurz + </string> + <string name="Beady Eyes"> + Knopfaugen + </string> + <string name="Belly Size"> + Bauchgröße + </string> + <string name="Big"> + Groß + </string> + <string name="Big Butt"> + Großer Hintern + </string> + <string name="Big Eyeball"> + Großer Augapfel + </string> + <string name="Big Hair Back"> + Volumen: Hinten + </string> + <string name="Big Hair Front"> + Volumen: Vorne + </string> + <string name="Big Hair Top"> + Volumen: Oben + </string> + <string name="Big Head"> + Großer Kopf + </string> + <string name="Big Pectorals"> + Große Brustmuskeln + </string> + <string name="Big Spikes"> + Große Stacheln + </string> + <string name="Black"> + Schwarz + </string> + <string name="Blonde"> + Blond + </string> + <string name="Blonde Hair"> + Blondes Haar + </string> + <string name="Blush"> + Rouge + </string> + <string name="Blush Color"> + Rougefarbe + </string> + <string name="Blush Opacity"> + Rouge Deckkraft + </string> + <string name="Body Definition"> + Körperkonturen + </string> + <string name="Body Fat"> + Körperfett + </string> + <string name="Body Freckles"> + Sommersprossen + </string> + <string name="Body Thick"> + Körper - breit + </string> + <string name="Body Thickness"> + Körperbreite + </string> + <string name="Body Thin"> + Körper - schmal + </string> + <string name="Bow Legged"> + o-beinig + </string> + <string name="Breast Buoyancy"> + Brust, Straffheit + </string> + <string name="Breast Cleavage"> + Dekolleté + </string> + <string name="Breast Size"> + Brustgröße + </string> + <string name="Bridge Width"> + Rückenbreite + </string> + <string name="Broad"> + Breit + </string> + <string name="Brow Size"> + Brauengröße + </string> + <string name="Bug Eyes"> + Glubschaugen + </string> + <string name="Bugged Eyes"> + Hervortretend + </string> + <string name="Bulbous"> + Knollennase + </string> + <string name="Bulbous Nose"> + Knollennase + </string> + <string name="Bushy Eyebrows"> + Buschige Augenbrauen + </string> + <string name="Bushy Hair"> + Buschiges Haar + </string> + <string name="Butt Size"> + Hintern, Größe + </string> + <string name="bustle skirt"> + Tournürenrock + </string> + <string name="no bustle"> + Ohne + </string> + <string name="more bustle"> + Mit + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + Wangenknochen + </string> + <string name="Chest Size"> + Brustgröße + </string> + <string name="Chin Angle"> + Kinnwinkel + </string> + <string name="Chin Cleft"> + Kinnspalte + </string> + <string name="Chin Curtains"> + Schifferfräse + </string> + <string name="Chin Depth"> + Kinnlänge + </string> + <string name="Chin Heavy"> + Kinn ausgeprägt + </string> + <string name="Chin In"> + Kinn zurück + </string> + <string name="Chin Out"> + Kinn nach vorne + </string> + <string name="Chin-Neck"> + Kinn-Hals + </string> + <string name="Clear"> + Löschen + </string> + <string name="Cleft"> + Spalte + </string> + <string name="Close Set Eyes"> + Eng stehende Augen + </string> + <string name="Closed"> + Geschlossen + </string> + <string name="Closed Back"> + Hinten geschlossen + </string> + <string name="Closed Front"> + Vorne geschlossen + </string> + <string name="Closed Left"> + Links geschlossen + </string> + <string name="Closed Right"> + Rechts geschlossen + </string> + <string name="Coin Purse"> + Klein + </string> + <string name="Collar Back"> + Kragen hinten + </string> + <string name="Collar Front"> + Kragen vorne + </string> + <string name="Corner Down"> + Nach unten + </string> + <string name="Corner Normal"> + Normal + </string> + <string name="Corner Up"> + Nach oben + </string> + <string name="Creased"> + Schlupflid + </string> + <string name="Crooked Nose"> + Krumme Nase + </string> + <string name="Cropped Hair"> + Kurze Haare + </string> + <string name="Cuff Flare"> + Hosenaufschlag + </string> + <string name="Dark"> + Dunkel + </string> + <string name="Dark Green"> + Dunkelgrün + </string> + <string name="Darker"> + Dunkler + </string> + <string name="Deep"> + Tief + </string> + <string name="Default Heels"> + Standardabsätze + </string> + <string name="Default Toe"> + Standardspitze + </string> + <string name="Dense"> + Dicht + </string> + <string name="Dense hair"> + Dichtes Haar + </string> + <string name="Double Chin"> + Doppelkinn + </string> + <string name="Downturned"> + Nach unten + </string> + <string name="Duffle Bag"> + Groß + </string> + <string name="Ear Angle"> + Ohrenwinkel + </string> + <string name="Ear Size"> + Ohrengröße + </string> + <string name="Ear Tips"> + Ohrenspitzen + </string> + <string name="Egg Head"> + Eierkopf + </string> + <string name="Eye Bags"> + Augenränder + </string> + <string name="Eye Color"> + Augenfarbe + </string> + <string name="Eye Depth"> + Augentiefe + </string> + <string name="Eye Lightness"> + Helligkeit + </string> + <string name="Eye Opening"> + Öffnung + </string> + <string name="Eye Pop"> + Symmetrie + </string> + <string name="Eye Size"> + Augengröße + </string> + <string name="Eye Spacing"> + Augenstand + </string> + <string name="Eyeball Size"> + Größe des Augapfels + </string> + <string name="Eyebrow Arc"> + Brauenbogen + </string> + <string name="Eyebrow Density"> + Brauendichte + </string> + <string name="Eyebrow Height"> + Brauenhöhe + </string> + <string name="Eyebrow Points"> + Brauenenden + </string> + <string name="Eyebrow Size"> + Brauengröße + </string> + <string name="Eyelash Length"> + Wimpernlänge + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Farbe des Eyeliners + </string> + <string name="Eyes Back"> + Augen zurück + </string> + <string name="Eyes Bugged"> + Glubschaugen + </string> + <string name="Eyes Forward"> + Augen nach vorne + </string> + <string name="Eyes Long Head"> + Augen langer Kopf + </string> + <string name="Eyes Shear Left Up"> + Augen Verzerrung links hoch + </string> + <string name="Eyes Shear Right Up"> + Augen Verzerrung rechts hoch + </string> + <string name="Eyes Short Head"> + Augen kurzer Kopf + </string> + <string name="Eyes Spread"> + Augen auseinander + </string> + <string name="Eyes Sunken"> + eingesunkene Augen + </string> + <string name="Eyes Together"> + Augen zusammen + </string> + <string name="Face Shear"> + Gesichtsverzerrung + </string> + <string name="Facial Definition"> + Gesichtskonturen + </string> + <string name="Far Set Eyes"> + Weit auseinander + </string> + <string name="Fat"> + Dick + </string> + <string name="Fat Head"> + Dicker Kopf + </string> + <string name="Fat Lips"> + Volle Lippen + </string> + <string name="Fat Lower"> + Volle Unterlippe + </string> + <string name="Fat Lower Lip"> + Volle Unterlippe + </string> + <string name="Fat Torso"> + Dicker Körper + </string> + <string name="Fat Upper"> + Volle Oberlippe + </string> + <string name="Fat Upper Lip"> + Volle Oberlippe + </string> + <string name="Female"> + weiblich + </string> + <string name="Fingerless"> + Ohne Finger + </string> + <string name="Fingers"> + Finger + </string> + <string name="Flared Cuffs"> + Ausgestellt + </string> + <string name="Flat"> + Flach + </string> + <string name="Flat Butt"> + Flacher Hintern + </string> + <string name="Flat Head"> + Flacher Kopf + </string> + <string name="Flat Toe"> + Flache Spitze + </string> + <string name="Foot Size"> + Fußgröße + </string> + <string name="Forehead Angle"> + Stirnwinkel + </string> + <string name="Forehead Heavy"> + Stirn ausgeprägt + </string> + <string name="Freckles"> + Sommersprossen + </string> + <string name="Front Bangs Down"> + Langer Pony + </string> + <string name="Front Bangs Up"> + Kurzer Pony + </string> + <string name="Front Fringe"> + Fransen, vorne + </string> + <string name="Front Hair"> + Vorderhaar + </string> + <string name="Front Hair Down"> + langes Vorderhaar + </string> + <string name="Front Hair Up"> + Kurzes Vorderhaar + </string> + <string name="Full Back"> + Hinten volles Haar + </string> + <string name="Full Eyeliner"> + Starker Eyeliner + </string> + <string name="Full Front"> + Vorne volles Haar + </string> + <string name="Full Hair Sides"> + Seitlich volles Haar + </string> + <string name="Full Sides"> + Volle Seiten + </string> + <string name="Glossy"> + Glänzend + </string> + <string name="Glove Fingers"> + Handschuhfinger + </string> + <string name="Glove Length"> + Handschuhlänge + </string> + <string name="Hair"> + Haare + </string> + <string name="Hair Back"> + Haare: Hinten + </string> + <string name="Hair Front"> + Haare: Vorne + </string> + <string name="Hair Sides"> + Haare: Seiten + </string> + <string name="Hair Sweep"> + Haartolle + </string> + <string name="Hair Thickess"> + Haardicke + </string> + <string name="Hair Thickness"> + Haardicke + </string> + <string name="Hair Tilt"> + Haarneigung + </string> + <string name="Hair Tilted Left"> + Nach links + </string> + <string name="Hair Tilted Right"> + Nach rechts + </string> + <string name="Hair Volume"> + Haare: Volumen + </string> + <string name="Hand Size"> + Handgröße + </string> + <string name="Handlebars"> + Zwirbelbart + </string> + <string name="Head Length"> + Kopflänge + </string> + <string name="Head Shape"> + Kopfform + </string> + <string name="Head Size"> + Kopfgröße + </string> + <string name="Head Stretch"> + Kopfstreckung + </string> + <string name="Heel Height"> + Absatzhöhe + </string> + <string name="Heel Shape"> + Absatzform + </string> + <string name="Height"> + Höhe + </string> + <string name="High"> + Hoch + </string> + <string name="High Heels"> + Hohe Absätze + </string> + <string name="High Jaw"> + Hoch + </string> + <string name="High Platforms"> + Hohe Plattformsohlen + </string> + <string name="High and Tight"> + Hoch und eng + </string> + <string name="Higher"> + Höhere + </string> + <string name="Hip Length"> + Länge der Hüfte + </string> + <string name="Hip Width"> + Breite der Hüfte + </string> + <string name="In"> + In + </string> + <string name="In Shdw Color"> + Farbe Innenseite + </string> + <string name="In Shdw Opacity"> + Deckkraft: innerer Lidschatten + </string> + <string name="Inner Eye Corner"> + Ecke: Nasenseite + </string> + <string name="Inner Eye Shadow"> + Innerer Lidschatten + </string> + <string name="Inner Shadow"> + Innerer Lidschatten + </string> + <string name="Jacket Length"> + Jackenlänge + </string> + <string name="Jacket Wrinkles"> + Jackenfalten + </string> + <string name="Jaw Angle"> + Kinnansatz + </string> + <string name="Jaw Jut"> + Kinnposition + </string> + <string name="Jaw Shape"> + Kinnform + </string> + <string name="Join"> + Zusammen + </string> + <string name="Jowls"> + Hängebacken + </string> + <string name="Knee Angle"> + Kniewinkel + </string> + <string name="Knock Kneed"> + X-beinig + </string> + <string name="Large"> + Groß + </string> + <string name="Large Hands"> + Große Hände + </string> + <string name="Left Part"> + Linksscheitel + </string> + <string name="Leg Length"> + Beinlänge + </string> + <string name="Leg Muscles"> + Beinmuskeln + </string> + <string name="Less"> + Weniger + </string> + <string name="Less Body Fat"> + Weniger Speck + </string> + <string name="Less Curtains"> + Weniger + </string> + <string name="Less Freckles"> + Weniger + </string> + <string name="Less Full"> + Weniger + </string> + <string name="Less Gravity"> + Weniger + </string> + <string name="Less Love"> + Weniger + </string> + <string name="Less Muscles"> + Weniger + </string> + <string name="Less Muscular"> + Weniger + </string> + <string name="Less Rosy"> + Weniger + </string> + <string name="Less Round"> + Weniger + </string> + <string name="Less Saddle"> + Weniger + </string> + <string name="Less Square"> + Weniger + </string> + <string name="Less Volume"> + Weniger + </string> + <string name="Less soul"> + Weniger + </string> + <string name="Lighter"> + Heller + </string> + <string name="Lip Cleft"> + Amorbogen + </string> + <string name="Lip Cleft Depth"> + Tiefe: Amorbogen + </string> + <string name="Lip Fullness"> + Fülle + </string> + <string name="Lip Pinkness"> + Pinkton + </string> + <string name="Lip Ratio"> + Lippenproportionen + </string> + <string name="Lip Thickness"> + Lippendicke + </string> + <string name="Lip Width"> + Mundbreite + </string> + <string name="Lipgloss"> + Lipgloss + </string> + <string name="Lipstick"> + Lippenstift + </string> + <string name="Lipstick Color"> + Farbe + </string> + <string name="Long"> + Lang + </string> + <string name="Long Head"> + Langer Kopf + </string> + <string name="Long Hips"> + Lange Hüften + </string> + <string name="Long Legs"> + Lange Beine + </string> + <string name="Long Neck"> + Langer Hals + </string> + <string name="Long Pigtails"> + Lange Zöpfe + </string> + <string name="Long Ponytail"> + Langer Pferdeschwanz + </string> + <string name="Long Torso"> + Langer Oberkörper + </string> + <string name="Long arms"> + Lange Arme + </string> + <string name="Longcuffs"> + Manschetten + </string> + <string name="Loose Pants"> + Weite Hosen + </string> + <string name="Loose Shirt"> + Weites Hemd + </string> + <string name="Loose Sleeves"> + Weite Ärmel + </string> + <string name="Love Handles"> + Fettpölsterchen + </string> + <string name="Low"> + Niedrig + </string> + <string name="Low Heels"> + Niedrig + </string> + <string name="Low Jaw"> + Niedrig + </string> + <string name="Low Platforms"> + Niedrig + </string> + <string name="Low and Loose"> + Weit + </string> + <string name="Lower"> + Absenken + </string> + <string name="Lower Bridge"> + Brücke, Unterer Teil + </string> + <string name="Lower Cheeks"> + Wangen, unterer Bereich + </string> + <string name="Male"> + Männlich + </string> + <string name="Middle Part"> + Mittelscheitel + </string> + <string name="More"> + Mehr + </string> + <string name="More Blush"> + Mehr + </string> + <string name="More Body Fat"> + Mehr Speck + </string> + <string name="More Curtains"> + Mehr + </string> + <string name="More Eyeshadow"> + Mehr + </string> + <string name="More Freckles"> + Mehr + </string> + <string name="More Full"> + Voller + </string> + <string name="More Gravity"> + Mehr + </string> + <string name="More Lipstick"> + Mehr + </string> + <string name="More Love"> + Mehr + </string> + <string name="More Lower Lip"> + Größer + </string> + <string name="More Muscles"> + Mehr + </string> + <string name="More Muscular"> + Mehr + </string> + <string name="More Rosy"> + Mehr + </string> + <string name="More Round"> + Runder + </string> + <string name="More Saddle"> + Mehr + </string> + <string name="More Sloped"> + Mehr + </string> + <string name="More Square"> + Mehr + </string> + <string name="More Upper Lip"> + Mehr + </string> + <string name="More Vertical"> + Mehr + </string> + <string name="More Volume"> + Mehr + </string> + <string name="More soul"> + Mehr + </string> + <string name="Moustache"> + Schnauzer + </string> + <string name="Mouth Corner"> + Mundwinkel + </string> + <string name="Mouth Position"> + Mundposition + </string> + <string name="Mowhawk"> + Irokese + </string> + <string name="Muscular"> + Muskulös + </string> + <string name="Mutton Chops"> + Koteletten + </string> + <string name="Nail Polish"> + Nagellack + </string> + <string name="Nail Polish Color"> + Farbe + </string> + <string name="Narrow"> + Schmal + </string> + <string name="Narrow Back"> + Wenig + </string> + <string name="Narrow Front"> + Wenig + </string> + <string name="Narrow Lips"> + Schmale Lippen + </string> + <string name="Natural"> + Natürlich + </string> + <string name="Neck Length"> + Halslänge + </string> + <string name="Neck Thickness"> + Halsdicke + </string> + <string name="No Blush"> + Kein Rouge + </string> + <string name="No Eyeliner"> + Kein Eyeliner + </string> + <string name="No Eyeshadow"> + Kein Lidschatten + </string> + <string name="No Heels"> + Keine Absätze + </string> + <string name="No Lipgloss"> + Kein Lipgloss + </string> + <string name="No Lipstick"> + Kein Lippenstift + </string> + <string name="No Part"> + Kein Scheitel + </string> + <string name="No Polish"> + Kein Nagellack + </string> + <string name="No Red"> + Nicht rot + </string> + <string name="No Spikes"> + Keine Stachel + </string> + <string name="No White"> + Kein Weiß + </string> + <string name="No Wrinkles"> + Keine Falten + </string> + <string name="Normal Lower"> + Normal unten + </string> + <string name="Normal Upper"> + Normal oben + </string> + <string name="Nose Left"> + Links + </string> + <string name="Nose Right"> + Rechts + </string> + <string name="Nose Size"> + Größe + </string> + <string name="Nose Thickness"> + Dicke + </string> + <string name="Nose Tip Angle"> + Nasenspitze + </string> + <string name="Nose Tip Shape"> + Nasenspitze + </string> + <string name="Nose Width"> + Nasenbreite + </string> + <string name="Nostril Division"> + Teilung + </string> + <string name="Nostril Width"> + Größe + </string> + <string name="Old"> + Alt + </string> + <string name="Opaque"> + Deckend + </string> + <string name="Open"> + Öffnen + </string> + <string name="Open Back"> + Hinten offen + </string> + <string name="Open Front"> + Vorne offen + </string> + <string name="Open Left"> + Links offen + </string> + <string name="Open Right"> + Rechts offen + </string> + <string name="Orange"> + Orange + </string> + <string name="Out"> + Aus + </string> + <string name="Out Shdw Color"> + Farbe: Oberer Lidschatten + </string> + <string name="Out Shdw Opacity"> + Deckkraft: Oberer Lidschatten + </string> + <string name="Outer Eye Corner"> + Äußerer Augenwinkel + </string> + <string name="Outer Eye Shadow"> + Lidschatten: Oben + </string> + <string name="Outer Shadow"> + Lidschatten: Oben + </string> + <string name="Overbite"> + Überbiss + </string> + <string name="Package"> + Ausbeulung + </string> + <string name="Painted Nails"> + Lackierte Nägel + </string> + <string name="Pale"> + Blass + </string> + <string name="Pants Crotch"> + Schritt + </string> + <string name="Pants Fit"> + Passform + </string> + <string name="Pants Length"> + Hosenlänge + </string> + <string name="Pants Waist"> + Hüfte + </string> + <string name="Pants Wrinkles"> + Falten + </string> + <string name="Part"> + Scheitel + </string> + <string name="Part Bangs"> + Pony scheiteln + </string> + <string name="Pectorals"> + Brustmuskel + </string> + <string name="Pigment"> + Pigmentierung + </string> + <string name="Pigtails"> + Zöpfe + </string> + <string name="Pink"> + Pink + </string> + <string name="Pinker"> + Mehr Pink + </string> + <string name="Platform Height"> + Höhe + </string> + <string name="Platform Width"> + Breite + </string> + <string name="Pointy"> + Spitz + </string> + <string name="Pointy Heels"> + Pfennigabsätze + </string> + <string name="Pointy Toe"> + Spitz + </string> + <string name="Ponytail"> + Pferdeschwanz + </string> + <string name="Poofy Skirt"> + Weit ausgestellt + </string> + <string name="Pop Left Eye"> + Linkes Auge größer + </string> + <string name="Pop Right Eye"> + Rechtes Auge größer + </string> + <string name="Puffy"> + Geschwollen + </string> + <string name="Puffy Eyelids"> + Geschwollene Lider + </string> + <string name="Rainbow Color"> + Regenbogenfarben + </string> + <string name="Red Hair"> + Rote Haare + </string> + <string name="Red Skin"> + Rote Haut + </string> + <string name="Regular"> + Normal + </string> + <string name="Regular Muscles"> + Normal muskulös + </string> + <string name="Right Part"> + Scheitel rechts + </string> + <string name="Rosy Complexion"> + Rosiger Teint + </string> + <string name="Round"> + Rund + </string> + <string name="Round Forehead"> + Runde Stirn + </string> + <string name="Ruddiness"> + Röte + </string> + <string name="Ruddy"> + Rötlich + </string> + <string name="Rumpled Hair"> + Zerzauste Haare + </string> + <string name="Saddle Bags"> + Hüftspeck + </string> + <string name="Saddlebags"> + Hüftspeck + </string> + <string name="Scrawny"> + Dürr + </string> + <string name="Scrawny Leg"> + Dürres Bein + </string> + <string name="Separate"> + Auseinander + </string> + <string name="Shading"> + Schattierung + </string> + <string name="Shadow hair"> + Schattenhaar + </string> + <string name="Shallow"> + Flach + </string> + <string name="Shear Back"> + Hinterkopf rasiert + </string> + <string name="Shear Face"> + Gesicht verzerren + </string> + <string name="Shear Front"> + Vorne rasiert + </string> + <string name="Shear Left"> + Links + </string> + <string name="Shear Left Up"> + Links + </string> + <string name="Shear Right"> + Rechts + </string> + <string name="Shear Right Up"> + Rechts + </string> + <string name="Sheared Back"> + Hinterkopf rasiert + </string> + <string name="Sheared Front"> + Vorne rasiert + </string> + <string name="Shift Left"> + Nach links + </string> + <string name="Shift Mouth"> + Mund verschieben + </string> + <string name="Shift Right"> + Nach rechts + </string> + <string name="Shirt Bottom"> + Hemdlänge + </string> + <string name="Shirt Fit"> + Passform + </string> + <string name="Shirt Wrinkles"> + Falten + </string> + <string name="Shoe Height"> + Höhe + </string> + <string name="Short"> + Kurz + </string> + <string name="Short Arms"> + Kurze Arme + </string> + <string name="Short Legs"> + Kurze Beine + </string> + <string name="Short Neck"> + Kurzer Hals + </string> + <string name="Short Pigtails"> + Kurze Zöpfe + </string> + <string name="Short Ponytail"> + Kurzer Pferdeschwanz + </string> + <string name="Short Sideburns"> + Kurze Koteletten + </string> + <string name="Short Torso"> + Kurzer Oberkörper + </string> + <string name="Short hips"> + Kurze Hüften + </string> + <string name="Shoulders"> + Schultern + </string> + <string name="Side Bangs"> + Seitlicher Pony + </string> + <string name="Side Bangs Down"> + Lang + </string> + <string name="Side Bangs Up"> + Kurz + </string> + <string name="Side Fringe"> + Seitliche Fransen + </string> + <string name="Sideburns"> + Koteletten + </string> + <string name="Sides Hair"> + Seitliches Haar + </string> + <string name="Sides Hair Down"> + Lang + </string> + <string name="Sides Hair Up"> + Kurz + </string> + <string name="Skinny"> + Dünn + </string> + <string name="Skinny Neck"> + Dünner Hals + </string> + <string name="Skirt Fit"> + Passform + </string> + <string name="Skirt Length"> + Rocklänge + </string> + <string name="Slanted Forehead"> + Fliehende Stirn + </string> + <string name="Sleeve Length"> + Ärmellänge + </string> + <string name="Sleeve Looseness"> + Passform Ärmel + </string> + <string name="Slit Back"> + Schlitz: Hinten + </string> + <string name="Slit Front"> + Schlitz: Vorne + </string> + <string name="Slit Left"> + Schlitz: Links + </string> + <string name="Slit Right"> + Schlitz: Rechts + </string> + <string name="Small"> + Klein + </string> + <string name="Small Hands"> + Kleine Hände + </string> + <string name="Small Head"> + Kleiner Kopf + </string> + <string name="Smooth"> + Glätten + </string> + <string name="Smooth Hair"> + Glattes Haar + </string> + <string name="Socks Length"> + Strumpflänge + </string> + <string name="Some"> + Etwas + </string> + <string name="Soulpatch"> + Unterlippenbart + </string> + <string name="Sparse"> + Wenig + </string> + <string name="Spiked Hair"> + Stachelhaare + </string> + <string name="Square"> + Rechteck + </string> + <string name="Square Toe"> + Eckig + </string> + <string name="Squash Head"> + Gestaucht + </string> + <string name="Squash/Stretch Head"> + Gestretcht/Gestaucht + </string> + <string name="Stretch Head"> + Gestreckt + </string> + <string name="Sunken"> + Eingefallen + </string> + <string name="Sunken Chest"> + Trichterbrust + </string> + <string name="Sunken Eyes"> + Eingesunkene Augen + </string> + <string name="Sweep Back"> + Nach hinten + </string> + <string name="Sweep Forward"> + Nach vorne + </string> + <string name="Swept Back"> + Nach hinten + </string> + <string name="Swept Back Hair"> + Haar nach hinten + </string> + <string name="Swept Forward"> + Haare nach vorne + </string> + <string name="Swept Forward Hair"> + Haare nach vorne + </string> + <string name="Tall"> + Groß + </string> + <string name="Taper Back"> + Ansatzbreite hinten + </string> + <string name="Taper Front"> + Ansatzbreite vorne + </string> + <string name="Thick Heels"> + Dicke Absätze + </string> + <string name="Thick Neck"> + Dicker Hals + </string> + <string name="Thick Toe"> + Dick + </string> + <string name="Thickness"> + Dicke + </string> + <string name="Thin"> + Dünn + </string> + <string name="Thin Eyebrows"> + Dünne Augenbrauen + </string> + <string name="Thin Lips"> + Dünne Lippen + </string> + <string name="Thin Nose"> + Dünne Nase + </string> + <string name="Tight Chin"> + Straffes Kinn + </string> + <string name="Tight Cuffs"> + Eng + </string> + <string name="Tight Pants"> + Enge Hosen + </string> + <string name="Tight Shirt"> + Enges Hemd + </string> + <string name="Tight Skirt"> + Enger Rock + </string> + <string name="Tight Sleeves"> + Enge Ärmel + </string> + <string name="Tilt Left"> + Nach links + </string> + <string name="Tilt Right"> + Nach rechts + </string> + <string name="Toe Shape"> + Spitze + </string> + <string name="Toe Thickness"> + Dicke + </string> + <string name="Torso Length"> + Länge des Oberkörpers + </string> + <string name="Torso Muscles"> + Muskeln + </string> + <string name="Torso Scrawny"> + Dürr + </string> + <string name="Unattached"> + Frei + </string> + <string name="Uncreased"> + Straffes Lid + </string> + <string name="Underbite"> + Unterbiss + </string> + <string name="Unnatural"> + Unnatürlich + </string> + <string name="Upper Bridge"> + Brücke, oberer Teil + </string> + <string name="Upper Cheeks"> + Obere Wangen + </string> + <string name="Upper Chin Cleft"> + Obere Kinnspalte + </string> + <string name="Upper Eyelid Fold"> + Obere Lidfalte + </string> + <string name="Upturned"> + Stupsnase + </string> + <string name="Very Red"> + Sehr rot + </string> + <string name="Waist Height"> + Bund + </string> + <string name="Well-Fed"> + Gut genährt + </string> + <string name="White Hair"> + Weiße Haare + </string> + <string name="Wide"> + Breit + </string> + <string name="Wide Back"> + Breit + </string> + <string name="Wide Front"> + Breit + </string> + <string name="Wide Lips"> + Breit + </string> + <string name="Wild"> + Wild + </string> + <string name="Wrinkles"> + Falten + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Zu meinen Landmarken hinzufügen + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Meine Landmarken bearbeiten + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Aktualisierung + </string> + <string name="UpdaterNowUpdating"> + [APP_NAME] wird aktualisiert... + </string> + <string name="UpdaterNowInstalling"> + [APP_NAME] wird installiert... + </string> + <string name="UpdaterUpdatingDescriptive"> + Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Aktualisierung wird heruntergeladen... + </string> + <string name="UpdaterProgressBarText"> + Aktualisierung wird heruntergeladen + </string> + <string name="UpdaterFailDownloadTitle"> + Herunterladen ist fehlgeschlagen + </string> + <string name="UpdaterFailUpdateDescriptive"> + Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + </string> + <string name="UpdaterFailInstallTitle"> + Aktualisierung konnte nicht installiert werden + </string> + <string name="UpdaterFailStartTitle"> + Viewer konnte nicht gestartet werden + </string> + <string name="only_user_message"> + Sie sind der einzige Benutzer in dieser Sitzung. + </string> + <string name="offline_message"> + [FIRST] [LAST] ist offline. + </string> + <string name="invite_message"> + Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. + </string> + <string name="generic_request_error"> + Fehler bei Anfrage, bitte versuchen Sie es später. + </string> + <string name="insufficient_perms_error"> + Sie sind dazu nicht berechtigt. + </string> + <string name="session_does_not_exist_error"> + Die Sitzung ist abgelaufen + </string> + <string name="no_ability_error"> + Sie besitzen diese Fähigkeit nicht. + </string> + <string name="no_ability"> + Sie besitzen diese Fähigkeit nicht. + </string> + <string name="not_a_mod_error"> + Sie sind kein Sitzungsmoderator. + </string> + <string name="muted_error"> + Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. + </string> + <string name="add_session_event"> + Es konnten keine Benutzer 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. + </string> + <string name="removed_from_group"> + Sie wurden von der Gruppe ausgeschlossen. + </string> + <string name="close_on_no_ability"> + Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. + </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 231798c6a6f0fda31630f8bd4d0abee963ab5a14..2c56eff0a3187c1707c8ca012b8435f69d9fb4d2 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -1,78 +1,78 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<teleport_messages name=""> - <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. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - </message> - <message name="invalid_region_handoff"> - Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - </message> - <message name="blocked_tport"> - Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. -Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. - </message> - <message name="nolandmark_tport"> - Das System konnte das Landmarken-Ziel nicht finden. - </message> - <message name="timeout_tport"> - Das System konnte keine Teleport-Verbindung herstellen. -Versuchen Sie es später noch einmal. - </message> - <message name="noaccess_tport"> - Sie haben leider keinen Zugang zu diesem Teleport-Ziel. - </message> - <message name="missing_attach_tport"> - Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. - </message> - <message name="too_many_uploads_tport"> - Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. -Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. - </message> - <message name="expired_tport"> - Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </message> - <message name="expired_region_handoff"> - Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </message> - <message name="no_host"> - Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. - </message> - <message name="no_inventory_host"> - Das Inventarsystem ist zurzeit nicht verfügbar. - </message> - </message_set> - <message_set name="progress"> - <message name="sending_dest"> - Transport zum Ziel. - </message> - <message name="redirecting"> - Weiterleitung an anderes Ziel. - </message> - <message name="relaying"> - Weiterleitung zum Ziel. - </message> - <message name="sending_home"> - Zuhause-Position wird ermittelt. - </message> - <message name="sending_landmark"> - Landmarken-Position wird ermittelt. - </message> - <message name="completing"> - Teleport wird abgeschlossen. - </message> - <message name="resolving"> - Ziel wird ermittelt. - </message> - <message name="contacting"> - Verbindung zu neuer Region. - </message> - <message name="arriving"> - Ziel erreicht... - </message> - <message name="requesting"> - Teleport wird initialisiert... - </message> - </message_set> -</teleport_messages> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<teleport_messages name=""> + <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. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. +Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. + </message> + <message name="nolandmark_tport"> + Das System konnte das Landmarken-Ziel nicht finden. + </message> + <message name="timeout_tport"> + Das System konnte keine Teleport-Verbindung herstellen. +Versuchen Sie es später noch einmal. + </message> + <message name="noaccess_tport"> + Sie haben leider keinen Zugang zu diesem Teleport-Ziel. + </message> + <message name="missing_attach_tport"> + Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. + </message> + <message name="too_many_uploads_tport"> + Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. +Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. + </message> + <message name="expired_tport"> + Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="expired_region_handoff"> + Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="no_host"> + Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="no_inventory_host"> + Das Inventarsystem ist zurzeit nicht verfügbar. + </message> + </message_set> + <message_set name="progress"> + <message name="sending_dest"> + Transport zum Ziel. + </message> + <message name="redirecting"> + Weiterleitung an anderes Ziel. + </message> + <message name="relaying"> + Weiterleitung zum Ziel. + </message> + <message name="sending_home"> + Zuhause-Position wird ermittelt. + </message> + <message name="sending_landmark"> + Landmarken-Position wird ermittelt. + </message> + <message name="completing"> + Teleport wird abgeschlossen. + </message> + <message name="resolving"> + Ziel wird ermittelt. + </message> + <message name="contacting"> + Verbindung zu neuer Region. + </message> + <message name="arriving"> + Ziel erreicht... + </message> + <message name="requesting"> + Teleport wird initialisiert... + </message> + </message_set> +</teleport_messages> diff --git a/indra/newview/skins/default/xui/en/alert_button.xml b/indra/newview/skins/default/xui/en/alert_button.xml new file mode 100644 index 0000000000000000000000000000000000000000..48c67a3770b90c613bbbcc2ae550e43c0e3f98d6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/alert_button.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> + +<button + label_shadow="true" + auto_resize="false" + image_overlay_alignment="center" + use_ellipses="flse" + pad_right="10" + pad_left="10" + is_toggle="false" + scale_image="true" + commit_on_return="true" + font="SansSerifSmall" + follows="bottom"/> diff --git a/indra/newview/skins/default/xui/en/alert_check_box.xml b/indra/newview/skins/default/xui/en/alert_check_box.xml new file mode 100644 index 0000000000000000000000000000000000000000..9f1bdb51939f7c8f9b518ad9c5221daee6b6793c --- /dev/null +++ b/indra/newview/skins/default/xui/en/alert_check_box.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<check_box + text_enabled_color="LabelTextColor" + text_disabled_color="LabelDisabledColor" + font="SansSerif" + follows="left|top" + name="check"/> \ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/alert_icon.xml b/indra/newview/skins/default/xui/en/alert_icon.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0886fce0616ad624447e11b33d22f571251bc24 --- /dev/null +++ b/indra/newview/skins/default/xui/en/alert_icon.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<icon color="1.0 1.0 1.0 1.0" + tab_stop="false" + mouse_opaque="false" + name="icon" + image_name="notify_caution_icon.tga" + follows="left|top"> +</icon> diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab708adb06b327bddfd82133f1bf37cfa64328a9 --- /dev/null +++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml @@ -0,0 +1,11 @@ +<?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" + max_length="254" + text_pad_right="0" + text_pad_left="0" + mouse_opaque="true"/> diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index d0d0cc64c55ee442f775141b8850b98c77fd7579..4bbd5618827fe48d4fb324c6d6bfe8f40d01f15b 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -5,5 +5,6 @@ name="floater_aaa" can_resize="true" width="1024"> + <string name="Nudge Parabuild">2</string> <panel filename="main_view.xml" follows="all" width="1024" height="768" top="0"/> </floater> 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 615d1bf18d4e9e764f164db93e4a4ce39f439f94..4f1024f56d9f401dfafbbb1964aebfaa8b542fd7 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater can_tear_off="false" height="420" @@ -215,7 +215,6 @@ Go to World menu > About Land or select another parcel to show its details. </text> <button follows="left|top" - font="SansSerifSmall" height="16" label="Profile..." label_selected="Profile..." @@ -247,7 +246,6 @@ Go to World menu > About Land or select another parcel to show its details. width="250" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Set..." label_selected="Set..." @@ -269,7 +267,6 @@ Go to World menu > About Land or select another parcel to show its details. <button enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Deed..." label_selected="Deed..." @@ -928,7 +925,6 @@ Go to World menu > About Land or select another parcel to show its details. bottom="100" enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Show" label_selected="Show" @@ -940,7 +936,6 @@ Go to World menu > About Land or select another parcel to show its details. bottom="100" enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Return..." label_selected="Return..." @@ -977,7 +972,6 @@ Go to World menu > About Land or select another parcel to show its details. bottom="120" enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Show" label_selected="Show" @@ -989,7 +983,6 @@ Go to World menu > About Land or select another parcel to show its details. bottom="120" enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Return..." label_selected="Return..." @@ -1026,7 +1019,6 @@ Go to World menu > About Land or select another parcel to show its details. bottom="140" enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Show" label_selected="Show" @@ -1038,7 +1030,6 @@ Go to World menu > About Land or select another parcel to show its details. bottom="140" enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Return..." label_selected="Return..." @@ -1108,7 +1099,6 @@ Go to World menu > About Land or select another parcel to show its details. </text> <button follows="left|top" - font="SansSerifSmall" height="16" label="Refresh List" label_selected="Refresh List" @@ -1120,7 +1110,6 @@ Go to World menu > About Land or select another parcel to show its details. <button enabled="false" follows="left|top" - font="SansSerifSmall" height="16" label="Return objects..." label_selected="Return objects..." @@ -1531,7 +1520,6 @@ Only large parcels can be listed in search. </text> <button follows="left|top" - font="SansSerifSmall" height="16" label="Set" label_selected="Set" @@ -1543,7 +1531,6 @@ Only large parcels can be listed in search. width="50" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Clear" label_selected="Clear" @@ -1654,7 +1641,6 @@ Only large parcels can be listed in search. text_readonly_color="0.576471 0.662745 0.835294 1" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Set..." label_selected="Set..." @@ -1685,7 +1671,6 @@ Only large parcels can be listed in search. width="300" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Reset..." label_selected="Reset..." @@ -2119,7 +2104,6 @@ Texture: width="80" /> <button follows="bottom" - font="SansSerifSmall" height="16" label="Remove" label_selected="Remove" @@ -2155,7 +2139,6 @@ Texture: width="195" /> <button follows="bottom" - font="SansSerifSmall" height="16" label="Add..." label_selected="Add..." @@ -2167,7 +2150,6 @@ Texture: <button enabled="false" follows="bottom" - font="SansSerifSmall" height="16" label="Remove" label_selected="Remove" 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 ebce758d3d7ac8cb21b8b9cd48889e824350eadc..41b1f99d4196ded5e452ca26c7d7a301f2189074 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -163,7 +163,7 @@ Maximum animation length is [MAX_LENGTH] seconds. follows="top|left|right" height="23" layout="topleft" - left="85" + left="100" name="name_form" right="-10" /> <text @@ -182,7 +182,7 @@ Maximum animation length is [MAX_LENGTH] seconds. follows="top|left|right" height="23" layout="topleft" - left="85" + left="100" name="description_form" right="-10" /> <spinner @@ -192,7 +192,7 @@ Maximum animation length is [MAX_LENGTH] seconds. increment="1" initial_value="0" label="Priority" - label_width="90" + label_width="88" layout="topleft" left="10" max_val="4" @@ -214,14 +214,14 @@ Maximum animation length is [MAX_LENGTH] seconds. increment="1" initial_value="0" label="In(%)" - label_width="35" + label_width="49" layout="topleft" top_pad="5" left="30" max_val="100" name="loop_in_point" tool_tip="Sets point in animation that looping returns to" - width="110" /> + width="115" /> <spinner bottom_delta="0" follows="left|top" @@ -234,8 +234,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="45" - width="120" /> + label_width="49" + width="115" /> <text type="string" length="1" @@ -243,6 +243,7 @@ Maximum animation length is [MAX_LENGTH] seconds. follows="top|left" height="23" width="110" + word_wrap="true" layout="topleft" left="10" name="hand_label"> @@ -315,6 +316,7 @@ Maximum animation length is [MAX_LENGTH] seconds. follows="top|left" height="23" width="110" + word_wrap="true" layout="topleft" left="10" name="emote_label"> @@ -395,6 +397,7 @@ Maximum animation length is [MAX_LENGTH] seconds. follows="top|left" height="23" width="110" + word_wrap="true" layout="topleft" left="10" name="preview_label"> @@ -482,6 +485,8 @@ Maximum animation length is [MAX_LENGTH] seconds. <text type="string" length="1" + height="72" + word_wrap="true" top_pad="5" text_color="EmphasisColor" follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index a0f9bb59fd2cb0849e75cd369e5a585115010e5c..953bd08dd41ace4a534528f1de45ddd1e2099eec 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -16,7 +16,7 @@ </floater.string> <floater.string name="no_one_near"> - No-one near + No one near </floater.string> <floater.string name="no_results"> @@ -26,6 +26,12 @@ name="searching"> Searching... </floater.string> + <!-- For multiple person selection, use "Select" and "Close" + instead of "OK" and "Cancel" because "Cancel" still keeps the ones + you have already selected. The code will show the appropriate + set of buttons. --> + <string name="Select">Select</string> + <string name="Close">Close</string> <tab_container follows="all" height="300" @@ -205,7 +211,7 @@ height="23" label="OK" label_selected="OK" - name="Select" + name="ok_btn" top_pad="3" left="46" width="100" /> @@ -214,7 +220,7 @@ height="23" label="Cancel" label_selected="Cancel" - name="Cancel" + name="cancel_btn" width="100" left_pad="5" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_build_options.xml b/indra/newview/skins/default/xui/en/floater_build_options.xml index f0e678af003cde855731e9e347028c6692b1b5a6..56230e912c26737e23f4791916c38bbe8bceb0d9 100644 --- a/indra/newview/skins/default/xui/en/floater_build_options.xml +++ b/indra/newview/skins/default/xui/en/floater_build_options.xml @@ -15,14 +15,14 @@ height="23" initial_value="1" label="Grid Units (meters)" - label_width="130" + label_width="160" layout="topleft" left="10" max_val="5" min_val="0.01" name="GridResolution" top="25" - width="200" /> + width="230" /> <spinner control_name="GridDrawSize" decimal_digits="1" @@ -31,14 +31,14 @@ increment="0.5" initial_value="5" label="Grid Extents (meters)" - label_width="130" + label_width="160" layout="topleft" left_delta="0" max_val="50" min_val="1" name="GridDrawSize" top_pad="0" - width="200" /> + width="230" /> <check_box control_name="GridSubUnit" height="16" diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml index 833e8beb8d4116c627607ed9b71c9cb9e3422f81..77a0e9b91bfb69ffbc58eb7516bd5fcb9c5b7a4f 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml @@ -56,7 +56,7 @@ <text type="string" length="1" - follows="left|top" + follows="left|bottom" font="SansSerif" height="16" layout="topleft" @@ -68,7 +68,7 @@ Buy for L$[AMOUNT] from [NAME]? </text> <check_box - follows="left|top" + follows="left|bottom" height="16" label="Wear clothing now" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 5c09bc3a02b338eacc634d029fe4fc7c4ae4cb76..69f9f6a2f874df5642d0095cd3ff21b4e8751f9d 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -49,22 +49,57 @@ top="22" visible="false" width="78" /> - <!--TODO: replace with slider, + - images --> - <joystick_zoom - follows="top|left" - height="78" - image_unselected="ScrollThumb_Vert" - layout="topleft" - left="7" - minus_image="ScrollThumb_Vert" - name="zoom" - plus_image="ScrollThumb_Vert" - quadrant="left" - scale_image="false" - sound_flags="3" - tool_tip="Zoom camera toward focus" - top="22" - width="20" /> + <!--TODO: replace + - images --> + <panel + border="false" + class="camera_zoom_panel" + height="94" + layout="topleft" + left="7" + mouse_opaque="false" + name="zoom" + top="22" + width="18"> + <button + follows="top|left" + height="18" + image_disabled="AddItem_Disabled" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + layout="topleft" + name="zoom_plus_btn" + width="18"> + <commit_callback + function="Zoom.plus" /> + <mouse_held_callback + function="Zoom.plus" /> + </button> + <slider_bar + height="48" + layout="topleft" + name="zoom_slider" + orientation="vertical" + tool_tip="Zoom camera toward focus" + top_pad="0" + width="18"> + <commit_callback function="Slider.value_changed"/> + </slider_bar> + <button + follows="top|left" + height="18" + image_disabled="MinusItem_Disabled" + image_selected="MinusItem_Press" + image_unselected="MinusItem_Off" + layout="topleft" + name="zoom_minus_btn" + top_pad="0" + width="18"> + <commit_callback + function="Zoom.minus" /> + <mouse_held_callback + function="Zoom.minus" /> + </button> + </panel> <joystick_rotate follows="top|left" height="78" @@ -72,6 +107,7 @@ image_unselected="Cam_Rotate_Out" layout="topleft" left="45" + mouse_opaque="false" name="cam_rotate_stick" quadrant="left" scale_image="false" @@ -80,7 +116,7 @@ tool_tip="Orbit camera around focus" top="22" width="78" /> - <panel + <panel height="78" layout="topleft" left="36" diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index 6c4f10e61e17e923b19e0fde220054a95a4aaa05..275ab5bb8be7f3b256fd13f36aecca07be6acdef 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -64,7 +64,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Body" label_selected="Body" @@ -75,7 +74,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Head" label_selected="Head" @@ -86,7 +84,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Eyes" label_selected="Eyes" @@ -97,7 +94,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Ears" label_selected="Ears" @@ -108,7 +104,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Nose" label_selected="Nose" @@ -119,7 +114,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Mouth" label_selected="Mouth" @@ -130,7 +124,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Chin" label_selected="Chin" @@ -141,7 +134,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Torso" label_selected="Torso" @@ -152,7 +144,6 @@ width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Legs" label_selected="Legs" @@ -351,7 +342,6 @@ scratch and wear it. width="16" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Skin Color" label_selected="Skin Color" @@ -362,7 +352,6 @@ scratch and wear it. width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Face Detail" label_selected="Face Detail" @@ -373,7 +362,6 @@ scratch and wear it. width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Makeup" label_selected="Makeup" @@ -384,7 +372,6 @@ scratch and wear it. width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Body Detail" label_selected="Body Detail" @@ -606,7 +593,6 @@ scratch and wear it. width="16" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Color" label_selected="Color" @@ -617,7 +603,6 @@ scratch and wear it. width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Style" label_selected="Style" @@ -628,7 +613,6 @@ scratch and wear it. width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Eyebrows" label_selected="Eyebrows" @@ -639,7 +623,6 @@ scratch and wear it. width="82" /> <button follows="left|top" - font="SansSerifSmall" height="16" label="Facial" label_selected="Facial" @@ -3379,6 +3362,16 @@ scratch and wear it. layout="topleft" name="panel_list" /> </scroll_container> + <button + bottom="536" + follows="right|bottom" + height="20" + label="Make Outfit" + label_selected="Make Outfit" + layout="topleft" + name="make_outfit_btn" + right="-216" + width="100" /> <button bottom="536" follows="right|bottom" 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 5233cb023d4a2f798c797511d229beb7d04eaf09..5e78037ee1641101f6095953b9df03c13ce81038 100644 --- a/indra/newview/skins/default/xui/en/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml @@ -136,7 +136,6 @@ width="210" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="Use Estate Time" layout="topleft" @@ -146,7 +145,6 @@ width="137" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="Advanced Sky" layout="topleft" @@ -156,7 +154,6 @@ width="137" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="Advanced Water" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml index b23482655cf524845464bf121cd5188e966d7b5b..9f5e6828d20d4fb308b09036d38b7dabbd3b8e27 100644 --- a/indra/newview/skins/default/xui/en/floater_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_gesture.xml @@ -21,12 +21,16 @@ name="playing"> (Playing) </floater.string> + <!-- It's used to build new name for gesture created by "Copy" menu item --> + <floater.string + name="copy_name">Copy of [COPY_NAME]</floater.string> <scroll_list bottom_delta="400" draw_heading="true" follows="all" layout="topleft" left="0" + multi_select="true" top="20" name="gesture_list"> <scroll_list.columns @@ -57,18 +61,18 @@ left="0" name="bottom_panel" width="313"> - <button + <menu_button follows="bottom|left" - font="SansSerifBigBold" - tool_tip="Change sort and view of recent residents list" height="18" image_disabled="OptionsMenu_Disabled" image_selected="OptionsMenu_Press" image_unselected="OptionsMenu_Off" layout="topleft" left="10" - name="recent_viewsort_btn" + menu_filename="menu_gesture_gear.xml" + name="gear_btn" top="5" + tool_tip="More options" width="18" /> <button follows="bottom|left" @@ -83,22 +87,35 @@ tool_tip="Make new gesture" top_delta="0" width="18" /> - <button + <button follows="bottom|left" font="SansSerifBigBold" + height="10" + image_hover_selected="Activate_Checkmark" + image_selected="Activate_Checkmark" + image_unselected="Activate_Checkmark" + layout="topleft" + left_pad="5" + name="activate_btn" + tool_tip="Activate/Deactivate selected gesture" + top="10" + width="10" /> + <button + follows="bottom|right" + font="SansSerifBigBold" height="18" image_selected="TrashItem_Press" image_unselected="TrashItem_Off" image_disabled="TrashItem_Disabled" layout="topleft" - left_pad="230" name="del_btn" + right="-5" tool_tip="Delete this gesture" top_delta="0" width="18" /> </panel> <button - follows="bottom|right" + follows="left|bottom" height="23" label="Edit" layout="topleft" @@ -107,7 +124,7 @@ top_pad="5" width="83" /> <button - follows="bottom|right" + follows="left|bottom" height="23" label="Play" layout="topleft" @@ -116,7 +133,7 @@ top_delta="0" width="83" /> <button - follows="bottom|right" + follows="left|bottom" height="23" label="Stop" layout="topleft" 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 79eed52fbfaf663ee7969283a1825739e3725689..b01c0edc8bc223777fe750c6fc05790c1566bfe1 100644 --- a/indra/newview/skins/default/xui/en/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml @@ -191,7 +191,6 @@ </check_box> <button follows="top|right" - font="SansSerifSmall" height="22" label="Bake Terrain" label_selected="Bake Terrain" @@ -206,7 +205,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Revert Terrain" label_selected="Revert Terrain" @@ -220,7 +218,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Swap Terrain" label_selected="Swap Terrain" @@ -419,7 +416,6 @@ <button follows="top|right" - font="SansSerifSmall" height="22" label="Refresh" label_selected="Refresh" @@ -434,7 +430,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Apply" label_selected="Apply" @@ -449,7 +444,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Select Region" label_selected="Select Region" @@ -464,7 +458,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Autosave now" label_selected="Autosave now" @@ -556,7 +549,6 @@ </check_box> <button follows="top|right" - font="SansSerifSmall" height="22" label="Apply" label_selected="Apply" @@ -571,7 +563,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Set Target" label_selected="Set Target" @@ -598,7 +589,6 @@ </text> <button follows="top|right" - font="SansSerifSmall" height="22" label="Delete Target's Scripted Objects On Others Land" label_selected="Delete Target's Scripted Objects On Others Land" @@ -613,7 +603,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Delete Target's Scripted Objects On *Any* Land" label_selected="Delete Target's Scripted Objects On *Any* Land" @@ -628,7 +617,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="22" label="Delete *ALL* Of Target's Objects" label_selected="Delete *ALL* Of Target's Objects" @@ -643,7 +631,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="20" label="Get Top Colliders" label_selected="Get Top Colliders" @@ -658,7 +645,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="20" label="Get Top Scripts" label_selected="Get Top Scripts" @@ -673,7 +659,6 @@ </button> <button follows="top|right" - font="SansSerifSmall" height="20" label="Scripts digest" label_selected="Scripts digest" diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml new file mode 100644 index 0000000000000000000000000000000000000000..cf6a4e45bd10d8ccdd1a55c9862f669ad1549302 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<multi_floater +background_visible="true" +bg_color="yellow" + can_resize="true" + height="390" + layout="topleft" + name="floater_im_box" + help_topic="floater_im_box" + save_rect="true" + save_visibility="true" + single_instance="true" + title="Instant Messages" + width="392"> + <tab_container + follows="left|right|top|bottom" + height="390" + layout="topleft" + left="1" + name="im_box_tab_container" + tab_position="bottom" + tab_width="80" + top="0" + width="390" /> + <icon + color="DefaultShadowLight" + enabled="false" + follows="left|right|bottom" + height="17" + image_name="tabarea.tga" + layout="bottomleft" + left="1" + name="im_box_tab_container_icon" + bottom="10" + width="390" /> +</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 452d28d4eab6004fc0fa66918cfe3676dbf56fa3..645c2973d887c17baa269fd1ec99d86aaa8d8ddb 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -2,75 +2,79 @@ <floater legacy_header_height="18" background_visible="true" - follows="left|top|right|bottom" - height="369" + follows="all" + height="350" layout="topleft" left="0" name="panel_im" - help_topic="panel_im" top="0" - can_dock="true" - can_minimize="true" - visible="true" - width="520" + can_close="true" + can_dock="false" + can_minimize="false" + visible="true" + width="300" can_resize="true" - min_width="350" - min_height="369"> - <layout_stack follows="left|top|right|bottom" - height="354" - width="520" - layout="topleft" - orientation="horizontal" - name="im_panels" - top="16" - left="2"> + min_width="300" + min_height="350"> + <layout_stack + follows="all" + height="320" + width="300" + layout="topleft" + orientation="horizontal" + name="im_panels" + top="20" + left="0"> <layout_panel name="panel_im_control_panel" layout="topleft" - top_delta="-3" - height="354" follows="left" label="IM Control Panel" auto_resize="false" user_resize="false" /> - <layout_panel height="354" - width="355" - left_delta="146" - top="0" - user_resize="false"> - <button height="12" - follows="left|top" - top="8" - label="<<" - layout="topleft" - width="35" - name="slide_left_btn" /> - <button height="12" - follows="left|top" - top="8" - label=">>" - layout="topleft" - width="35" - name="slide_right_btn" /> - <chat_history - length="1" - follows="left|top|right|bottom" - font="SansSerif" - height="300" - layout="topleft" - name="chat_history" - parse_highlights="true" - allow_html="true" - width="350"> - </chat_history> - <line_editor - follows="left|right" - height="20" - label="To" - layout="topleft" - name="chat_editor" - width="345"> - </line_editor> + <layout_panel + left="0" + top="0" + height="200" + width="185" + user_resize="false"> + <button + height="20" + follows="left|top" + top="0" + left="2" + image_overlay="TabIcon_Open_Off" + layout="topleft" + width="25" + name="slide_left_btn" /> + <button + height="20" + follows="left|top" + top="0" + left="2" + image_overlay="TabIcon_Close_Off" + width="25" + name="slide_right_btn" /> + <chat_history + font="SansSerifSmall" + follows="left|right|top|bottom" + height="150" + name="chat_history" + parse_highlights="true" + allow_html="true" + left="1" + width="180"> + </chat_history> + <line_editor + bottom="0" + follows="left|right|bottom" + font="SansSerifSmall" + height="20" + label="To" + layout="bottomleft" + name="chat_editor" + width="180"> + </line_editor> </layout_panel> </layout_stack> </floater> 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 2562daf4b3d8f23abe9a80a94e913d37c7285d1e..6f8f2721281f41845a44307a9fdc15686621cc04 100644 --- a/indra/newview/skins/default/xui/en/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml @@ -47,9 +47,11 @@ <text type="string" length="1" - bottom_delta="20" + bottom_delta="30" follows="top|left" - height="15" + height="25" + width="105" + word_wrap="true" layout="topleft" name="preview_label"> Preview image as: @@ -96,7 +98,9 @@ <text type="string" length="1" - bottom="190" + bottom="225" + height="45" + word_wrap="true" follows="top|left" layout="topleft" left="10" @@ -114,7 +118,7 @@ Try saving image as 24 bit Targa (.tga). layout="topleft" left_delta="2" name="lossless_check" - top_pad="197" + top_pad="162" width="280" /> <button follows="bottom|right" 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 16873df31014cde3a7c43512d89e3b94d45c3ce4..526fda90d1d2333945bd82640ff0488ccbc57411 100644 --- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml @@ -4,13 +4,17 @@ can_close="false" can_minimize="false" can_tear_off="false" - height="200" + height="125" layout="topleft" name="incoming call" help_topic="incoming_call" title="UNKNOWN PERSON IS CALLING" - width="240"> - <floater.string + width="410"> + <floater.string + name="localchat"> + Nearby Voice Chat + </floater.string> + <floater.string name="anonymous"> anonymous </floater.string> @@ -31,18 +35,26 @@ left_delta="19" top="35" width="36" /> - <text_editor - font="SansSerif" - height="64" - border_visible="false" + <text + font="SansSerifLarge" + height="20" layout="topleft" left="77" - max_length="2147483647" name="caller name" - read_only="true" - top="21" - width="163" + top="27" + width="315" word_wrap="true" /> + <text + font="SansSerif" + height="50" + layout="topleft" + left="77" + name="question" + top="52" + width="315" + word_wrap="true"> + Do you want to leave [CURRENT_CHAT] and join this voice chat? + </text> <button height="24" label="Accept" @@ -57,16 +69,14 @@ label="Reject" label_selected="Reject" layout="topleft" - left_delta="0" name="Reject" - top_pad="12" + left_pad="10" width="100" /> <button height="24" label="Start IM" layout="topleft" - left_delta="0" name="Start IM" - top_pad="12" + left_pad="10" width="100" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index 30639f955f4335ebf95af27eb1ae14efed58858d..dca1692e4a26aa00f60fb2fbd9ad84895d289eb3 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -30,7 +30,7 @@ name="Fetched"> Fetched </floater.string> -<panel + <panel bottom="560" class="panel_main_inventory" filename="panel_main_inventory.xml" @@ -40,6 +40,5 @@ label="Inventory Panel" name="Inventory Panel" top="15" - width="467"> -</panel> + width="467" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index 4ca6002c13e98af4cf39a6bfa6e342ad904615cc..366098013b5b13a758d47c305b1637fef077ea78 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -106,12 +106,11 @@ left_delta="78" name="LabelCreatorName" top_delta="0" - width="200"> + width="170"> Nicole Linden </text> <button follows="top|right" - font="SansSerifSmall" height="16" label="Profile..." layout="topleft" @@ -140,12 +139,11 @@ left_delta="78" name="LabelOwnerName" top_delta="0" - width="200"> + width="170"> Thrax Linden </text> <button follows="top|right" - font="SansSerifSmall" height="16" label="Profile..." layout="topleft" @@ -257,12 +255,13 @@ type="string" length="1" follows="left|top" - height="10" + height="25" layout="topleft" left="10" name="NextOwnerLabel" top_pad="5" - width="78"> + width="78" + word_wrap="true"> Next owner: </text> <check_box @@ -303,7 +302,7 @@ layout="topleft" follows="left|top" name="combobox sale copy" - width="90"> + width="110"> <combo_box.item label="Copy" name="Copy" @@ -319,14 +318,26 @@ increment="1" control_name="Edit Cost" name="Edit Cost" - label="Price: L$" - label_width="60" + label="Price:" + label_width="100" left="10" - width="180" + width="192" min_val="1" height="19" max_val="999999999" top_pad="5"/> + <text + type="string" + length="1" + height="15" + follows="left|top" + layout="topleft" + left_delta="82" + name="CurrencySymbol" + top_delta="1" + width="18"> + L$ + </text> <!--line_editor border_style="line" 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 2c04a946131d1427ff80089b8d8dee86091db739..e3751f2bd992340d576264a9c2abac859e895efe 100644 --- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml @@ -42,7 +42,7 @@ </scroll_list> <button height="23" - font="SansSerifBold" + font="SansSerif" label="Teleport" label_selected="Teleport" layout="topleft" @@ -53,7 +53,7 @@ width="80" /> <button height="23" - font="SansSerifBold" + font="SansSerif" label="Map" label_selected="Map" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml index 68dd2001afb9809ab62fd563e4fff33e331d1325..8122386fae35c3fb7c31072949454e9b43b5a779 100644 --- a/indra/newview/skins/default/xui/en/floater_media_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - bottom="-666" + bottom="666" can_close="true" can_drag_on_left="false" can_minimize="true" @@ -12,14 +12,14 @@ width="365" height="535" left="330" - min_height="430" - min_width="620" + min_height="535" + min_width="365" mouse_opaque="true" - name="Media Settings" + name="media_settings" help_topic = "media_settings" title="MEDIA SETTINGS"> <button - bottom="-525" + bottom="525" enabled="true" follows="right|bottom" font="SansSerif" @@ -61,7 +61,7 @@ scale_image="true" width="90" /> <tab_container - bottom="-500" + bottom="500" enabled="true" follows="left|top|right|bottom" height="485" diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml index 5a8ffcebea5b1c238710f4f208c580e8ce65ee07..cff0c29dfc3a08ccb191125e004c794657847010 100644 --- a/indra/newview/skins/default/xui/en/floater_moveview.xml +++ b/indra/newview/skins/default/xui/en/floater_moveview.xml @@ -151,8 +151,7 @@ top="2" width="31" /> <button - follows="left|bottom" - font="SansSerifSmall" + follows="left|bottom" height="23" image_overlay="Move_Run_Off" image_selected="PushButton_Selected_Press" 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 7f58ea132ea907935c75c33d0d641582287bd03f..d8534bfe0ba02716e4975284357f1ee66f7f1aa6 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -1,17 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater legacy_header_height="18" - can_minimize="true" + can_minimize="false" can_tear_off="false" - can_resize="false" + can_resize="true" can_drag_on_left="false" - can_close="false" + can_close="true" can_dock="true" bevel_style="in" height="300" layout="topleft" name="nearby_chat" - help_topic="nearby_chat" save_rect="true" title="NEARBY CHAT" save_dock_state="true" @@ -19,19 +18,17 @@ single_instance="true" width="320"> <chat_history - allow_html="true" + allow_html="true" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor" follows="all" - left="1" + left="1" top="20" - font="SansSerif" layout="topleft" - height="280" + height="280" name="chat_history" - parse_highlights="true" + parse_highlights="true" text_color="ChatHistoryTextColor" text_readonly_color="ChatHistoryTextColor" - width="320"/> - + width="320" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml index 3fd118df1c3b6e74b6b45e37f635a637a5f93579..41a440aaa0bd01917d23468024585efbbc4bb610 100644 --- a/indra/newview/skins/default/xui/en/floater_openobject.xml +++ b/indra/newview/skins/default/xui/en/floater_openobject.xml @@ -38,7 +38,6 @@ width="284" /> <button follows="bottom|left" - font="SansSerifSmall" height="23" label="Copy To Inventory" label_selected="Copy To Inventory" @@ -53,7 +52,6 @@ </button> <button follows="bottom|left" - font="SansSerifSmall" height="23" label="Copy And Wear" label_selected="Copy And Wear" diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml new file mode 100644 index 0000000000000000000000000000000000000000..ae4d5042efc07178bb5759b1fbc690462680c588 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_close="false" + can_minimize="false" + can_tear_off="false" + height="125" + layout="topleft" + name="outgoing call" + help_topic="outgoing_call" + title="CALLING" + width="410"> + <floater.string + name="localchat"> + Nearby Voice Chat + </floater.string> + <floater.string + name="anonymous"> + anonymous + </floater.string> + <floater.string + name="VoiceInviteP2P"> + is calling. + </floater.string> + <floater.string + name="VoiceInviteAdHoc"> + has joined a Voice Chat call with a conference chat. + </floater.string> + <avatar_icon + enabled="false" + follows="left|top" + height="36" + image_name="icon_avatar_online.tga" + layout="topleft" + left_delta="19" + top="35" + width="36" /> + <text + font="SansSerifLarge" + height="20" + layout="topleft" + left="77" + name="connecting" + top="27" + visible="false" + width="315" + word_wrap="true"> +Connecting to [CALLEE_NAME] + </text> + <text + font="SansSerifLarge" + height="20" + layout="topleft" + left="77" + name="calling" + top="27" + width="315" + word_wrap="true"> +Calling [CALLEE_NAME] + </text> + <text + font="SansSerifLarge" + height="20" + layout="topleft" + left="77" + name="noanswer" + top="27" + width="315" + word_wrap="true"> +No Answer. Please try again later. + </text> + <text + font="SansSerif" + height="50" + layout="topleft" + left="77" + name="leaving" + top="52" + width="315" + word_wrap="true"> +Leaving [CURRENT_CHAT]. + </text> + <button + height="24" + label="Cancel" + label_selected="Cancel" + left="70" + layout="topleft" + name="Cancel" + left_pad="10" + width="100" /> +</floater> 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 6faab84159d3d520ae73dd60cb3afba814c6a4f0..4909b8988f995d2aac00bc96e84f1f5af71c2098 100644 --- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml @@ -22,10 +22,10 @@ height="16" label="Share with group" layout="topleft" - left_delta="-250" + left="10" name="share_with_group" - top_delta="2" - width="106" /> + top="5" + width="150" /> <check_box control_name="EveryoneCopy" height="16" @@ -33,8 +33,8 @@ layout="topleft" left_delta="0" name="everyone_copy" - top_pad="16" - width="130" /> + top_pad="5" + width="150" /> <text type="string" length="1" @@ -43,8 +43,8 @@ layout="topleft" left_delta="0" name="NextOwnerLabel" - top_pad="16" - width="88"> + top_pad="5" + width="150"> Next owner can: </text> <check_box @@ -54,17 +54,17 @@ layout="topleft" left_delta="0" name="next_owner_modify" - top_pad="14" - width="78" /> + top_pad="5" + width="150" /> <check_box control_name="NextOwnerCopy" height="16" label="Copy" layout="topleft" - left_delta="78" + left_delta="0" name="next_owner_copy" - top_delta="0" - width="88" > + top_pad="5" + width="150" > <check_box.commit_callback function="Perms.Copy" /> </check_box> @@ -76,10 +76,10 @@ initial_value="true" label="Resell/Give away" layout="topleft" - left_delta="88" + left_delta="0" name="next_owner_transfer" - top_delta="0" - width="106" /> + top_pad="5" + width="150" /> </panel> <button height="20" diff --git a/indra/newview/skins/default/xui/en/floater_preview_animation.xml b/indra/newview/skins/default/xui/en/floater_preview_animation.xml index 3b843584845237deb79394191a5da4cf57fe3221..bbfb3623376553d3e13dd787cf141640fe60e765 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_animation.xml @@ -38,7 +38,6 @@ width="170" /> <button height="20" - font="SansSerifSmall" label="Play in World" label_selected="Stop" layout="topleft" @@ -49,7 +48,6 @@ width="125" /> <button height="20" - font="SansSerifSmall" label="Play Locally" label_selected="Stop" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_preview_sound.xml b/indra/newview/skins/default/xui/en/floater_preview_sound.xml index 95347f0dff60a92c90d6286102d87785daa63788..68a78d50170328b293869b69db08986c0513ee9f 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_sound.xml @@ -50,7 +50,6 @@ <button follows="left|top" height="22" - font="SansSerifSmall" label="Play Locally" label_selected="Play Locally" layout="topleft" 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 9bb30f8e86daeb121c8041c5318eaf829d604d3b..262bcd07a0fee609d28f590b2ec5af1aae775b9c 100644 --- a/indra/newview/skins/default/xui/en/floater_region_info.xml +++ b/indra/newview/skins/default/xui/en/floater_region_info.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - height="512" + height="555" help_topic="regioninfo" layout="topleft" name="regioninfo" @@ -9,7 +9,7 @@ title="REGION/ESTATE" width="480"> <tab_container - bottom="512" + bottom="555" follows="left|right|top|bottom" layout="topleft" left="1" 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 696233676cd19dd4343b77d76f32fb9014b4f4c9..91ca3ef27ad0e5edd4f26591b3484f11517d8c0d 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -18,7 +18,7 @@ height="150" layout="topleft" left="60" - name="" + name="screenshot" top="15" width="220" /> <check_box diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..f44ba6d873e8a9b8511e6f4c6d8c32fcc011cfe4 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_script.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + background_visible="true" + follows="left|top|right|bottom" + height="369" + layout="topleft" + left="0" + name="script_floater" + help_topic="script_floater" + top="0" + can_dock="true" + can_minimize="true" + visible="true" + width="520" + can_resize="true" + min_width="350" + min_height="369"> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index edc1fb88385a69452c950457361d6453185f4771..d9498586af9d0459e0581009d30df9669e5bae28 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_resize="true" - height="400" + height="512" layout="topleft" min_height="140" min_width="467" @@ -25,7 +25,7 @@ Done </floater.string> <layout_stack - bottom="400" + bottom="512" follows="left|right|top|bottom" layout="topleft" left="10" @@ -54,7 +54,7 @@ layout="topleft" left_delta="0" name="status_text" - top_pad="4" + top_pad="5" width="150" /> </layout_panel> </layout_stack> 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 2cf800fb155da7c34934169ca81c277e5396fa46..e6a78563f39a43d78f969e0f523a728e2245054e 100644 --- a/indra/newview/skins/default/xui/en/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml @@ -205,7 +205,6 @@ width="130" /> <button height="20" - font="SansSerifSmall" label="Select" layout="topleft" left_pad="5" @@ -267,7 +266,6 @@ </radio_group> <button height="20" - font="SansSerifSmall" label="Show Objects" layout="topleft" name="show_objects" @@ -290,7 +288,6 @@ <button follows="bottom|left" height="20" - font="SansSerifSmall" label="Set Land For Sale" layout="topleft" left_delta="0" @@ -300,7 +297,6 @@ <button follows="bottom|right" height="20" - font="SansSerifSmall" label="Cancel" layout="topleft" left_pad="30" diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 95a40e27f75bcf75ba3f8e9c20eea0107e18e77a..8860ac1e5004c8a50e5901c1e1c1987611ff7aa0 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -120,7 +120,6 @@ width="85" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="More >>" layout="topleft" @@ -131,7 +130,6 @@ width="80" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="<< Less" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index 68a4867167ff1d7bea764ad41d99addf5ecc8938..f9dacf02077a9f390aa900e5394abc57831c1de8 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -405,179 +405,179 @@ show_bar="false" show_mean="false" > </stat_bar> + </stat_view> - <stat_bar - name="simagentups" - label="Agent Updates/Sec" - stat="simagentups" - precision="1" - bar_min="0.f" - bar_max="100.f" - tick_spacing="25.f" - label_spacing="50.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simagentups" + label="Agent Updates/Sec" + stat="simagentups" + precision="1" + bar_min="0.f" + bar_max="100.f" + tick_spacing="25.f" + label_spacing="50.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simmainagents" - label="Main Agents" - stat="simmainagents" - precision="0" - bar_min="0.f" - bar_max="80.f" - tick_spacing="10.f" - label_spacing="40.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simmainagents" + label="Main Agents" + stat="simmainagents" + precision="0" + bar_min="0.f" + bar_max="80.f" + tick_spacing="10.f" + label_spacing="40.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simchildagents" - label="Child Agents" - stat="simchildagents" - precision="0" - bar_min="0.f" - bar_max="40.f" - tick_spacing="5.f" - label_spacing="10.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simchildagents" + label="Child Agents" + stat="simchildagents" + precision="0" + bar_min="0.f" + bar_max="40.f" + tick_spacing="5.f" + label_spacing="10.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simobjects" - label="Objects" - stat="simobjects" - precision="0" - bar_min="0.f" - bar_max="30000.f" - tick_spacing="5000.f" - label_spacing="10000.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simobjects" + label="Objects" + stat="simobjects" + precision="0" + bar_min="0.f" + bar_max="30000.f" + tick_spacing="5000.f" + label_spacing="10000.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simactiveobjects" - label="Active Objects" - stat="simactiveobjects" - precision="0" - bar_min="0.f" - bar_max="800.f" - tick_spacing="100.f" - label_spacing="200.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simactiveobjects" + label="Active Objects" + stat="simactiveobjects" + precision="0" + bar_min="0.f" + bar_max="800.f" + tick_spacing="100.f" + label_spacing="200.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simactivescripts" - label="Active Scripts" - stat="simactivescripts" - precision="0" - bar_min="0.f" - bar_max="800.f" - tick_spacing="100.f" - label_spacing="200.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simactivescripts" + label="Active Scripts" + stat="simactivescripts" + precision="0" + bar_min="0.f" + bar_max="800.f" + tick_spacing="100.f" + label_spacing="200.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simscripteps" - label="Script Events" - stat="simscripteps" - unit_label="eps" - precision="0" - bar_min="0.f" - bar_max="20000.f" - tick_spacing="2500.f" - label_spacing="5000.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simscripteps" + label="Script Events" + stat="simscripteps" + unit_label="eps" + precision="0" + bar_min="0.f" + bar_max="20000.f" + tick_spacing="2500.f" + label_spacing="5000.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="siminpps" - label="Packets In" - stat="siminpps" - unit_label="pps" - precision="0" - bar_min="0.f" - bar_max="2000.f" - tick_spacing="250.f" - label_spacing="1000.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="siminpps" + label="Packets In" + stat="siminpps" + unit_label="pps" + precision="0" + bar_min="0.f" + bar_max="2000.f" + tick_spacing="250.f" + label_spacing="1000.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simoutpps" - label="Packets Out" - stat="simoutpps" - unit_label="pps" - precision="0" - bar_min="0.f" - bar_max="2000.f" - tick_spacing="250.f" - label_spacing="1000.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simoutpps" + label="Packets Out" + stat="simoutpps" + unit_label="pps" + precision="0" + bar_min="0.f" + bar_max="2000.f" + tick_spacing="250.f" + label_spacing="1000.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simpendingdownloads" - label="Pending Downloads" - stat="simpendingdownloads" - precision="0" - bar_min="0.f" - bar_max="800.f" - tick_spacing="100.f" - label_spacing="200.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simpendingdownloads" + label="Pending Downloads" + stat="simpendingdownloads" + precision="0" + bar_min="0.f" + bar_max="800.f" + tick_spacing="100.f" + label_spacing="200.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simpendinguploads" - label="Pending Uploads" - stat="simpendinguploads" - precision="0" - bar_min="0.f" - bar_max="100.f" - tick_spacing="25.f" - label_spacing="50.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> + <stat_bar + name="simpendinguploads" + label="Pending Uploads" + stat="simpendinguploads" + precision="0" + bar_min="0.f" + bar_max="100.f" + tick_spacing="25.f" + label_spacing="50.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> - <stat_bar - name="simtotalunackedbytes" - label="Total Unacked Bytes" - stat="simtotalunackedbytes" - unit_label="kb" - precision="0" - bar_min="0.f" - bar_max="100000.f" - tick_spacing="25000.f" - label_spacing="50000.f" - show_per_sec="false" - show_bar="false" - show_mean="false" > - </stat_bar> - </stat_view> + <stat_bar + name="simtotalunackedbytes" + label="Total Unacked Bytes" + stat="simtotalunackedbytes" + unit_label="kb" + precision="0" + bar_min="0.f" + bar_max="100000.f" + tick_spacing="25000.f" + label_spacing="50000.f" + show_per_sec="false" + show_bar="false" + show_mean="false" > + </stat_bar> <stat_view name="simperf" diff --git a/indra/newview/skins/default/xui/en/floater_sys_well.xml b/indra/newview/skins/default/xui/en/floater_sys_well.xml index e1f07a49e78604691e765280b13e720a995145be..be6d63716c521f9dad6025576fc996b15bb5c197 100644 --- a/indra/newview/skins/default/xui/en/floater_sys_well.xml +++ b/indra/newview/skins/default/xui/en/floater_sys_well.xml @@ -15,7 +15,7 @@ height="23" can_minimize="true" can_tear_off="false" - can_resize="false" + can_resize="true" can_drag_on_left="false" can_close="false" can_dock="true" diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml index cc0ab8c57e8fd2b7552293844daee58982f51b01..374f01490818b62dc0acbf1079911b2d77b23d9a 100644 --- a/indra/newview/skins/default/xui/en/floater_telehub.xml +++ b/indra/newview/skins/default/xui/en/floater_telehub.xml @@ -57,7 +57,6 @@ </text> <button follows="top|left" - font="SansSerifSmall" height="20" label="Connect Telehub" layout="topleft" @@ -67,7 +66,6 @@ width="110" /> <button follows="top|left" - font="SansSerifSmall" height="20" label="Disconnect" layout="topleft" @@ -97,7 +95,6 @@ width="230" /> <button follows="top|left" - font="SansSerifSmall" height="20" label="Add Spawn" layout="topleft" @@ -107,7 +104,6 @@ width="110" /> <button follows="top|left" - font="SansSerifSmall" height="20" label="Remove Spawn" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_test_button.xml b/indra/newview/skins/default/xui/en/floater_test_button.xml index 2bd0d1a0fabf9a6e7a22f4ff06b3cf6e0c4820cd..8c6ad5c0f7fa0464bab08f94d9c7217c807033e1 100644 --- a/indra/newview/skins/default/xui/en/floater_test_button.xml +++ b/indra/newview/skins/default/xui/en/floater_test_button.xml @@ -23,7 +23,6 @@ name="bottom_delta_button" /> <button bottom_delta="30" - font="SansSerifSmall" height="23" label="SansSerifSmall" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml index e017d404c61a1b62f2bff133c1c3c1de4b3e9dd2..0531b52e5a04f77205acd9c259861642431a5aa0 100644 --- a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml @@ -18,7 +18,18 @@ Enabled line editor </line_editor> <line_editor - enabled="false" + height="20" + layout="topleft" + left_delta="0" + name="ascii_line_editor" + prevalidate_callback="ascii" + tool_tip="ascii line editor" + top_pad="10" + width="200"> + ASCII only line editor + </line_editor> + <line_editor + enabled="false" height="20" layout="topleft" left_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml index 57d8e686ce3d5235a2a9003a90d6d00b86c8071a..85d8bb2bb1bb6d0db2c6e5c7452669440ba3500a 100644 --- a/indra/newview/skins/default/xui/en/floater_test_slider.xml +++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_resize="true" - height="400" + height="500" layout="topleft" name="floater_test_slider" help_topic="floater_test_slider" @@ -57,6 +57,13 @@ width="200" /> <slider_bar bottom="320" + height="100" + left="20" + name="slider_bar_vertical" + orientation="vertical" + width="20" /> + <slider_bar + bottom="300" height="20" increment="1" initial_value="2.0" @@ -64,6 +71,7 @@ layout="topleft" max_val="5" min_val="1" + left_pad="20" name="slider_bar" width="300" /> <slider @@ -76,4 +84,17 @@ name="red_slider" text_color="red" text_width="40" /> + <slider + width ="140" + bottom="490" + decimal_digits="1" + height="100" + left="20" + label="Red Slider Vertical" + label_width="100" + layout="topleft" + name="red_slider_vertical" + text_color="red" + orientation="vertical" + text_width="20" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index 8dba05f1eebbcabba773fe17af5d58339af5e16c..3aeb7c93e7f7db08474263c07dbc46ab6438f9f6 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -10,83 +10,64 @@ <text type="string" length="1" - height="10" - layout="topleft" - left="10" - top="30" - width="300"> - Bottom and left specified - </text> - <text - type="string" - length="1" - height="10" - layout="topleft" - left_delta="200" - top_delta="0" - width="300"> - Bottom delta left delta - </text> - <text - type="string" - length="1" - height="10" + height="90" layout="topleft" left="10" - top="50" - width="300"> - Bottom delta -20 - </text> - <text - type="string" - length="1" - height="10" - layout="topleft" - left_delta="0" top_pad="30" width="300"> First line of multiple lines - Second line of multiple lines +Second line of multiple lines +Third line of multiple lines +Fourth line of multiple lines +Fifth line of multiple lines </text> <text top_pad="10" left="10" - right="-10" + right="-10" + height="20" follows="top|left" font.name="SansSerifSmall" name="test_text10" tool_tip="text"> - SansSerifSmall. РуÑÑкий 䏿–‡ (简体) The quick brown fox jumped over the lazy dog. + SansSerifSmall +The åŽæ–‡ç»†é»‘ brown fox ヒラã‚jumped over the lazy dog. </text> <text top_pad="10" left="10" - right="-10" + right="-10" + height="25" follows="top|left" - font.name="SansSerif" + font.name="SansSerifMedium" name="test_text11" tool_tip="text"> - SansSerif. РуÑÑкий 䏿–‡ (简体) The quick brown fox jumped over the lazy dog. + SansSerif +The åŽæ–‡ç»†é»‘ brown fox ヒラã‚jumped over the lazy dog. </text> <text top_pad="10" left="10" - right="-10" + right="-10" follows="top|left" + height="26" font.name="SansSerifLarge" name="test_text12" tool_tip="text"> - SansSerifLarge. РуÑÑкий 䏿–‡ (简体) The quick brown fox jumped over the lazy dog. + SansSerifLarge +The åŽæ–‡ç»†é»‘ brown fox ヒラã‚jumped over the lazy dog. </text> <text top_pad="10" left="10" - right="-10" + height="35" + right="-10" follows="top|left" font.name="SansSerifHuge" name="test_text13" tool_tip="text"> - SansSerifHuge. РуÑÑкий 䏿–‡ (简体) The quick brown fox jumped over the lazy dog. + SansSerifHuge +The åŽæ–‡ç»†é»‘ brown fox ヒラã‚jumped over the lazy dog. </text> <text type="string" @@ -112,27 +93,6 @@ width="300"> SansSerif BOLD UNDERLINE </text> - <text - type="string" - length="1" - font="SansSerif" - height="10" - layout="topleft" - left_delta="0" - top_pad="10" - width="300"> - SansSerif UNDERLINE - </text> - <text - type="string" - length="1" - height="10" - layout="topleft" - left_delta="0" - top_pad="10" - width="300"> - Escaped greater than > - </text> <text type="string" length="1" @@ -142,8 +102,7 @@ left="10" name="right_aligned_text" width="380" - halign="right" - text_color="1 1 1 0.7" + halign="right" top_pad="10"> Right aligned text </text> @@ -157,21 +116,19 @@ name="centered_text" width="380" halign="center" - text_color="1 1 1 0.7" top_pad="10"> Centered text </text> <text type="string" length="1" - height="60" + height="60" label="N" layout="topleft" left="10" name="left_aligned_text" width="380" halign="left" - text_color="1 1 1 0.7" top_pad="10"> Left aligned text </text> @@ -184,7 +141,6 @@ left="10" name="floater_map_north" right="30" - text_color="1 1 1 0.7" top="370"> N </text> 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 44dcb075264d257ae1ce281c51e3bcbfecbd16f8..a2055d8c52f797103ed32035ea698a9906488b38 100644 --- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml +++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml @@ -380,6 +380,16 @@ line to actually fit tool_tip="Color Swatch: Click to open Color Picker" top_delta="0" width="80" /> + <text + top_pad="10" + left="10" + width="250" + follows="top|left" + font.name="Monospace" + name="test_text10" + tool_tip="text"> + Monospace Button Flyout Checkbox + </text> <text top_pad="10" left="10" diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index 4679ae467df3746ace6bd8ee6efdad3f7c7aa187..113da9ea4db2725c9b386470bdb5f16168a555a8 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -49,7 +49,6 @@ <button enabled="false" follows="left|bottom" - font="SansSerifSmall" height="20" label="Default" label_selected="Default" @@ -61,7 +60,6 @@ <button enabled="false" follows="left|bottom" - font="SansSerifSmall" height="20" label="None" label_selected="None" @@ -72,7 +70,6 @@ width="80" /> <button follows="left|bottom" - font="SansSerifSmall" height="20" label="Blank" label_selected="Blank" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index c33d7cf31d8e0c263af15d0687789ea5644c66f8..636e9d465ac981df519bf2cd0ac964e9a8078f66 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -262,6 +262,19 @@ <check_box.commit_callback function="BuildTool.selectComponent"/> </check_box> + + <text + text_color="LtGray_50" + follows="top|left" + halign="left" + left="13" + name="RenderingCost" + tool_tip="Shows the rendering cost calculated for this object" + top_pad="9" + type="string" + width="100"> + þ: [COUNT] + </text> <check_box control_name="ScaleUniform" height="19" @@ -294,6 +307,7 @@ layout="topleft" follows="left|top" name="combobox grid mode" + tool_tip="Choose the type of grid ruler for positioning the object" width="108"> <combo_box.item label="World grid" @@ -317,7 +331,7 @@ image_unselected="ForwardArrow_Off" layout="topleft" name="Options..." - tool_tip="Grid options" + tool_tip="See more grid options" top_delta="0" right="-10" width="18" @@ -325,7 +339,7 @@ <button.commit_callback function="BuildTool.gridOptions"/> </button> - <button + <button follows="left|top" height="20" image_disabled="Object_Cube" @@ -687,7 +701,6 @@ </slider_bar> <button follows="left|top" - font="SansSerifSmall" height="19" label="Apply" label_selected="Apply" @@ -701,6 +714,7 @@ function="BuildTool.applyToSelection"/> </button> <text + text_color="LtGray_50" type="string" length="1" height="12" @@ -714,6 +728,7 @@ Objects: [COUNT] </text> <text + text_color="LtGray_50" type="string" length="1" follows="left|top" @@ -730,7 +745,7 @@ halign="center" left="0" name="Object Info Tabs" - tab_max_width="55" + tab_max_width="54" tab_min_width="40" tab_position="top" tab_height="25" @@ -772,7 +787,7 @@ </panel.string> <panel.string name="text modify warning"> - This object has linked parts + You must select entire object to set permissions </panel.string> <panel.string name="Cost Default"> @@ -795,11 +810,8 @@ Mixed Sale </panel.string> <text - type="string" - length="1" follows="left|top" height="10" - layout="topleft" left="10" name="Name:" top="0" @@ -809,7 +821,6 @@ <line_editor follows="left|top|right" height="19" - layout="topleft" left_pad="0" max_length="63" name="Object Name" @@ -817,11 +828,8 @@ top_delta="0" width="170" /> <text - type="string" - length="1" follows="left|top" height="10" - layout="topleft" left="10" name="Description:" top_pad="3" @@ -831,7 +839,6 @@ <line_editor follows="left|top|right" height="19" - layout="topleft" left_pad="0" max_length="127" name="Object Description" @@ -919,7 +926,6 @@ width="150" /> <button follows="top|left" - font="SansSerifSmall" height="20" label="Deed" label_selected="Deed" @@ -960,23 +966,27 @@ <combo_box.item label="Touch (default)" name="Touch/grab(default)" - value="Touch/grab (default)" /> + value="Touch" /> <combo_box.item label="Sit on object" name="Sitonobject" - value="Sit on object" /> + value="Sit" /> <combo_box.item label="Buy object" name="Buyobject" - value="Buy object" /> + value="Buy" /> <combo_box.item label="Pay object" name="Payobject" - value="Pay object" /> + value="Pay" /> <combo_box.item label="Open" name="Open" value="Open" /> + <combo_box.item + label="Zoom" + name="Zoom" + value="Zoom" /> </combo_box> <check_box height="16" @@ -1060,7 +1070,7 @@ even though the user gets a free copy. follows="left|top|right" layout="topleft" name="perm_modify" - width="250"> + width="264"> You can modify this object </text> <text @@ -2594,7 +2604,6 @@ even though the user gets a free copy. width="170" /> <button follows="left|top" - font="SansSerifSmall" height="19" label="Apply" label_selected="Apply" @@ -2730,7 +2739,6 @@ even though the user gets a free copy. decouple_texture_size="true" /> <button follows="left|top" - font="SansSerifSmall" height="19" label="Align" label_selected="Align Media" diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml index 4e2cce1428c392baeb908d6bcca5d8af31bdd722..1adb824e2a6ad6ff4956db4b9167488a13221699 100644 --- a/indra/newview/skins/default/xui/en/floater_tos.xml +++ b/indra/newview/skins/default/xui/en/floater_tos.xml @@ -53,22 +53,6 @@ Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement. </text> - <text_editor - type="string" - length="1" - follows="left|top" - font="SansSerif" - height="283" - layout="topleft" - left_delta="0" - max_length="65536" - name="tos_text" - top_pad="43" - width="568" - handle_edit_keys_directly="true" - word_wrap="true"> - TOS_TEXT - </text_editor> <web_browser follows="left|top" height="340" @@ -76,6 +60,6 @@ you must accept the agreement. 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="-27" + top_delta="0" width="568" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_url_entry.xml b/indra/newview/skins/default/xui/en/floater_url_entry.xml index 1ab42cb14066d9275063717460d33bb00da47b55..29fb29fabf86eec8ab10f42e78608e17f3f2781b 100644 --- a/indra/newview/skins/default/xui/en/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/en/floater_url_entry.xml @@ -32,7 +32,6 @@ <button follows="top|left" height="20" - font="SansSerifSmall" label="OK" layout="topleft" left="10" @@ -42,7 +41,6 @@ <button follows="top|left" height="20" - font="SansSerifSmall" label="Cancel" layout="topleft" left_pad="5" @@ -52,7 +50,6 @@ <button follows="top|right" height="20" - font="SansSerifSmall" label="Clear" layout="topleft" left_pad="65" diff --git a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml index ef68d03a450726c6947697a39782f189486aefd4..4ece0fa3baea64dbab2af17a326c48b17b750c38 100644 --- a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml @@ -17,9 +17,9 @@ tool_tip="Enter a URL or URL pattern to White List" width="350" /> - <button follows="top|left" height="20" font="SansSerifSmall" label="OK" + <button follows="top|left" height="20" label="OK" layout="topleft" left="10" name="ok_btn" bottom_delta="28" width="64" /> - <button follows="top|left" height="20" font="SansSerifSmall" label="Cancel" + <button follows="top|left" height="20" label="Cancel" layout="topleft" left_pad="5" name="cancel_btn" bottom_delta="0" width="64" /> </floater> 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 387ffbd5b30258e812e43a3537ab0cfc3998fd6e..e3db0972ec747c36d404b6ba73627d55f3659634 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -116,7 +116,6 @@ </text> <button follows="top|right" - font="SansSerifSmall" height="16" label="Go Home" label_selected="Go Home" @@ -340,6 +339,8 @@ label="Landmarks" name="item1" value="None" /> + <combo_box.commit_callback + function="WMap.Landmark"/> </combo_box> <icon color="0.5 0 0 1" diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index f3da62a8964198557a5cd0afcc54b7a42c23493b..ebbb53729d2895cfc75a05f5de0fc2a1b6d866cf 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -144,18 +144,18 @@ /> <font_size name="Huge" comment="Size of huge font (points, or 1/72 of an inch)" - size="15.0" + size="16.0" /> <font_size name="Large" comment="Size of large font (points, or 1/72 of an inch)" - size="10.0" + size="10.6" /> <font_size name="Medium" comment="Size of medium font (points, or 1/72 of an inch)" - size="9.0" + size="8.6" /> <font_size name="Small" comment="Size of small font (points, or 1/72 of an inch)" - size="7.8" + size="7.6" /> </fonts> diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 2c1e2b6dc0e3cb601315c21d6baa3f540ce806ff..dd3cf079db8595c3ddae732e673ab4121350e924 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -4,18 +4,18 @@ Single instance - only have one at a time, recycle it each spawn --> <floater - legacy_header_height="18" + legacy_header_height="25" bevel_style="in" - bg_opaque_image="Inspector_Background" + bg_opaque_image="Inspector_Background" can_close="false" can_minimize="false" - height="138" + height="148" layout="topleft" name="inspect_avatar" single_instance="true" sound_flags="0" visible="true" - width="245"> + width="228"> <!-- Allowed fields include: [BORN_ON] ("12/3/2008") [SL_PROFILE] (Second Life profile), @@ -30,7 +30,7 @@ </string> <string name="Details"> -[ACCTTYPE][COMMA] [PAYMENTINFO] +[SL_PROFILE] </string> <string name="Partner"> @@ -38,45 +38,45 @@ </string> <text follows="all" - font="SansSerifLargeBold" - height="18" + font="SansSerifLarge" + height="16" left="8" name="user_name" - top="5" - text_color="white" + top="10" + text_color="White" use_ellipses="true" value="Grumpity ProductEngine" - width="240" - word_wrap="false" /> + width="175" /> <text follows="all" height="16" left="8" - value="Grumpity ProductEngine moose moose" - name="user_details" - top_pad="0" - width="170" - use_ellipses="true" - word_wrap="false" /> - <text - follows="all" - font="SansSerifSmallBold" + name="user_subtitle" + font="SansSerifSmall" text_color="White" - height="18" + value="11 Months, 3 days old" + width="175" + use_ellipses="true" /> + <text + follows="all" + height="25" left="8" - name="user_subtitle" - use_ellipses="true" - top_pad="0" - width="170" /> + name="user_details" + word_wrap="true" + top_pad="6" + width="220">This is my second life description and I really think it is great. + </text> <text follows="all" - height="16" + height="13" left="8" name="user_partner" - top_pad="8" - width="240" + top_pad="3" + width="220" use_ellipses="true" - word_wrap="false" /> + word_wrap="false"> + Erica Linden + </text> <slider follows="top|left" height="23" @@ -89,15 +89,15 @@ tool_tip="Voice volume" top_pad="0" value="0.5" - width="150" /> + width="195" /> <button follows="all" height="16" - image_disabled="Inv_Sound" - image_disabled_selected="Inv_Sound" - image_hover_selected="Inv_Sound" - image_selected="Inv_Sound" - image_unselected="Inv_Sound" + image_disabled="Audio_Off" + image_disabled_selected="AudioMute_Off" + image_hover_selected="AudioMute_Over" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" left_pad="0" top_delta="4" @@ -106,67 +106,60 @@ <avatar_icon follows="all" height="38" - right="-25" + right="-10" bevel_style="in" border_style="line" mouse_opaque="true" name="avatar_icon" - top="24" + top="10" width="38" /> - <button - follows="top|left" - height="18" - image_disabled="ForwardArrow_Disabled" - image_selected="ForwardArrow_Press" - image_unselected="ForwardArrow_Off" - layout="topleft" - name="view_profile_btn" - right="-8" - top="35" - left_delta="110" - tab_stop="false" - width="18" /> <!-- Overlapping buttons for default actions llinspectavatar.cpp makes visible the most likely default action --> <button follows="bottom|left" - height="23" + height="20" label="Add Friend" left="8" - top="246" + top="119" name="add_friend_btn" - width="100" /> + width="90" /> <button follows="bottom|left" - height="23" + height="20" label="IM" left_delta="0" top_delta="0" name="im_btn" - width="100" + width="80" commit_callback.function="InspectAvatar.IM" /> - <menu_button + <button follows="top|left" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="20" + label="More" + layout="topleft" + name="view_profile_btn" + left_delta="96" + top_delta="0" + tab_stop="false" + width="80" /> + <!-- gear buttons here --> + <menu_button + height="20" + layout="topleft" + image_overlay="OptionsMenu_Off" menu_filename="menu_inspect_avatar_gear.xml" name="gear_btn" - right="-10" - top="249" - width="18" /> - <menu_button - visible="false" + right="-5" + top_delta="0" + width="35" /> + <menu_button follows="top|left" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" + height="20" + image_overlay="OptionsMenu_Off" menu_filename="menu_inspect_self_gear.xml" name="gear_self_btn" - right="-10" - top="249" - width="18" /> + right="-5" + top_delta="0" + width="35" /> </floater> diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index e5e5007c5651af7cf5d4d0848b80b5d1d464537c..f48af2f97eb3e43be9c548dc9cb760ac2fe2adf3 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -31,7 +31,7 @@ use_ellipses="true" width="240" word_wrap="false"> - Grumpity's Grumpy Group of Moose + Grumpity's Grumpy Group of Moose </text> <text follows="all" diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml index 1365a0483f6bc3bdc4be3815b730faf7276eeb7b..16f6e49092ecdb98ce2c6cad643b10d6948f1a2e 100644 --- a/indra/newview/skins/default/xui/en/inspect_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_object.xml @@ -4,81 +4,81 @@ Single instance - only have one at a time, recycle it each spawn --> <floater - legacy_header_height="18" + legacy_header_height="25" bevel_style="in" - bg_opaque_image="Inspector_Background" + bg_opaque_image="Inspector_Background" can_close="false" can_minimize="false" - height="145" + height="148" layout="topleft" name="inspect_object" single_instance="true" sound_flags="0" visible="true" - width="300"> + width="228"> <string name="Creator">By [CREATOR]</string> <string name="CreatorAndOwner"> by [CREATOR] owner [OWNER] </string> - <!-- *TODO: Might need to change to [AMOUNT] if icon contains "L$" --> <string name="Price">L$[AMOUNT]</string> <string name="PriceFree">Free!</string> <string name="Touch">Touch</string> <string name="Sit">Sit</string> <text follows="all" - font="SansSerifLargeBold" + font="SansSerifLarge" height="16" left="8" name="object_name" text_color="White" - top="5" + top="10" use_ellipses="true" value="Test Object Name That Is Really Long" - width="291" /> + width="220" /> <text follows="all" - font="SansSerif" - height="30" + height="33" left="8" name="object_creator" top_pad="0" use_ellipses="true" - width="275"> -by Longavatarname Johnsonlongstonnammer -owner James Linden + 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" - left="7" + right="-5" width="16" height="16" - top="52" + top="56" follows="left|top" /> <text follows="all" - font="SansSerifSmallBold" + font="SansSerifSmall" + font.style="BOLD" height="16" - left_pad="5" + halign="right" + left="5" name="price_text" text_color="white" - top="54" + top="58" font_shadow="none" - width="150"> + width="196"> L$300,000 </text> <text follows="all" - height="30" + font="SansSerifSmall" + height="36" left="8" name="object_description" top_pad="0" - width="291" - 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> @@ -86,69 +86,64 @@ This is a really long description for an object being as how it is at least 80 c for sale, "Sit" if can sit, etc. --> <text follows="all" - height="15" + font="SansSerifSmall" + height="13" left_delta="0" name="object_media_url" - top_pad="-5" + top_pad="0" width="291" - max_length = "50" - use_ellipses="true" - word_wrap="true"/> - + max_length = "50" + use_ellipses="true"> + http://www.superdupertest.com +</text> <button follows="top|left" - font="SansSerif" height="20" label="Buy" - left="10" + left="8" name="buy_btn" - top="114" - width="75" /> + top="119" + width="80" /> <button follows="top|left" - font="SansSerif" height="20" label="Pay" left_delta="0" name="pay_btn" top_delta="0" - width="75" /> + width="80" /> <button follows="top|left" - font="SansSerif" - height="23" + height="20" label="Take Copy" left_delta="0" name="take_free_copy_btn" top_delta="0" - width="75" /> + width="80" /> <button follows="top|left" - font="SansSerifSmall" height="20" label="Touch" left_delta="0" name="touch_btn" top_delta="0" - width="75" /> + width="80" /> <button follows="top|left" - font="SansSerif" - height="23" + height="20" label="Sit" left_delta="0" name="sit_btn" top_delta="0" - width="75" /> + width="80" /> <button follows="top|left" - font="SansSerifSmall" height="20" label="Open" left_delta="0" name="open_btn" top_delta="0" - width="75" /> + width="80" /> <icon name="secure_browsing" image_name="Lock" @@ -156,33 +151,28 @@ This is a really long description for an object being as how it is at least 80 c visible="false" width="18" height="18" - top_delta="2" + top_delta="0" tool_tip="Secure Browsing" - follows="left|top"/> - + follows="left|top" /> + <!-- non-overlapping buttons here --> - <menu_button - follows="top|left" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" - menu_filename="menu_inspect_object_gear.xml" - name="gear_btn" - right="-10" - top_delta="5" - width="18" /> - <button + <button follows="top|left" - height="18" - image_disabled="ForwardArrow_Disabled" - image_selected="ForwardArrow_Press" - image_unselected="ForwardArrow_Off" + height="20" + label="More" layout="topleft" name="more_info_btn" - right="-5" - top="20" - left_delta="110" + left_delta="10" + top_delta="0" tab_stop="false" - width="18" /> + width="80" /> + <menu_button + follows="top|left" + height="20" + image_overlay="OptionsMenu_Off" + menu_filename="menu_inspect_object_gear.xml" + name="gear_btn" + right="-5" + top_delta="0" + width="35" /> </floater> diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml new file mode 100644 index 0000000000000000000000000000000000000000..07c684d9047fe0910286c1770f1dd08c7fc4ae79 --- /dev/null +++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml @@ -0,0 +1,99 @@ +<?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 + legacy_header_height="18" + bevel_style="in" + bg_opaque_image="Inspector_Background" + can_close="false" + can_minimize="false" + height="145" + layout="topleft" + name="inspect_remote_object" + single_instance="true" + sound_flags="0" + visible="true" + width="300"> + <text + follows="all" + font="SansSerifLargeBold" + height="16" + left="8" + name="object_name" + text_color="White" + top="5" + use_ellipses="true" + width="290"> + Test Object Name That Is Really Long + </text> + <text + follows="all" + font="SansSerif" + height="20" + left="8" + name="object_owner_label" + width="55" + top_pad="20"> + Owner: + </text> + <text + follows="top|left" + font="SansSerif" + height="20" + left_pad="10" + name="object_owner" + use_ellipses="true" + width="200" + word_wrap="false"> + Longavatarname Johnsonlongstonnammer + </text> + <text + follows="top|left" + font="SansSerif" + height="20" + left="8" + name="object_slurl_label" + top_pad="10" + width="55"> + Location: + </text> + <text + follows="top|left" + height="20" + left_pad="10" + name="object_slurl" + width="240" + use_ellipses="true" + word_wrap="false"> + http://slurl.com/Ahern/50/50/50 + </text> + <button + follows="top|left" + font="SansSerif" + height="20" + label="Map" + left="10" + name="map_btn" + top="114" + width="75" /> + <button + follows="top|left" + font="SansSerif" + height="20" + label="Block" + left_pad="5" + name="block_btn" + top_delta="0" + width="75" /> + <button + follows="top|left" + font="SansSerif" + height="20" + label="Close" + right="-10" + name="close_btn" + top_delta="0" + width="75" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 08f7ee456e4361b269bf0cb965bd6e3ef82ba9b4..3bf7f50a2c2280168ae2ca4b3ab8e80e67ce46db 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -10,24 +10,24 @@ <layout_stack border_size="0" follows="all" mouse_opaque="false" - height="772" + height="768" name="menu_stack" orientation="vertical" top="0"> <layout_panel auto_resize="false" - min_height="19" + height="84" mouse_opaque="false" - name="status_bar_container" - height="19" + name="nav_and_status_bar_region" width="1024" - visible="false"/> - <layout_panel auto_resize="false" - height="65" - mouse_opaque="false" - name="nav_bar_container" - width="1024" - visible="false"/> - <panel auto_resize="true" + visible="false"> + <panel follows="left|right|bottom" + left="0" + name="nav_bar_container" + right="1024" + top="19" + height="65"/> + </layout_panel> + <layout_panel auto_resize="true" follows="all" height="500" layout="topleft" @@ -51,6 +51,13 @@ name="main_view" user_resize="true" width="500"> + <view bottom="500" + follows="all" + height="500" + left="0" + mouse_opaque="false" + name="world_view_rect" + width="500"/> <layout_stack border_size="0" bottom="500" follows="all" @@ -66,13 +73,6 @@ mouse_opaque="false" name="hud container" width="500"> - <view bottom="500" - follows="all" - height="500" - left="0" - mouse_opaque="false" - name="world_view_rect" - width="500"/> <panel follows="right|top|bottom" height="500" mouse_opaque="false" @@ -124,8 +124,16 @@ height="500" name="DebugView" width="1024"/> - </panel> + </layout_panel> </layout_stack> + <panel mouse_opaque="false" + follows="left|right|top" + name="status_bar_container" + height="19" + left="0" + top="0" + width="1024" + visible="false"/> <notify_box_view top="0" follows="all" height="768" diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..4642e82c0b20bf29e51c4f258e87d218c02ce3cf --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + layout="topleft" + mouse_opaque="false" + name="menu_gesture_gear" + visible="false"> + <menu_item_call + font="SansSerifBold" + label="Add/Remove from Favorites" + layout="topleft" + name="activate"> + <on_click + function="Gesture.Action.ToogleActiveState" /> + </menu_item_call> + <menu_item_call + label="Copy" + layout="topleft" + name="copy_gesture"> + <on_click + function="Gesture.Action.CopyPast" + parameter="copy_gesture" /> + <on_enable + function="Gesture.EnableAction" + parameter="copy_gesture" /> + </menu_item_call> + <menu_item_call + label="Paste" + layout="topleft" + name="paste"> + <on_click + function="Gesture.Action.CopyPast" + parameter="paste" /> + <on_enable + function="Gesture.EnableAction" + parameter="paste" /> + </menu_item_call> + <menu_item_call + label="Copy UUID" + layout="topleft" + name="copy_uuid"> + <on_click + function="Gesture.Action.CopyPast" + parameter="copy_uuid" /> + <on_enable + function="Gesture.EnableAction" + parameter="copy_uuid" /> + </menu_item_call> + <menu_item_call + label="Save to current outfit" + layout="topleft" + name="save_to_outfit"> + <on_click + function="Gesture.Action.SaveToCOF" /> + </menu_item_call> + <menu_item_call + label="Edit" + layout="topleft" + name="edit_gesture"> + <on_click + function="Gesture.Action.ShowPreview" /> + <on_enable + function="Gesture.EnableAction" + parameter="edit_gesture" /> + </menu_item_call> + <menu_item_call + label="Inspect" + layout="topleft" + name="inspect"> + <on_click + function="Gesture.Action.ShowPreview" /> + <on_enable + function="Gesture.EnableAction" + parameter="inspect" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml index 542e319792bfc6343058eab790aa7f2029138ae0..8cbe62cfb01b8cbd83e490f0f726525cca7031ac 100644 --- a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml +++ b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml @@ -9,7 +9,15 @@ visible="false" width="128"> <menu_item_call - label="Chat..." + label="Group Info" + layout="topleft" + name="Show Profile"> + <menu_item_call.on_click + function="IMChicletMenu.Action" + parameter="info" /> + </menu_item_call> + <menu_item_call + label="Show Session" layout="topleft" name="Chat"> <menu_item_call.on_click @@ -17,11 +25,11 @@ parameter="group chat" /> </menu_item_call> <menu_item_call - label="Info..." + label="End Session" layout="topleft" - name="Show Profile"> + name="End Session"> <menu_item_call.on_click function="IMChicletMenu.Action" - parameter="info" /> + parameter="end" /> </menu_item_call> </menu> diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml index c205868429e3719e6db7c829a40d499c20805857..6891aaca32a981c41b1088af47ad237d3acea1b7 100644 --- a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml @@ -9,7 +9,7 @@ visible="false" width="128"> <menu_item_call - label="Show Profile..." + label="Show Profile" layout="topleft" name="Show Profile"> <menu_item_call.on_click @@ -17,7 +17,15 @@ parameter="profile" /> </menu_item_call> <menu_item_call - label="Send IM..." + label="Add Friend" + layout="topleft" + name="Add Friend"> + <menu_item_call.on_click + function="IMChicletMenu.Action" + parameter="add" /> + </menu_item_call> + <menu_item_call + label="Show Session" layout="topleft" name="Send IM"> <menu_item_call.on_click @@ -25,11 +33,11 @@ parameter="im" /> </menu_item_call> <menu_item_call - label="Add Friend..." + label="End Session" layout="topleft" - name="Add Friend"> + name="End Session"> <menu_item_call.on_click function="IMChicletMenu.Action" - parameter="add" /> + parameter="end" /> </menu_item_call> </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 590621062c2bb79654994092e3b2e7fc5e9c7e7f..ef0bf72058b9bd19302bbb707f486e9543d667a5 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 @@ -1,103 +1,105 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu - create_jump_keys="true" - layout="topleft" - mouse_opaque="false" - visible="false" - name="Gear Menu"> - <menu_item_call - label="View Profile" - enabled="true" - name="view_profile"> - <menu_item_call.on_click - function="InspectAvatar.ViewProfile"/> - </menu_item_call> - <menu_item_call - label="Add Friend" - name="add_friend"> - <menu_item_call.on_click - function="InspectAvatar.AddFriend"/> - </menu_item_call> - <menu_item_call - label="IM" - name="im"> - <menu_item_call.on_click - function="InspectAvatar.IM"/> - </menu_item_call> - <menu_item_call - label="Call" - enabled="true" - name="call"> - </menu_item_call> - <menu_item_call - label="Teleport" - name="teleport"> - <menu_item_call.on_click - function="InspectAvatar.Teleport"/> - </menu_item_call> - <menu_item_call - label="Invite to Group" - name="invite_to_group"> - <menu_item_call.on_click - function="InspectAvatar.InviteToGroup"/> - </menu_item_call> - <menu_item_separator /> - <menu_item_call - label="Block" - name="block"> - <menu_item_call.on_click - function="InspectAvatar.Block"/> - </menu_item_call> - <menu_item_call - label="Report" - name="report"> - <menu_item_call.on_click - function="InspectAvatar.Report"/> - </menu_item_call> - <menu_item_call - label="Freeze" - name="freeze"> - <menu_item_call.on_click - function="InspectAvatar.Freeze"/> - <menu_item_call.on_visible - function="InspectAvatar.VisibleFreezeEject"/> - </menu_item_call> - <menu_item_call - label="Eject" - name="eject"> - <menu_item_call.on_click - function="InspectAvatar.Eject"/> - <menu_item_call.on_visible - function="InspectAvatar.VisibleFreezeEject"/> - </menu_item_call> - <menu_item_call - label="Debug" - name="debug"> - <menu_item_call.on_click - function="Avatar.Debug"/> - <menu_item_call.on_visible - function="IsGodCustomerService"/> - </menu_item_call> - <menu_item_call - label="Find On Map" - name="find_on_map"> - <menu_item_call.on_click - function="InspectAvatar.FindOnMap"/> - <menu_item_call.on_visible - function="InspectAvatar.VisibleFindOnMap"/> - </menu_item_call> - <menu_item_call - label="Zoom In" - name="zoom_in"> - <menu_item_call.on_click - function="InspectAvatar.ZoomIn"/> - <menu_item_call.on_visible - function="InspectAvatar.VisibleZoomIn"/> - </menu_item_call> - <menu_item_call - label="Pay" - name="pay"> - <menu_item_call.on_click - function="InspectAvatar.Pay"/> - </menu_item_call> -</menu> +<?xml version="1.0" encoding="utf-8"?> +<menu + create_jump_keys="true" + layout="topleft" + mouse_opaque="false" + visible="false" + name="Gear Menu"> + <menu_item_call + label="View Profile" + enabled="true" + name="view_profile"> + <menu_item_call.on_click + function="InspectAvatar.ViewProfile"/> + </menu_item_call> + <menu_item_call + label="Add Friend" + name="add_friend"> + <menu_item_call.on_click + function="InspectAvatar.AddFriend"/> + <menu_item_call.on_enable + function="InspectAvatar.Gear.Enable"/> + </menu_item_call> + <menu_item_call + label="IM" + name="im"> + <menu_item_call.on_click + function="InspectAvatar.IM"/> + </menu_item_call> + <menu_item_call + label="Call" + enabled="true" + name="call"> + </menu_item_call> + <menu_item_call + label="Teleport" + name="teleport"> + <menu_item_call.on_click + function="InspectAvatar.Teleport"/> + </menu_item_call> + <menu_item_call + label="Invite to Group" + name="invite_to_group"> + <menu_item_call.on_click + function="InspectAvatar.InviteToGroup"/> + </menu_item_call> + <menu_item_separator /> + <menu_item_call + label="Block" + name="block"> + <menu_item_call.on_click + function="InspectAvatar.Block"/> + </menu_item_call> + <menu_item_call + label="Report" + name="report"> + <menu_item_call.on_click + function="InspectAvatar.Report"/> + </menu_item_call> + <menu_item_call + label="Freeze" + name="freeze"> + <menu_item_call.on_click + function="InspectAvatar.Freeze"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleFreezeEject"/> + </menu_item_call> + <menu_item_call + label="Eject" + name="eject"> + <menu_item_call.on_click + function="InspectAvatar.Eject"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleFreezeEject"/> + </menu_item_call> + <menu_item_call + label="Debug" + name="debug"> + <menu_item_call.on_click + function="Avatar.Debug"/> + <menu_item_call.on_visible + function="IsGodCustomerService"/> + </menu_item_call> + <menu_item_call + label="Find On Map" + name="find_on_map"> + <menu_item_call.on_click + function="InspectAvatar.FindOnMap"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleFindOnMap"/> + </menu_item_call> + <menu_item_call + label="Zoom In" + name="zoom_in"> + <menu_item_call.on_click + function="InspectAvatar.ZoomIn"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleZoomIn"/> + </menu_item_call> + <menu_item_call + label="Pay" + name="pay"> + <menu_item_call.on_click + function="InspectAvatar.Pay"/> + </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 8b6ab4e4d81533b8c18ff9a4309c84446ffe81c8..b65a49eaed97b1a4360f06ea50fb6194bce8a236 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -356,9 +356,9 @@ parameter="restore" /> </menu_item_call> <menu_item_call - label="Goto Link" + label="Find Original" layout="topleft" - name="Goto Link"> + name="Find Original"> <menu_item_call.on_click function="Inventory.DoToSelected" parameter="goto" /> @@ -434,9 +434,9 @@ <menu_item_separator layout="topleft" /> <menu_item_call - label="Take Off Items" + label="Remove From Outfit" layout="topleft" - name="Take Off Items"> + name="Remove From Outfit"> <menu_item_call.on_click function="Inventory.DoToSelected" parameter="removefromoutfit" /> diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 5eb0560962da5fccbeab7856d08e45317a0cbc3e..07940e18b628a1fcdd750736b4215619b018ef79 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -185,6 +185,21 @@ <menu_item_call.on_click function="Advanced.ShowSideTray" /> </menu_item_call> + <menu_item_call + label="Widget Test" + name="Widget Test" + shortcut="control|shift|T"> + <menu_item_call.on_click + function="ShowFloater" + parameter="test_widgets" /> + </menu_item_call> + <menu_item_call + label="Inspectors Test" + name="Inspectors Test"> + <menu_item_call.on_click + function="ShowFloater" + parameter="test_inspectors" /> + </menu_item_call> <menu_item_check label="Reg In Client Test (restart)" name="Reg In Client Test (restart)"> diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml index 5cbbd71bfeba4fcad48eafd5a625d2d2b6d58f0f..8d0edf018d4162d97f950404de1e6670f66cce25 100644 --- a/indra/newview/skins/default/xui/en/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml @@ -10,7 +10,6 @@ width="128"> <menu_item_call label="Zoom Close" - layout="topleft" name="Zoom Close"> <menu_item_call.on_click function="Minimap.Zoom" @@ -18,7 +17,6 @@ </menu_item_call> <menu_item_call label="Zoom Medium" - layout="topleft" name="Zoom Medium"> <menu_item_call.on_click function="Minimap.Zoom" @@ -26,29 +24,31 @@ </menu_item_call> <menu_item_call label="Zoom Far" - layout="topleft" name="Zoom Far"> <menu_item_call.on_click function="Minimap.Zoom" parameter="far" /> </menu_item_call> - <menu_item_separator - layout="topleft" - name="Tracking Separator" /> + <menu_item_check + label="Rotate Map" + name="Rotate Map"> + <menu_item_check.on_check + control="MiniMapRotate" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="MiniMapRotate" /> + </menu_item_check> + <menu_item_separator /> <menu_item_call label="Stop Tracking" - layout="topleft" name="Stop Tracking"> <menu_item_call.on_click function="Minimap.Tracker" parameter="task_properties" /> </menu_item_call> - <menu_item_separator - layout="topleft" - name="Tracking Separator" /> + <menu_item_separator /> <menu_item_call label="World Map" - layout="topleft" name="World Map"> <menu_item_call.on_click function="ShowFloater" diff --git a/indra/newview/skins/default/xui/en/menu_navbar.xml b/indra/newview/skins/default/xui/en/menu_navbar.xml index 89469fb01368c710be1b8d10bdd09fc6c8774f47..e17eeb46f67251cbeae79ce40891982bf73472a1 100644 --- a/indra/newview/skins/default/xui/en/menu_navbar.xml +++ b/indra/newview/skins/default/xui/en/menu_navbar.xml @@ -10,7 +10,6 @@ width="128"> <menu_item_check label="Show Coordinates" - layout="topleft" name="Show Coordinates"> <menu_item_check.on_click function="Navbar.Action" @@ -19,22 +18,28 @@ function="Navbar.EnableMenuItem" parameter="show_coordinates" /> </menu_item_check> + <menu_item_check + label="Show Parcel Properties" + name="Show Parcel Properties"> + <menu_item_check.on_click + function="Navbar.Action" + parameter="show_properties" /> + <menu_item_check.on_check + control="NavBarShowParcelProperties" /> + </menu_item_check> <!-- Label of 'Landmark' item is changing in runtime, see AddLandmarkNavBarMenu/EditLandmarkNavBarMenu in strings.xml --> <menu_item_call label="Landmark" - layout="topleft" name="Landmark"> <menu_item_call.on_click function="Navbar.Action" parameter="landmark" /> </menu_item_call> <menu_item_separator - layout="topleft" name="Separator" /> <menu_item_call label="Cut" - layout="topleft" name="Cut"> <menu_item_call.on_click function="Navbar.Action" @@ -45,7 +50,6 @@ </menu_item_call> <menu_item_call label="Copy" - layout="topleft" name="Copy"> <menu_item_call.on_click function="Navbar.Action" @@ -56,7 +60,6 @@ </menu_item_call> <menu_item_call label="Paste" - layout="topleft" name="Paste"> <menu_item_call.on_click function="Navbar.Action" @@ -67,7 +70,6 @@ </menu_item_call> <menu_item_call label="Delete" - layout="topleft" name="Delete"> <menu_item_call.on_click function="Navbar.Action" @@ -78,7 +80,6 @@ </menu_item_call> <menu_item_call label="Select All" - layout="topleft" name="Select All"> <menu_item_call.on_click function="Navbar.Action" diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3283c60143f0672cc2992e943c9921fab3f89df --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Participant List Context Menu"> + <menu_item_check + label="Mute Text" + layout="topleft" + name="MuteText"> + <on_check + function="ParticipantList.CheckItem" + parameter="is_muted" /> + <on_click + function="ParticipantList.ToggleMuteText" /> + <on_enable + function="ParticipantList.EnableItem" + parameter="can_mute_text" /> + </menu_item_check> + <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> +</context_menu> 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 6dd44255bf30c2fcb9b8ad5851df2b39a1305174..304492bedb2c330abba093bc6d2d9a20b62ea7db 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 @@ -13,15 +13,11 @@ function="CheckControl" parameter="GroupListShowIcons" /> </menu_item_check> - <menu_item_check + <menu_item_call label="Leave Selected Group" layout="topleft" name="Leave Selected Group"> - <menu_item_check.on_click - function="People.Groups.ViewSort.Action" - parameter="show_icons" /> - <menu_item_check.on_check - function="CheckControl" - parameter="GroupListShowIcons" /> - </menu_item_check> + <menu_item_call.on_click + function="People.Group.Minus.Action"/> + </menu_item_call> </menu> 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 c002cd078f7c2d2bf7bf73cb4b72917e66df9f90..39f9e486093c3a3b659d7d07f22bc53fbd5cc724 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 @@ -2,15 +2,36 @@ <menu name="menu_group_plus" left="0" bottom="0" visible="false" mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false"> - <menu_item_call name="sort_recent" label="Sort by Recent Speakers"> - <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_recent" /> - </menu_item_call> - <menu_item_call name="sort_name" label="Sort by Name"> - <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_name" /> - </menu_item_call> - <menu_item_call name="sort_distance" label="Sort by Distance"> - <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_distance" /> - </menu_item_call> + <menu_item_check + label="Sort by Recent Speakers" + name="sort_by_recent_speakers"> + <menu_item_check.on_click + function="People.Nearby.ViewSort.Action" + parameter="sort_by_recent_speakers"/> + <menu_item_check.on_check + function="People.Nearby.ViewSort.CheckItem" + parameter="sort_by_recent_speakers"/> + </menu_item_check> + <menu_item_check + label="Sort by Name" + name="sort_name"> + <menu_item_check.on_click + function="People.Nearby.ViewSort.Action" + parameter="sort_name"/> + <menu_item_check.on_check + function="People.Nearby.ViewSort.CheckItem" + parameter="sort_name"/> + </menu_item_check> + <menu_item_check + label="Sort by Distance" + name="sort_distance"> + <menu_item_check.on_click + function="People.Nearby.ViewSort.Action" + parameter="sort_distance"/> + <menu_item_check.on_check + function="People.Nearby.ViewSort.CheckItem" + parameter="sort_distance"/> + </menu_item_check> <menu_item_separator layout="topleft" /> <menu_item_check name="view_icons" label="View People Icons"> <menu_item_check.on_click diff --git a/indra/newview/skins/default/xui/en/menu_picks_plus.xml b/indra/newview/skins/default/xui/en/menu_picks_plus.xml new file mode 100644 index 0000000000000000000000000000000000000000..3065239615c595bcfb605d4011d26391c85c57a4 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_picks_plus.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu + height="201" + layout="topleft" + mouse_opaque="false" + name="picks_plus_menu" + width="120"> + <menu_item_call + name="create_pick" + label="New Pick"> + <menu_item_call.on_click + function="Picks.Plus.Action" + userdata="new_pick" /> + </menu_item_call> + <menu_item_call + name="create_classified" + label="New Classified"> + <menu_item_call.on_click + function="Picks.Plus.Action" + userdata="new_classified" /> + </menu_item_call> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b52fecef713b9255d35a89f525318d76122b7a6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu + height="50" + layout="topleft" + mouse_opaque="false" + name="profile_overflow_menu" + width="120"> + <menu_item_call + label="Pay" + layout="topleft" + name="pay"> + <menu_item_call.on_click + function="Profile.Pay" /> + </menu_item_call> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_url_inventory.xml b/indra/newview/skins/default/xui/en/menu_url_inventory.xml new file mode 100644 index 0000000000000000000000000000000000000000..cf9d1d58817e39a1b8633d3080cd8f1f2b5c2f9d --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_url_inventory.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Url Popup"> + <menu_item_call + label="Show Inventory Item" + layout="topleft" + name="show_item"> + <menu_item_call.on_click + function="Url.Execute" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Copy Name to clipboard" + layout="topleft" + name="url_copy_label"> + <menu_item_call.on_click + function="Url.CopyLabel" /> + </menu_item_call> + <menu_item_call + label="Copy SLurl to clipboard" + layout="topleft" + name="url_copy"> + <menu_item_call.on_click + function="Url.CopyUrl" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 1499095bcc7079432e263543cada870637564138..e19e11a1b8458ce5829093bc8f8db657ff8bd587 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1,3698 +1,3718 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<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 - function="Floater.Show" - parameter="preferences" /> - </menu_item_call> - <menu_item_call - label="My Dashboard" - layout="topleft" - name="Manage My Account"> - <menu_item_call.on_click - function="PromptShowURL" - name="ManageMyAccount_url" - parameter="WebLaunchJoinNow,http://secondlife.com/account/" /> - </menu_item_call> - <menu_item_call - label="Buy L$" - layout="topleft" - name="Buy and Sell L$"> - <menu_item_call.on_click - function="ShowFloater" - parameter="buy currency" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <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"> - <menu_item_call.on_click - function="ShowFloater" - parameter="appearance" /> - <menu_item_call.on_enable - function="Edit.EnableCustomizeAvatar" /> - </menu_item_call> - <menu_item_check - label="My Inventory" - layout="topleft" - name="Inventory" - shortcut="control|I"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="inventory" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="inventory" /> - </menu_item_check> - <menu_item_call - label="My Gestures" - layout="topleft" - name="Gestures" - shortcut="control|G"> - <menu_item_call.on_click - function="ShowFloater" - parameter="gestures" /> - </menu_item_call> - <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"/> - </menu_item_call> - </menu> - <menu_item_call - label="Request Admin Status" - layout="topleft" - name="Request Admin Options" - shortcut="control|alt|G" - visible="false"> - <menu_item_call.on_click - function="Advanced.RequestAdminStatus" /> - </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_call - label="Quit [APP_NAME]" - layout="topleft" - name="Quit" - shortcut="control|Q"> - <menu_item_call.on_click - function="File.Quit" /> - </menu_item_call> - </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 - function="SideTray.PanelPeopleTab" - parameter="friends_panel" /> - </menu_item_call> - <menu_item_call - label="My Groups" - layout="topleft" - name="My Groups"> - <menu_item_call.on_click - function="SideTray.PanelPeopleTab" - parameter="groups_panel" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <!--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"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="nearby_chat" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="nearby_chat" /> - </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_item_check - label="Block List" - layout="topleft" - name="Mute List"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="mute" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="mute" /> - </menu_item_check--> - <menu_item_separator - layout="topleft" /> - <menu_item_check - label="(Legacy) Communicate" - layout="topleft" - name="Instant Message" - shortcut="control|T"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="communicate" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="communicate" /> - </menu_item_check> - <menu_item_call - label="(Temp) Media Remote Ctrl" - layout="topleft" - name="Preferences" - shortcut="control|alt|M"> - <menu_item_call.on_click - function="Floater.Toggle" - parameter="media_remote_ctrl" /> - </menu_item_call> - </menu> - <menu - label="World" - layout="topleft" - name="World" - tear_off="true"> - <menu_item_check - label="Move" - 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" /> - </menu_item_check> - <menu_item_check - label="View" - 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" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="About Land" - layout="topleft" - name="About Land"> - <menu_item_call.on_click - function="Floater.Show" - parameter="about_land" /> - </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_item_call - label="Buy Land" - layout="topleft" - name="Buy Land"> - <menu_item_call.on_click - function="ShowFloater" - parameter="buy land" /> - <menu_item_call.on_enable - function="World.EnableBuyLand" /> - </menu_item_call> - <menu_item_call - label="My Land" - layout="topleft" - name="My Land"> - <menu_item_call.on_click - function="ShowFloater" - parameter="land_holdings" /> - </menu_item_call> - <menu - create_jump_keys="true" - label="Show" - layout="topleft" - name="Land" - tear_off="true"> - <menu_item_check - label="Ban Lines" - layout="topleft" - name="Ban Lines"> - <menu_item_check.on_check - control="ShowBanLines" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowBanLines" /> - </menu_item_check> - <menu_item_check - label="Beacons" - layout="topleft" - name="beacons" - shortcut="control|alt|shift|N"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="beacons" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="beacons" /> - </menu_item_check> - <menu_item_check - label="Property Lines" - layout="topleft" - name="Property Lines" - shortcut="control|alt|shift|P"> - <menu_item_check.on_check - control="ShowPropertyLines" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowPropertyLines" /> - </menu_item_check> - <menu_item_check - label="Land Owners" - layout="topleft" - name="Land Owners"> - <menu_item_check.on_check - control="ShowParcelOwners" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowParcelOwners" /> - </menu_item_check> - </menu> - <menu_item_separator - layout="topleft" /> - <menu - label="Landmarks" - layout="topleft" - name="Landmarks" - tear_off="true"> - <menu_item_call - label="Create Landmark Here" - layout="topleft" - name="Create Landmark Here"> - <menu_item_call.on_click - function="World.CreateLandmark" /> - <menu_item_call.on_enable - function="World.EnableCreateLandmark" /> - </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" /> - <menu_item_call.on_enable - function="World.EnableSetHomeLocation" /> - </menu_item_call> - <menu_item_call - label="Teleport Home" - layout="topleft" - name="Teleport Home" - shortcut="control|shift|H"> - <menu_item_call.on_click - function="World.TeleportHome" /> - <menu_item_call.on_enable - function="World.EnableTeleportHome" /> - </menu_item_call> - </menu> - <menu_item_check - label="Mini-Map" - layout="topleft" - name="Mini-Map" - shortcut="control|shift|M"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="mini_map" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="mini_map" /> - </menu_item_check> - <menu_item_check - label="World Map" - layout="topleft" - name="World Map" - shortcut="control|M" - use_mac_ctrl="true"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="world_map" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="world_map" /> - </menu_item_check> - <!-- <menu_item_check - label="Show Navigation Bar" - layout="topleft" - name="ShowNavbarNavigationPanel"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowNavbarNavigationPanel" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowNavbarNavigationPanel" /> - </menu_item_check> - <menu_item_check - label="Show Favorites Bar" - layout="topleft" - name="ShowNavbarFavoritesPanel"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowNavbarFavoritesPanel" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowNavbarFavoritesPanel" /> - </menu_item_check> - <menu_item_separator - layout="topleft" />--> - <menu_item_call - label="Snapshot" - layout="topleft" - name="Take Snapshot" - shortcut="control|shift|S"> - <menu_item_call.on_click - function="Floater.Show" - parameter="snapshot" /> - </menu_item_call> - <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" - parameter="sunrise" /> - </menu_item_call> - <menu_item_call - label="Midday" - layout="topleft" - name="Noon" - shortcut="control|shift|Y"> - <menu_item_call.on_click - function="World.EnvSettings" - parameter="noon" /> - </menu_item_call> - <menu_item_call - label="Sunset" - layout="topleft" - name="Sunset" - shortcut="control|shift|N"> - <menu_item_call.on_click - function="World.EnvSettings" - parameter="sunset" /> - </menu_item_call> - <menu_item_call - label="Midnight" - layout="topleft" - name="Midnight"> - <menu_item_call.on_click - function="World.EnvSettings" - parameter="midnight" /> - </menu_item_call> - <menu_item_call - label="Use the 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_call - label="Environment Editor" - layout="topleft" - name="Environment Editor"> - <menu_item_call.on_click - function="World.EnvSettings" - parameter="editor" /> - </menu_item_call> - </menu> - </menu> - <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 - function="Build.Active" /> - <menu_item_check.on_click - function="Build.Toggle" /> - <menu_item_check.on_enable - function="Build.Enabled" /> - </menu_item_check> - <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 - function="Tools.SelectTool" - parameter="focus" /> - </menu_item_call> - <menu_item_call - label="Move Tool" - layout="topleft" - name="Move" - shortcut="control|2"> - <menu_item_call.on_click - function="Tools.SelectTool" - parameter="move" /> - </menu_item_call> - <menu_item_call - label="Edit Tool" - layout="topleft" - name="Edit" - shortcut="control|3"> - <menu_item_call.on_click - function="Tools.SelectTool" - parameter="edit" /> - </menu_item_call> - <menu_item_call - label="Create Tool" - layout="topleft" - name="Create" - shortcut="control|4"> - <menu_item_call.on_click - function="Tools.SelectTool" - parameter="create" /> - </menu_item_call> - <menu_item_call - label="Land Tool" - layout="topleft" - name="Land" - shortcut="control|5"> - <menu_item_call.on_click - function="Tools.SelectTool" - 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 - function="Tools.Link" /> - <menu_item_call.on_enable - function="Tools.EnableLink" /> - </menu_item_call> - <menu_item_call - label="Unlink" - layout="topleft" - name="Unlink" - shortcut="control|shift|L"> - <menu_item_call.on_click - function="Tools.Unlink" /> - <menu_item_call.on_enable - function="Tools.EnableUnlink" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="Focus on Selection" - layout="topleft" - name="Focus on Selection" - shortcut="H"> - <menu_item_call.on_click - function="Tools.LookAtSelection" - parameter="focus" /> - <menu_item_call.on_enable - function="Tools.SomethingSelectedNoHUD" /> - </menu_item_call> - <menu_item_call - label="Zoom to Selection" - layout="topleft" - name="Zoom to Selection" - shortcut="shift|H"> - <menu_item_call.on_click - function="Tools.LookAtSelection" - parameter="zoom" /> - <menu_item_call.on_enable - function="Tools.SomethingSelectedNoHUD" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <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" /> - </menu_item_call> - <menu_item_call - label="Take Copy" - layout="topleft" - name="Take Copy"> - <menu_item_call.on_click - function="Tools.TakeCopy" /> - <menu_item_call.on_enable - function="Tools.EnableTakeCopy" /> - </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" /> - <menu_item_call.on_enable - function="Tools.EnableSaveToInventory" /> - </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" /> - <menu_item_call.on_enable - function="Tools.EnableSaveToObjectInventory" /> - </menu_item_call> - </menu> - <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" - parameter="compile mono" /> - <menu_item_call.on_enable - function="EditableSelectedMono" /> - </menu_item_call> - <menu_item_call - label="Recompile Scripts (LSL)" - layout="topleft" - name="LSL"> - <menu_item_call.on_click - function="Tools.SelectedScriptAction" - parameter="compile lsl" /> - <menu_item_call.on_enable - function="EditableSelected" /> - </menu_item_call> - <menu_item_call - label="Reset Scripts" - layout="topleft" - name="Reset Scripts"> - <menu_item_call.on_click - function="Tools.SelectedScriptAction" - parameter="reset" /> - <menu_item_call.on_enable - function="EditableSelected" /> - </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" - parameter="start" /> - <menu_item_call.on_enable - function="EditableSelected" /> - </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" - parameter="stop" /> - <menu_item_call.on_enable - function="EditableSelected" /> - </menu_item_call> - </menu> - <menu_item_separator - layout="topleft" /> - <menu - create_jump_keys="true" - label="Options" - layout="topleft" - name="Options" - tear_off="true"> - <menu_item_check - label="Edit Linked Parts" - layout="topleft" - name="Edit Linked Parts"> - <menu_item_check.on_check - control="EditLinkedParts" /> - <menu_item_check.on_click - function="Tools.EditLinkedParts" - parameter="EditLinkedParts" /> - <menu_item_check.on_enable - function="Tools.EnableToolNotPie" /> - </menu_item_check> - <menu_item_call - label="Set Default Upload Permissions" - layout="topleft" - name="perm prefs"> - <menu_item_call.on_click - function="Floater.Toggle" - parameter="perm_prefs" /> - <menu_item_check - label="Show Advanced Permissions" - layout="topleft" - name="DebugPermissions"> - <menu_item_check.on_check - function="CheckControl" - parameter="DebugPermissions" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DebugPermissions" /> - </menu_item_check> - </menu_item_call> - <!--menu_item_call - label="Show Script Warning/Error Window" - layout="topleft" - name="Show Script Warning/Error Window"> - <menu_item_call.on_click - function="ShowFloater" - parameter="script errors" /> - </menu_item_call--> - <menu_item_separator - layout="topleft" /> - <menu - create_jump_keys="true" - label="Selection" - layout="topleft" - name="Selection" - tear_off="true"> - <menu_item_check - label="Select Only My Objects" - layout="topleft" - name="Select Only My Objects"> - <menu_item_check.on_check - control="SelectOwnedOnly" /> - <menu_item_check.on_click - function="Tools.SelectOnlyMyObjects" - parameter="agents" /> - </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" /> - <menu_item_check.on_click - function="Tools.SelectOnlyMovableObjects" - parameter="movable" /> - </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> - <menu - create_jump_keys="true" - label="Show" - layout="topleft" - name="Show" - tear_off="true"> - <menu_item_check - label="Show Hidden Selection" - layout="topleft" - name="Show Hidden Selection"> - <menu_item_check.on_check - control="RenderHiddenSelections" /> - <menu_item_check.on_click - function="Tools.ShowHiddenSelection" /> - </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" /> - <menu_item_check.on_click - function="Tools.ShowSelectionLightRadius" /> - </menu_item_check> - <menu_item_check - label="Show Selection Beam" - layout="topleft" - name="Show Selection Beam"> - <menu_item_check.on_check - control="ShowSelectionBeam" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowSelectionBeam" /> - </menu_item_check> - </menu> - <menu - create_jump_keys="true" - label="Grid" - layout="topleft" - name="Grid" - tear_off="true"> - <menu_item_check - label="Snap to Grid" - layout="topleft" - name="Snap to Grid" - shortcut="G"> - <menu_item_check.on_check - control="SnapEnabled" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="SnapEnabled" /> - <menu_item_check.on_enable - function="Tools.EnableToolNotPie" /> - </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 - function="Tools.SnapObjectXY" /> - <menu_item_call.on_enable - function="Tools.EnableToolNotPie" /> - </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 - function="Tools.UseSelectionForGrid" /> - <menu_item_call.on_enable - function="SomethingSelected" /> - </menu_item_call> - <menu_item_call - label="Grid Options" - layout="topleft" - name="Grid Options" - shortcut="control|shift|B"> - <menu_item_call.on_click - function="Floater.Show" - parameter="build_options" /> - <menu_item_call.on_enable - function="Tools.EnableToolNotPie" /> - </menu_item_call> - </menu> - </menu> - <menu - create_jump_keys="true" - label="Select Linked Parts" - layout="topleft" - name="Select Linked Parts" - tear_off="true"> - <menu_item_call - label="Select Next Part" - layout="topleft" - 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" - layout="topleft" - 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" - layout="topleft" - 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" - layout="topleft" - 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> - <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="ShowFloater" - parameter="help f1" /> - </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_call - label="Report Abuse" - layout="topleft" - name="Report Abuse"> - <menu_item_call.on_click - function="ShowFloater" - parameter="complaint reporter" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="About [APP_NAME]" - layout="topleft" - name="About Second Life"> - <menu_item_call.on_click - function="Floater.Show" - parameter="sl_about" /> - </menu_item_call> - </menu> - <menu - label="Advanced" - layout="topleft" - name="Advanced" - tear_off="true" - visible="false"> - <menu_item_check - label="Set Away After 30 Minutes" - layout="topleft" - name="Go Away/AFK When Idle"> - <menu_item_check.on_check - function="CheckControl" - parameter="AllowIdleAFK" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="AllowIdleAFK" /> - </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 - function="Advanced.RebakeTextures" /> - </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/> - <menu_item_check - label="Limit Select Distance" - layout="topleft" - name="Limit Select Distance"> - <menu_item_check.on_check - function="CheckControl" - parameter="LimitSelectDistance" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="LimitSelectDistance" /> - </menu_item_check> - <menu_item_check - label="Disable Camera Constraints" - layout="topleft" - name="Disable Camera Distance"> - <menu_item_check.on_check - function="CheckControl" - parameter="DisableCameraConstraints" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DisableCameraConstraints" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_check - label="High-res Snapshot" - layout="topleft" - name="HighResSnapshot"> - <menu_item_check.on_check - function="CheckControl" - parameter="HighResSnapshot" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="HighResSnapshot" /> - </menu_item_check> - <menu_item_check - label="Quiet Snapshots to Disk" - layout="topleft" - name="QuietSnapshotsToDisk"> - <menu_item_check.on_check - function="CheckControl" - parameter="QuietSnapshotsToDisk" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="QuietSnapshotsToDisk" /> - </menu_item_check> - <menu_item_check - label="Compress Snapshots to Disk" - layout="topleft" - name="CompressSnapshotsToDisk"> - <menu_item_check.on_check - function="CheckControl" - parameter="CompressSnapshotsToDisk" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="CompressSnapshotsToDisk" /> - </menu_item_check> - <menu_item_call - label="Save Texture As" - layout="topleft" - name="Save Texture As"> - <menu_item_call.on_click - function="File.SaveTexture" /> - <menu_item_call.on_enable - function="File.EnableSaveAs" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <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" - parameter="lagmeter" /> - </menu_item_call> - <menu_item_check - label="Statistics Bar" - layout="topleft" - name="Statistics Bar" - shortcut="control|shift|1"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="stats" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="stats" /> - </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" - parameter="shame" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="shame" /> - </menu_item_check> - </menu> - <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" - parameter="CheesyBeacon" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="CheesyBeacon" /> - </menu_item_check> - <menu_item_check - label="Hide Particles" - layout="topleft" - name="Hide Particles" - shortcut="control|alt|shift|="> - <menu_item_check.on_check - function="View.CheckRenderType" - parameter="hideparticles" /> - <menu_item_check.on_click - function="View.ToggleRenderType" - parameter="hideparticles" /> - </menu_item_check> - <menu_item_check - label="Hide Selected" - layout="topleft" - name="Hide Selected"> - <menu_item_check.on_check - function="CheckControl" - parameter="HideSelectedObjects" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="HideSelectedObjects" /> - </menu_item_check> - <menu_item_check - label="Highlight Transparent" - layout="topleft" - name="Highlight Transparent" - shortcut="control|alt|T"> - <menu_item_check.on_check - function="View.CheckHighlightTransparent" /> - <menu_item_check.on_click - function="View.HighlightTransparent" /> - </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 - function="View.CheckHUDAttachments" /> - <menu_item_check.on_click - function="View.ShowHUDAttachments" /> - </menu_item_check> - <menu_item_check - label="Show Mouselook Crosshairs" - layout="topleft" - name="ShowCrosshairs"> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowCrosshairs" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowCrosshairs" /> - </menu_item_check> - <!-- <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 - function="View.CheckShowHoverTips" /> - <menu_item_check.on_click - function="View.ShowHoverTips" /> - </menu_item_check> - <menu_item_separator - layout="topleft" />--> - <menu_item_check - label="Show Land Tooltips" - layout="topleft" - name="Land Tips"> - <menu_item_check.on_check - control="ShowLandHoverTip" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowLandHoverTip" /> - <menu_item_check.on_enable - function="View.CheckShowHoverTips" /> - </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" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowAllObjectHoverTip" /> - <menu_item_check.on_enable - function="View.CheckShowHoverTips" /> - </menu_item_check> - </menu>--> - - </menu> - - <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 - function="Advanced.CheckRenderType" - parameter="simple" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="simple" /> - </menu_item_check> - <menu_item_check - label="Alpha" - layout="topleft" - name="Alpha" - shortcut="control|alt|shift|2"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="alpha" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="alpha" /> - </menu_item_check> - <menu_item_check - label="Tree" - layout="topleft" - name="Tree" - shortcut="control|alt|shift|3"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="tree" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="tree" /> - </menu_item_check> - <menu_item_check - label="Avatars" - layout="topleft" - name="Character" - shortcut="control|alt|shift|4"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="character" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="character" /> - </menu_item_check> - <menu_item_check - label="SurfacePath" - layout="topleft" - name="SurfacePath" - shortcut="control|alt|shift|5"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="surfacePath" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="surfacePath" /> - </menu_item_check> - <menu_item_check - label="Sky" - layout="topleft" - name="Sky" - shortcut="control|alt|shift|6"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="sky" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="sky" /> - </menu_item_check> - <menu_item_check - label="Water" - layout="topleft" - name="Water" - shortcut="control|alt|shift|7"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="water" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="water" /> - </menu_item_check> - <menu_item_check - label="Ground" - layout="topleft" - name="Ground" - shortcut="control|alt|shift|8"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="ground" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="ground" /> - </menu_item_check> - <menu_item_check - label="Volume" - layout="topleft" - name="Volume" - shortcut="control|alt|shift|9"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="volume" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="volume" /> - </menu_item_check> - <menu_item_check - label="Grass" - layout="topleft" - name="Grass" - shortcut="control|alt|shift|0"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="grass" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="grass" /> - </menu_item_check> - <menu_item_check - label="Clouds" - layout="topleft" - name="Clouds" - shortcut="control|alt|shift|-"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="clouds" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="clouds" /> - </menu_item_check> - <menu_item_check - label="Particles" - layout="topleft" - name="Particles" - shortcut="control|alt|shift|="> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="particles" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="particles" /> - </menu_item_check> - <menu_item_check - label="Bump" - layout="topleft" - name="Bump" - shortcut="control|alt|shift|\"> - <menu_item_check.on_check - function="Advanced.CheckRenderType" - parameter="bump" /> - <menu_item_check.on_click - function="Advanced.ToggleRenderType" - parameter="bump" /> - </menu_item_check> - </menu> - <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 - function="Advanced.CheckFeature" - parameter="ui" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="ui" /> - </menu_item_check> - <menu_item_check - label="Selected" - layout="topleft" - name="Selected" - shortcut="control|alt|F2"> - <menu_item_check.on_check - function="Advanced.CheckFeature" - parameter="selected" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="selected" /> - </menu_item_check> - <menu_item_check - label="Highlighted" - layout="topleft" - name="Highlighted" - shortcut="control|alt|F3"> - <menu_item_check.on_check - function="Advanced.CheckFeature" - parameter="highlighted" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="highlighted" /> - </menu_item_check> - <menu_item_check - label="Dynamic Textures" - layout="topleft" - name="Dynamic Textures" - shortcut="control|alt|F4"> - <menu_item_check.on_check - function="Advanced.CheckFeature" - parameter="dynamic textures" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="dynamic textures" /> - </menu_item_check> - <menu_item_check - label="Foot Shadows" - layout="topleft" - name="Foot Shadows" - shortcut="control|alt|F5"> - <menu_item_check.on_check - function="Advanced.CheckFeature" - parameter="foot shadows" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="foot shadows" /> - </menu_item_check> - <menu_item_check - label="Fog" - layout="topleft" - name="Fog" - shortcut="control|alt|F6"> - <menu_item_check.on_check - function="Advanced.CheckFeature" - parameter="fog" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="fog" /> - </menu_item_check> - <menu_item_check - label="Test FRInfo" - layout="topleft" - name="Test FRInfo" - shortcut="control|alt|F8"> - <menu_item_check.on_check - function="Advanced.CheckFeature" - parameter="fr info" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="fr info" /> - </menu_item_check> - <menu_item_check - label="Flexible Objects" - layout="topleft" - name="Flexible Objects" - shortcut="control|alt|F9"> - <menu_item_check.on_check - function="Advanced.CheckFeature" - parameter="flexible" /> - <menu_item_check.on_click - function="Advanced.ToggleFeature" - parameter="flexible" /> - </menu_item_check> - </menu> - <menu_item_check - label="Run Multiple Threads" - layout="topleft" - name="Run Multiple Threads"> - <menu_item_check.on_check - function="CheckControl" - parameter="RunMultipleThreads" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RunMultipleThreads" /> - </menu_item_check> - <menu_item_call - label="Clear Group Cache" - layout="topleft" - name="ClearGroupCache"> - <menu_item_call.on_click - function="Advanced.ClearGroupCache" - parameter="ClearGroupCache" /> - </menu_item_call> - <menu_item_check - label="Mouse Smoothing" - layout="topleft" - name="Mouse Smoothing"> - <menu_item_check.on_check - function="CheckControl" - parameter="MouseSmooth" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="MouseSmooth" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu - label="Shortcuts" - layout="topleft" - name="Shortcuts" - tear_off="true" - visible="false"> - <menu_item_check - label="Search" - layout="topleft" - name="Search" - shortcut="control|F"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="search" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="search" /> - </menu_item_check> - <menu_item_call - enabled="false" - label="Release Keys" - layout="topleft" - name="Release Keys"> - <menu_item_call.on_click - function="Tools.ReleaseKeys" - parameter="" /> - <menu_item_call.on_enable - function="Tools.EnableReleaseKeys" - parameter="" /> - </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" /> - <menu_item_check - label="Always Run" - layout="topleft" - name="Always Run" - shortcut="control|R"> - <menu_item_check.on_check - function="World.CheckAlwaysRun" /> - <menu_item_check.on_click - function="World.AlwaysRun" /> - </menu_item_check> - <menu_item_check - label="Fly" - layout="topleft" - name="Fly" - shortcut="Home"> - <menu_item_check.on_click - function="Agent.toggleFlying" /> - <menu_item_check.on_enable - function="Agent.enableFlying" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="Close Window" - layout="topleft" - name="Close Window" - shortcut="control|W"> - <menu_item_call.on_click - function="File.CloseWindow" /> - <menu_item_call.on_enable - function="File.EnableCloseWindow" /> - </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 - function="File.CloseAllWindows" /> - <menu_item_call.on_enable - function="File.EnableCloseAllWindows" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <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_call - label="Mouselook" - layout="topleft" - name="Mouselook" - shortcut="M"> - <menu_item_call.on_click - function="View.Mouselook" /> - <menu_item_call.on_enable - function="View.EnableMouselook" /> - </menu_item_call> - <menu_item_check - label="Joystick Flycam" - layout="topleft" - name="Joystick Flycam" - shortcut="alt|shift|F"> - <menu_item_check.on_check - function="View.CheckJoystickFlycam" /> - <menu_item_check.on_click - function="View.JoystickFlycam" /> - <menu_item_check.on_enable - function="View.EnableJoystickFlycam" /> - </menu_item_check> - <menu_item_call - label="Reset View" - layout="topleft" - name="Reset View" - shortcut="Esc"> - <menu_item_call.on_click - function="View.ResetView" /> - </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 - function="View.LookAtLastChatter" /> - <menu_item_call.on_enable - function="View.EnableLastChatter" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - <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 - function="Tools.SelectTool" - parameter="focus" /> - </menu_item_call> - <menu_item_call - label="Move Tool" - layout="topleft" - name="Move" - shortcut="control|2"> - <menu_item_call.on_click - function="Tools.SelectTool" - parameter="move" /> - </menu_item_call> - <menu_item_call - label="Edit Tool" - layout="topleft" - name="Edit" - shortcut="control|3"> - <menu_item_call.on_click - function="Tools.SelectTool" - parameter="edit" /> - </menu_item_call> - <menu_item_call - label="Create Tool" - layout="topleft" - name="Create" - shortcut="control|4"> - <menu_item_call.on_click - function="Tools.SelectTool" - parameter="create" /> - </menu_item_call> - <menu_item_call - label="Land Tool" - layout="topleft" - name="Land" - shortcut="control|5"> - <menu_item_call.on_click - function="Tools.SelectTool" - parameter="land" /> - </menu_item_call> - </menu> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="Zoom In" - layout="topleft" - name="Zoom In" - shortcut="control|0"> - <menu_item_call.on_click - function="View.ZoomIn" /> - </menu_item_call> - <menu_item_call - label="Zoom Default" - layout="topleft" - name="Zoom Default" - shortcut="control|9"> - <menu_item_call.on_click - function="View.ZoomDefault" /> - </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_call - label="Show Debug Settings" - layout="topleft" - name="Debug Settings"> - <menu_item_call.on_click - function="Advanced.ShowDebugSettings" - parameter="all" /> - </menu_item_call> - <menu_item_check - label="Show Develop Menu" - layout="topleft" - name="Debug Mode" - shortcut="control|alt|Q"> - <menu_item_check.on_check - function="CheckControl" - parameter="QAMode" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="QAMode" /> - </menu_item_check> - </menu> - <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"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="texture" /> - <menu_item_check.on_click - function="Advanced.ToggleConsole" - parameter="texture" /> - </menu_item_check> - <menu_item_check - label="Debug Console" - layout="topleft" - name="Debug Console" - shortcut="control|shift|4" - use_mac_ctrl="true"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="debug" /> - <menu_item_check.on_click - function="Advanced.ToggleConsole" - parameter="debug" /> - </menu_item_check> - <menu_item_call - label="Notifications Console" - layout="topleft" - name="Notifications" - shortcut="control|shift|5"> - <menu_item_call.on_click - function="Floater.Toggle" - parameter="notifications_console" /> - </menu_item_call> - <menu_item_check - label="Texture Size Console" - layout="topleft" - name="Texture Size" - shortcut="control|shift|6"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="texture size" /> - <menu_item_check.on_click - function="Advanced.ToggleConsole" - parameter="texture size" /> - </menu_item_check> - <menu_item_check - label="Texture Category Console" - layout="topleft" - name="Texture Category" - shortcut="control|shift|7"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="texture category" /> - <menu_item_check.on_click - function="Advanced.ToggleConsole" - parameter="texture category" /> - </menu_item_check> - <menu_item_check - label="Fast Timers" - layout="topleft" - name="Fast Timers" - shortcut="control|shift|9" - use_mac_ctrl="true"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="fast timers" /> - <menu_item_check.on_click - function="Advanced.ToggleConsole" - parameter="fast timers" /> - </menu_item_check> - <menu_item_check - label="Memory" - layout="topleft" - name="Memory" - shortcut="control|shift|0" - use_mac_ctrl="true"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="memory view" /> - <menu_item_check.on_click - function="Advanced.ToggleConsole" - parameter="memory view" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <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" - parameter="region" /> - </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" - parameter="group" /> - </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_check - label="Camera" - layout="topleft" - name="Camera"> - <menu_item_check.on_check - function="Advanced.CheckHUDInfo" - parameter="camera" /> - <menu_item_check.on_click - function="Advanced.ToggleHUDInfo" - parameter="camera" /> - </menu_item_check> - <menu_item_check - label="Wind" - layout="topleft" - name="Wind"> - <menu_item_check.on_check - function="Advanced.CheckHUDInfo" - parameter="wind" /> - <menu_item_check.on_click - function="Advanced.ToggleHUDInfo" - parameter="wind" /> - </menu_item_check> - <menu_item_check - label="FOV" - layout="topleft" - name="FOV"> - <menu_item_check.on_check - function="Advanced.CheckHUDInfo" - parameter="fov" /> - <menu_item_check.on_click - function="Advanced.ToggleHUDInfo" - parameter="fov" /> - </menu_item_check> - </menu> - <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" - parameter="DebugShowTime" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DebugShowTime" /> - </menu_item_check> - <menu_item_check - label="Show Render Info" - layout="topleft" - name="Show Render Info"> - <menu_item_check.on_check - function="CheckControl" - parameter="DebugShowRenderInfo" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DebugShowRenderInfo" /> - </menu_item_check> - <menu_item_check - label="Show Matrices" - layout="topleft" - name="Show Matrices"> - <menu_item_check.on_check - function="CheckControl" - parameter="DebugShowRenderMatrices" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DebugShowRenderMatrices" /> - </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" - parameter="DebugShowColor" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DebugShowColor" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_check - label="Show Updates to Objects" - layout="topleft" - name="Show Updates" - shortcut="control|alt|shift|U"> - <menu_item_check.on_check - function="Advanced.CheckShowObjectUpdates" - parameter="ObjectUpdates" /> - <menu_item_check.on_click - function="Advanced.ToggleShowObjectUpdates" /> - </menu_item_check> - </menu> - <menu_item_separator - layout="topleft" /> - <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 - function="Advanced.ForceErrorBreakpoint" /> - </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" - parameter="mem_leaking" /> - </menu_item_call> - </menu> - <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" - parameter="CameraOffset" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="CameraOffset" /> - </menu_item_check> - <menu_item_check - label="Randomize Framerate" - layout="topleft" - name="Randomize Framerate"> - <menu_item_check.on_check - function="Advanced.CheckRandomizeFramerate" - parameter="Randomize Framerate" /> - <menu_item_check.on_click - function="Advanced.ToggleRandomizeFramerate" /> - </menu_item_check> - <menu_item_check - label="Periodic Slow Frame" - layout="topleft" - name="Periodic Slow Frame"> - <menu_item_check.on_check - function="Advanced.CheckPeriodicSlowFrame" - parameter="points" /> - <menu_item_check.on_click - function="Advanced.TogglePeriodicSlowFrame" - parameter="points" /> - </menu_item_check> - <menu_item_check - label="Frame Test" - layout="topleft" - name="Frame Test"> - <menu_item_check.on_check - function="Advanced.CheckFrameTest" - parameter="Frame Test" /> - <menu_item_check.on_click - function="Advanced.ToggleFrameTest" /> - </menu_item_check> - </menu> - <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" - parameter="bboxes" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="bboxes" /> - </menu_item_check> - <menu_item_check - label="Octree" - layout="topleft" - name="Octree"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="octree" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="octree" /> - </menu_item_check> - <menu_item_check - label="Shadow Frusta" - layout="topleft" - name="Shadow Frusta"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="shadow frusta" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="shadow frusta" /> - </menu_item_check> - <menu_item_check - label="Occlusion" - layout="topleft" - name="Occlusion"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="occlusion" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="occlusion" /> - </menu_item_check> - <menu_item_check - label="Render Batches" - layout="topleft" - name="Render Batches"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="render batches" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="render batches" /> - </menu_item_check> - <menu_item_check - label="Texture Anim" - layout="topleft" - name="Texture Anim"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="texture anim" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="texture anim" /> - </menu_item_check> - <menu_item_check - label="Texture Priority" - layout="topleft" - name="Texture Priority"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="texture priority" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="texture priority" /> - </menu_item_check> - <menu_item_check - label="Texture Area" - layout="topleft" - name="Texture Area"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="texture area" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="texture area" /> - </menu_item_check> - <menu_item_check - label="Face Area" - layout="topleft" - name="Face Area"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="face area" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="face area" /> - </menu_item_check> - <menu_item_check - label="Lights" - layout="topleft" - name="Lights"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="lights" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="lights" /> - </menu_item_check> - <menu_item_check - label="Collision Skeleton" - layout="topleft" - name="Collision Skeleton"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="collision skeleton" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="collision skeleton" /> - </menu_item_check> - <menu_item_check - label="Raycast" - layout="topleft" - name="Raycast"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="raycast" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="raycast" /> - </menu_item_check> - </menu> - <menu - create_jump_keys="true" - label="Rendering" - layout="topleft" - name="Rendering" - tear_off="true"> - <menu_item_check - label="Axes" - name="Axes"> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowAxes" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowAxes" /> - </menu_item_check> - <menu_item_check - label="Tangent Basis" - name="Tangent Basis"> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowTangentBasis" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowTangentBasis" /> - </menu_item_check> - <menu_item_call - label="Selected Texture Info Basis" - name="Selected Texture Info Basis" - shortcut="control|alt|shift|T"> - <menu_item_call.on_click - function="Advanced.SelectedTextureInfo" /> - </menu_item_call> - <menu_item_check - label="Wireframe" - name="Wireframe" - shortcut="control|shift|R"> - <menu_item_check.on_check - function="Advanced.CheckWireframe" - parameter="Wireframe" /> - <menu_item_check.on_click - function="Advanced.ToggleWireframe" /> - </menu_item_check> - <menu_item_check - label="Object-Object Occlusion" - name="Object-Object Occlusion" - shortcut="control|shift|O"> - <menu_item_check.on_check - function="CheckControl" - parameter="UseOcclusion" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="UseOcclusion" /> - <menu_item_check.on_enable - function="Advanced.EnableObjectObjectOcclusion" /> - </menu_item_check> - <menu_item_check - label="Framebuffer Objects" - name="Framebuffer Objects"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderUseFBO" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderUseFBO" /> - <menu_item_check.on_enable - function="Advanced.EnableRenderFBO" /> - </menu_item_check> - <menu_item_check - label="Deferred Rendering" - name="Deferred Rendering"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderDeferred" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderDeferred" /> - <menu_item_check.on_enable - function="Advanced.EnableRenderDeferred" /> - </menu_item_check> - <menu_item_check - label="Global Illumintation" - name="Global Illumination"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderDeferredGI" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderDeferredGI" /> - <menu_item_check.on_enable - function="Advanced.EnableRenderDeferredGI" /> - </menu_item_check> - <menu_item_separator /> - <menu_item_check - label="Debug GL" - name="Debug GL"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderDebugGL" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderDebugGL" /> - </menu_item_check> - <menu_item_check - label="Debug Pipeline" - name="Debug Pipeline"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderDebugGL" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderDebugGL" /> - </menu_item_check> - <menu_item_check - label="Fast Alpha" - name="Fast Alpha"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderDebugGL" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderDebugGL" /> - </menu_item_check> - <menu_item_check - label="Animation Textures" - name="Animation Textures"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderDebugGL" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderDebugGL" /> - </menu_item_check> - <menu_item_check - label="Disable Textures" - name="Disable Textures"> - <menu_item_check.on_check - function="CheckControl" - parameter="TextureDisable" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="TextureDisable" /> - </menu_item_check> - <menu_item_check - label="Full Res Textures" - layout="topleft" - name="Rull Res Textures"> - <menu_item_check.on_check - function="CheckControl" - parameter="TextureLoadFullRes" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="TextureLoadFullRes" /> - </menu_item_check> - <menu_item_check - label="Audit Textures" - layout="topleft" - name="Audit Textures"> - <menu_item_check.on_check - function="CheckControl" - parameter="AuditTexture" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="AuditTexture" /> - </menu_item_check> - <menu_item_check - label="Texture Atlas" - name="Texture Atlas"> - <menu_item_check.on_check - function="CheckControl" - parameter="EnableTextureAtlas" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="EnableTextureAtlas" /> - </menu_item_check> - <menu_item_check - label="Render Attached Lights" - name="Render Attached Lights"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderAttachedLights" /> - <menu_item_check.on_click - function="Advanced.HandleAttchedLightParticles" - parameter="RenderAttachedLights" /> - </menu_item_check> - <menu_item_check - label="Render Attached Particles" - name="Render Attached Particles"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderAttachedParticles" /> - <menu_item_check.on_click - function="Advanced.HandleAttchedLightParticles" - parameter="RenderAttachedParticles" /> - </menu_item_check> - <menu_item_check - label="Hover Glow Objects" - name="Hover Glow Objects"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderHighlightEnable" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderHighlightEnable" /> - </menu_item_check> - </menu> - - <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" - parameter="AgentPause" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="AgentPause" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <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_check - label="Velocity Interpolate Objects" - layout="topleft" - name="Velocity Interpolate Objects"> - <menu_item_check.on_check - function="CheckControl" - parameter="VelocityInterpolate" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="VelocityInterpolate" /> - </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" - parameter="PingInterpolate" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="PingInterpolate" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="Drop a Packet" - layout="topleft" - name="Drop a Packet" - shortcut="control|alt|L"> - <menu_item_call.on_click - function="Advanced.DropPacket" /> - </menu_item_call> - </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" - parameter="bumps" /> - </menu_item_call> - - <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" - parameter="start playback" /> - </menu_item_call> - <menu_item_call - label="Stop Playback" - layout="topleft" - name="Stop Playback"> - <menu_item_call.on_click - function="Advanced.AgentPilot" - parameter="stop playback" /> - </menu_item_call> - <menu_item_check - label="Loop Playback" - layout="topleft" - name="Loop Playback"> - <menu_item_check.on_check - function="Advanced.CheckAgentPilotLoop" - parameter="loopPlayback" /> - <menu_item_check.on_click - function="Advanced.ToggleAgentPilotLoop" /> - </menu_item_check> - <menu_item_call - label="Start Record" - layout="topleft" - name="Start Record"> - <menu_item_call.on_click - function="Advanced.AgentPilot" - parameter="start record" /> - </menu_item_call> - <menu_item_call - label="Stop Record" - layout="topleft" - name="Stop Record"> - <menu_item_call.on_click - function="Advanced.AgentPilot" - parameter="stop record" /> - </menu_item_call> - </menu> - - <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" - parameter="SkyOverrideSimSunPosition" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="SkyOverrideSimSunPosition" /> - </menu_item_check> - <menu_item_check - label="Cheesy Beacon" - layout="topleft" - name="Cheesy Beacon"> - <menu_item_check.on_check - function="CheckControl" - parameter="CheesyBeacon" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="CheesyBeacon" /> - </menu_item_check> - <menu_item_check - label="Fixed Weather" - layout="topleft" - name="Fixed Weather"> - <menu_item_check.on_check - function="CheckControl" - parameter="FixedWeather" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="FixedWeather" /> - </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" /> - </menu_item_call> - </menu> - <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" - parameter="BottomPanelNew" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="BottomPanelNew" /> - </menu_item_check>--> - <menu_item_call - label="Web Browser Test" - layout="topleft" - name="Web Browser Test"> - <menu_item_call.on_click - function="Advanced.WebBrowserTest" - parameter="http://secondlife.com/app/search/slurls.html"/> - </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" /> - </menu_item_call> - <menu_item_call - label="Dump Timers" - name="Dump Timers"> - <menu_item_call.on_click - function="Advanced.DumpTimers" /> - </menu_item_call> - <menu_item_call - label="Dump Focus Holder" - layout="topleft" - name="Dump Focus Holder" - shortcut="control|alt|F"> - <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 - function="Advanced.PrintSelectedObjectInfo" /> - </menu_item_call> - <menu_item_call - label="Print Agent Info" - layout="topleft" - name="Print Agent Info" - shortcut="shift|P"> - <menu_item_call.on_click - function="Advanced.PrintAgentInfo" /> - </menu_item_call> - <menu_item_call - label="Memory Stats" - layout="topleft" - name="Memory Stats" - shortcut="control|alt|shift|M"> - <menu_item_call.on_click - function="Advanced.PrintTextureMemoryStats" /> - </menu_item_call> - <menu_item_check - label="Double-ClickAuto-Pilot" - layout="topleft" - name="Double-ClickAuto-Pilot"> - <menu_item_check.on_check - function="CheckControl" - parameter="DoubleClickAutoPilot" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DoubleClickAutoPilot" /> - </menu_item_check> - - <menu_item_separator /> - <menu_item_check - label="Debug SelectMgr" - layout="topleft" - name="Debug SelectMgr"> - <menu_item_check.on_check - function="CheckControl" - parameter="DebugSelectMgr" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DebugSelectMgr" /> - </menu_item_check> - <menu_item_check - label="Debug Clicks" - layout="topleft" - name="Debug Clicks"> - <menu_item_check.on_check - function="Advanced.CheckDebugClicks" - parameter="DebugClicks" /> - <menu_item_check.on_click - function="Advanced.ToggleDebugClicks" - parameter="DebugClicks" /> - </menu_item_check> - <menu_item_check - label="Debug Views" - layout="topleft" - name="Debug Views"> - <menu_item_check.on_check - function="Advanced.CheckDebugViews" /> - <menu_item_check.on_click - function="Advanced.ToggleDebugViews" /> - </menu_item_check> - <menu_item_check - label="Debug Name Tooltips" - layout="topleft" - name="Debug Name Tooltips"> - <menu_item_check.on_check - function="Advanced.CheckXUINameTooltips" - parameter="XUINameTooltips" /> - <menu_item_check.on_click - function="Advanced.ToggleXUINameTooltips" /> - </menu_item_check> - <menu_item_check - label="Debug Mouse Events" - layout="topleft" - name="Debug Mouse Events"> - <menu_item_check.on_check - function="Advanced.CheckDebugMouseEvents" - parameter="MouseEvents" /> - <menu_item_check.on_click - function="Advanced.ToggleDebugMouseEvents" /> - </menu_item_check> - <menu_item_check - label="Debug Keys" - layout="topleft" - name="Debug Keys"> - <menu_item_check.on_check - function="Advanced.CheckDebugKeys" - parameter="DebugKeys" /> - <menu_item_check.on_click - function="Advanced.ToggleDebugKeys" /> - </menu_item_check> - <menu_item_check - label="Debug WindowProc" - layout="topleft" - name="Debug WindowProc"> - <menu_item_check.on_check - function="Advanced.CheckDebugWindowProc" - parameter="DebugWindowProc" /> - <menu_item_check.on_click - function="Advanced.ToggleDebugWindowProc" - parameter="DebugWindowProc" /> - </menu_item_check> - </menu> - <menu - create_jump_keys="true" - label="XUI" - name="XUI" - 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" - parameter="font_test" /> - </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" - parameter="showUIname" /> - <menu_item_check.on_click - function="Advanced.ToggleXUINames" /> - </menu_item_check> - <menu_item_call - label="Send Test IMs" - layout="topleft" - name="Send Test IMs"> - <menu_item_call.on_click - function="Advanced.SendTestIMs" /> - </menu_item_call> - <menu_item_call - label="Test Inspectors" - name="Test Inspectors" - shortcut="control|shift|I"> - <menu_item_call.on_click - function="Floater.Show" - parameter="test_inspectors" /> - </menu_item_call> - </menu> - <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" - parameter="iris" /> - <menu_item_call.on_enable - function="Advanced.EnableGrabBakedTexture" - parameter="iris" /> - </menu_item_call> - <menu_item_call - label="Head" - layout="topleft" - name="Head"> - <menu_item_call.on_click - function="Advanced.GrabBakedTexture" - parameter="head" /> - <menu_item_call.on_enable - function="Advanced.EnableGrabBakedTexture" - parameter="head" /> - </menu_item_call> - <menu_item_call - label="Upper Body" - layout="topleft" - name="Upper Body"> - <menu_item_call.on_click - function="Advanced.GrabBakedTexture" - parameter="upper" /> - <menu_item_call.on_enable - function="Advanced.EnableGrabBakedTexture" - parameter="upper" /> - </menu_item_call> - <menu_item_call - label="Lower Body" - layout="topleft" - name="Lower Body"> - <menu_item_call.on_click - function="Advanced.GrabBakedTexture" - parameter="lower" /> - <menu_item_call.on_enable - function="Advanced.EnableGrabBakedTexture" - parameter="lower" /> - </menu_item_call> - <menu_item_call - label="Skirt" - layout="topleft" - name="Skirt"> - <menu_item_call.on_click - function="Advanced.GrabBakedTexture" - parameter="skirt" /> - <menu_item_call.on_enable - function="Advanced.EnableGrabBakedTexture" - parameter="skirt" /> - </menu_item_call> - </menu> - <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" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </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" - parameter="AllowSelectAvatar" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="AllowSelectAvatar" /> - </menu_item_check> - </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" - parameter="AnimationInfo" /> - <menu_item_check.on_click - function="Advanced.ToggleAnimationInfo" - parameter="" /> - </menu_item_check> - <menu_item_check - label="Slow Motion Animations" - layout="topleft" - name="Slow Motion Animations"> - <menu_item_check.on_check - function="CheckControl" - parameter="SlowMotionAnimation" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="SlowMotionAnimation" /> - </menu_item_check> - <menu_item_check - label="Show Look At" - layout="topleft" - name="Show Look At"> - <menu_item_check.on_check - function="Advanced.CheckShowLookAt" - parameter="ShowLookAt" /> - <menu_item_check.on_click - function="Advanced.ToggleShowLookAt" /> - </menu_item_check> - <menu_item_check - label="Show Point At" - layout="topleft" - name="Show Point At"> - <menu_item_check.on_check - function="Advanced.CheckShowPointAt" - parameter="ShowPointAt" /> - <menu_item_check.on_click - function="Advanced.ToggleShowPointAt" /> - </menu_item_check> - <menu_item_check - label="Debug Joint Updates" - layout="topleft" - name="Debug Joint Updates"> - <menu_item_check.on_check - function="Advanced.CheckDebugJointUpdates" - parameter="DebugJointUpdates" /> - <menu_item_check.on_click - function="Advanced.ToggleDebugJointUpdates" /> - </menu_item_check> - <menu_item_check - label="Disable LOD" - layout="topleft" - name="Disable LOD"> - <menu_item_check.on_check - function="Advanced.CheckDisableLOD" - parameter="DisableLOD" /> - <menu_item_check.on_click - function="Advanced.ToggleDisableLOD" /> - </menu_item_check> - <menu_item_check - label="Debug Character Vis" - layout="topleft" - name="Debug Character Vis"> - <menu_item_check.on_check - function="Advanced.CheckDebugCharacterVis" - parameter="DebugCharacterVis" /> - <menu_item_check.on_click - function="Advanced.ToggleDebugCharacterVis" /> - </menu_item_check> - <menu_item_check - label="Show Collision Skeleton" - layout="topleft" - name="Show Collision Skeleton"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="collision skeleton" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="collision skeleton" /> - </menu_item_check> - <menu_item_check - label="Display Agent Target" - layout="topleft" - name="Display Agent Target"> - <menu_item_check.on_check - function="Advanced.CheckInfoDisplay" - parameter="agent target" /> - <menu_item_check.on_click - function="Advanced.ToggleInfoDisplay" - parameter="agent target" /> - </menu_item_check> -<!-- Appears not to exist anymore - <menu_item_check - label="Debug Rotation" - layout="topleft" - name="Debug Rotation"> - <menu_item_check.on_check - function="CheckControl" - parameter="DebugAvatarRotation" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DebugAvatarRotation" /> - </menu_item_check> --> ---> - <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 - function="Advanced.DebugAvatarTextures" /> - </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_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" - parameter="SaveMinidump" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="SaveMinidump" /> - </menu_item_check> - <menu_item_check - label="Console Window on next Run" - layout="topleft" - name="Console Window"> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowConsoleWindow" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowConsoleWindow" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_check - label="Show Admin Menu" - layout="topleft" - name="View Admin Options"> - <menu_item_check.on_check - function="Advanced.CheckViewAdminOptions" - parameter="ViewAdminOptions" /> - <menu_item_check.on_click - function="Advanced.ToggleViewAdminOptions" /> - </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 - function="Advanced.RequestAdminStatus" /> - </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 - function="Advanced.LeaveAdminStatus" /> - </menu_item_call> - </menu> - <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 - function="Admin.ForceTakeCopy" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </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" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - <menu_item_call - label="Force Owner Permissive" - layout="topleft" - name="Force Owner Permissive"> - <menu_item_call.on_click - function="Admin.HandleObjectOwnerPermissive" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - <menu_item_call - label="Delete" - layout="topleft" - name="Delete" - shortcut="control|alt|shift|Del"> - <menu_item_call.on_click - function="Admin.HandleForceDelete" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - <menu_item_call - label="Lock" - layout="topleft" - name="Lock" - shortcut="control|alt|shift|L"> - <menu_item_call.on_click - function="Admin.HandleObjectLock" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </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 - function="Admin.HandleObjectAssetIDs" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - </menu> - <menu - create_jump_keys="true" - label="Parcel" - layout="topleft" - name="Parcel" - tear_off="true"> - <menu_item_call - label="Owner To Me" - layout="topleft" - name="Owner To Me"> - <menu_item_call.on_click - function="Admin.HandleForceParcelOwnerToMe" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </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 - function="Admin.HandleForceParcelToContent" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - <menu_item_call - label="Claim Public Land" - layout="topleft" - name="Claim Public Land"> - <menu_item_call.on_click - function="Admin.HandleClaimPublicLand" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - </menu> - <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" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - <menu_item_call - label="Save Region State" - layout="topleft" - name="Save Region State"> - <menu_item_call.on_click - function="Admin.OnSaveState" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - </menu> - <menu_item_call - label="God Tools" - layout="topleft" - name="God Tools"> - <menu_item_call.on_click - function="Floater.Show" - parameter="god_tools" /> - <menu_item_call.on_enable - function="IsGodCustomerService" /> - </menu_item_call> - </menu> - <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" - parameter="shirt" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="shirt" /> - </menu_item_call> - <menu_item_call - label="Pants" - layout="topleft" - name="Pants"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="pants" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="pants" /> - </menu_item_call> - <menu_item_call - label="Shoes" - layout="topleft" - name="Shoes"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="shoes" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="shoes" /> - </menu_item_call> - <menu_item_call - label="Socks" - layout="topleft" - name="Socks"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="socks" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="socks" /> - </menu_item_call> - <menu_item_call - label="Jacket" - layout="topleft" - name="Jacket"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="jacket" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="jacket" /> - </menu_item_call> - <menu_item_call - label="Gloves" - layout="topleft" - name="Gloves"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="gloves" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="gloves" /> - </menu_item_call> - <menu_item_call - label="Undershirt" - layout="topleft" - name="Menu Undershirt"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="undershirt" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="undershirt" /> - </menu_item_call> - <menu_item_call - label="Underpants" - layout="topleft" - name="Menu Underpants"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="underpants" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="underpants" /> - </menu_item_call> - <menu_item_call - label="Skirt" - layout="topleft" - name="Skirt"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="skirt" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="skirt" /> - </menu_item_call> - <menu_item_call - label="Alpha" - layout="topleft" - name="Alpha"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="alpha" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="alpha" /> - </menu_item_call> - <menu_item_call - label="Tattoo" - layout="topleft" - name="Tattoo"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="tattoo" /> - <menu_item_call.on_enable - function="Edit.EnableTakeOff" - parameter="tattoo" /> - </menu_item_call> - <menu_item_call - label="All Clothes" - layout="topleft" - name="All Clothes"> - <menu_item_call.on_click - function="Edit.TakeOff" - parameter="all" /> - </menu_item_call> - </menu> - <menu_item_check - label="Show Toolbar" - layout="topleft" - name="Show Toolbar"> - <menu_item_check.on_check - function="FloaterVisible" - parameter="toolbar" /> - <menu_item_check.on_click - function="ShowFloater" - parameter="toolbar" /> - </menu_item_check> - <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" - name="OfficialLindenBlog_url" - parameter="WebLaunchSupportWiki,http://blog.secondlife.com/" /> - </menu_item_call> - <menu_item_call - label="Scripting Portal" - layout="topleft" - name="Scripting Portal"> - <menu_item_call.on_click - function="PromptShowURL" - name="ScriptingPortal_url" - parameter="WebLaunchLSLWiki,http://wiki.secondlife.com/wiki/LSL_Portal" /> - </menu_item_call> - <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" - name="PublicIssueTracker_url" - parameter="WebLaunchPublicIssue,http://jira.secondlife.com" /> - </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_call - label="Bug Reporting 101" - layout="topleft" - name="Bug Reporing 101"> - <menu_item_call.on_click - function="PromptShowURL" - name="BugReporting101_url" - parameter="WebLaunchBugReport101,http://wiki.secondlife.com/wiki/Bug_Reporting_101" /> - </menu_item_call> - <menu_item_call - label="Security Issues" - layout="topleft" - name="Security Issues"> - <menu_item_call.on_click - function="PromptShowURL" - name="SecurityIssues_url" - parameter="WebLaunchSecurityIssues,http://wiki.secondlife.com/wiki/Security_issues" /> - </menu_item_call> - <menu_item_call - label="QA Wiki" - layout="topleft" - name="QA Wiki"> - <menu_item_call.on_click - function="PromptShowURL" - name="QAWiki_url" - parameter="WebLaunchQAWiki,http://wiki.secondlife.com/wiki/QA_Portal" /> - </menu_item_call> - </menu> - </menu> - </menu> -</menu_bar> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<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 + function="Floater.Show" + parameter="preferences" /> + </menu_item_call> + <menu_item_call + label="My Dashboard" + layout="topleft" + name="Manage My Account"> + <menu_item_call.on_click + function="PromptShowURL" + name="ManageMyAccount_url" + parameter="WebLaunchJoinNow,http://secondlife.com/account/" /> + </menu_item_call> + <menu_item_call + label="Buy L$" + layout="topleft" + name="Buy and Sell L$"> + <menu_item_call.on_click + function="ShowFloater" + parameter="buy currency" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <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"> + <menu_item_call.on_click + function="ShowFloater" + parameter="appearance" /> + <menu_item_call.on_enable + function="Edit.EnableCustomizeAvatar" /> + </menu_item_call> + <menu_item_check + label="My Inventory" + layout="topleft" + name="Inventory" + shortcut="control|shift|I"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="inventory" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="inventory" /> + </menu_item_check> + <menu_item_call + label="Show Sidetray Inventory" + name="ShowSidetrayInventory" + shortcut="control|I" + visible="false"> + <menu_item_call.on_click + function="ShowSidetrayPanel" + parameter="sidepanel_inventory" /> + </menu_item_call> + <menu_item_call + label="My Gestures" + layout="topleft" + name="Gestures" + shortcut="control|G"> + <menu_item_call.on_click + function="ShowFloater" + parameter="gestures" /> + </menu_item_call> + <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"/> + </menu_item_call> + </menu> + <menu_item_call + label="Request Admin Status" + layout="topleft" + name="Request Admin Options" + shortcut="control|alt|G" + visible="false"> + <menu_item_call.on_click + function="Advanced.RequestAdminStatus" /> + </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_call + label="Quit [APP_NAME]" + layout="topleft" + name="Quit" + shortcut="control|Q"> + <menu_item_call.on_click + function="File.Quit" /> + </menu_item_call> + </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 + function="SideTray.PanelPeopleTab" + parameter="friends_panel" /> + </menu_item_call> + <menu_item_call + label="My Groups" + layout="topleft" + name="My Groups"> + <menu_item_call.on_click + function="SideTray.PanelPeopleTab" + parameter="groups_panel" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <!--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"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="nearby_chat" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="nearby_chat" /> + </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_item_check + label="Block List" + layout="topleft" + name="Mute List"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="mute" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="mute" /> + </menu_item_check--> + <menu_item_separator + layout="topleft" /> + <menu_item_check + label="(Legacy) Communicate" + layout="topleft" + name="Instant Message" + shortcut="control|T"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="communicate" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="communicate" /> + </menu_item_check> + <menu_item_call + label="(Temp) Media Remote Ctrl" + layout="topleft" + name="Preferences" + shortcut="control|alt|M"> + <menu_item_call.on_click + function="Floater.Toggle" + parameter="media_remote_ctrl" /> + </menu_item_call> + </menu> + <menu + label="World" + layout="topleft" + name="World" + tear_off="true"> + <menu_item_check + label="Move" + 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" /> + </menu_item_check> + <menu_item_check + label="View" + 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" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="About Land" + layout="topleft" + name="About Land"> + <menu_item_call.on_click + function="Floater.Show" + parameter="about_land" /> + </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_item_call + label="Buy Land" + layout="topleft" + name="Buy Land"> + <menu_item_call.on_click + function="ShowFloater" + parameter="buy land" /> + <menu_item_call.on_enable + function="World.EnableBuyLand" /> + </menu_item_call> + <menu_item_call + label="My Land" + layout="topleft" + name="My Land"> + <menu_item_call.on_click + function="ShowFloater" + parameter="land_holdings" /> + </menu_item_call> + <menu + create_jump_keys="true" + label="Show" + layout="topleft" + name="Land" + tear_off="true"> + <menu_item_check + label="Ban Lines" + layout="topleft" + name="Ban Lines"> + <menu_item_check.on_check + control="ShowBanLines" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowBanLines" /> + </menu_item_check> + <menu_item_check + label="Beacons" + layout="topleft" + name="beacons" + shortcut="control|alt|shift|N"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="beacons" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="beacons" /> + </menu_item_check> + <menu_item_check + label="Property Lines" + layout="topleft" + name="Property Lines" + shortcut="control|alt|shift|P"> + <menu_item_check.on_check + control="ShowPropertyLines" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowPropertyLines" /> + </menu_item_check> + <menu_item_check + label="Land Owners" + layout="topleft" + name="Land Owners"> + <menu_item_check.on_check + control="ShowParcelOwners" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowParcelOwners" /> + </menu_item_check> + </menu> + <menu_item_separator + layout="topleft" /> + <menu + label="Landmarks" + layout="topleft" + name="Landmarks" + tear_off="true"> + <menu_item_call + label="Create Landmark Here" + layout="topleft" + name="Create Landmark Here"> + <menu_item_call.on_click + function="World.CreateLandmark" /> + <menu_item_call.on_enable + function="World.EnableCreateLandmark" /> + </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" /> + <menu_item_call.on_enable + function="World.EnableSetHomeLocation" /> + </menu_item_call> + <menu_item_call + label="Teleport Home" + layout="topleft" + name="Teleport Home" + shortcut="control|shift|H"> + <menu_item_call.on_click + function="World.TeleportHome" /> + <menu_item_call.on_enable + function="World.EnableTeleportHome" /> + </menu_item_call> + </menu> + <menu_item_check + label="Mini-Map" + layout="topleft" + name="Mini-Map" + shortcut="control|shift|M"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="mini_map" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="mini_map" /> + </menu_item_check> + <menu_item_check + label="World Map" + layout="topleft" + name="World Map" + shortcut="control|M" + use_mac_ctrl="true"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="world_map" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="world_map" /> + </menu_item_check> + <!-- <menu_item_check + label="Show Navigation Bar" + layout="topleft" + name="ShowNavbarNavigationPanel"> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowNavbarNavigationPanel" /> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowNavbarNavigationPanel" /> + </menu_item_check> + <menu_item_check + label="Show Favorites Bar" + layout="topleft" + name="ShowNavbarFavoritesPanel"> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowNavbarFavoritesPanel" /> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowNavbarFavoritesPanel" /> + </menu_item_check> + <menu_item_separator + layout="topleft" />--> + <menu_item_call + label="Snapshot" + layout="topleft" + name="Take Snapshot" + shortcut="control|shift|S"> + <menu_item_call.on_click + function="Floater.Show" + parameter="snapshot" /> + </menu_item_call> + <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" + parameter="sunrise" /> + </menu_item_call> + <menu_item_call + label="Midday" + layout="topleft" + name="Noon" + shortcut="control|shift|Y"> + <menu_item_call.on_click + function="World.EnvSettings" + parameter="noon" /> + </menu_item_call> + <menu_item_call + label="Sunset" + layout="topleft" + name="Sunset" + shortcut="control|shift|N"> + <menu_item_call.on_click + function="World.EnvSettings" + parameter="sunset" /> + </menu_item_call> + <menu_item_call + label="Midnight" + layout="topleft" + name="Midnight"> + <menu_item_call.on_click + function="World.EnvSettings" + parameter="midnight" /> + </menu_item_call> + <menu_item_call + label="Use the 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_call + label="Environment Editor" + layout="topleft" + name="Environment Editor"> + <menu_item_call.on_click + function="World.EnvSettings" + parameter="editor" /> + </menu_item_call> + </menu> + </menu> + <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 + function="Build.Active" /> + <menu_item_check.on_click + function="Build.Toggle" /> + <menu_item_check.on_enable + function="Build.Enabled" /> + </menu_item_check> + <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 + function="Tools.SelectTool" + parameter="focus" /> + </menu_item_call> + <menu_item_call + label="Move Tool" + layout="topleft" + name="Move" + shortcut="control|2"> + <menu_item_call.on_click + function="Tools.SelectTool" + parameter="move" /> + </menu_item_call> + <menu_item_call + label="Edit Tool" + layout="topleft" + name="Edit" + shortcut="control|3"> + <menu_item_call.on_click + function="Tools.SelectTool" + parameter="edit" /> + </menu_item_call> + <menu_item_call + label="Create Tool" + layout="topleft" + name="Create" + shortcut="control|4"> + <menu_item_call.on_click + function="Tools.SelectTool" + parameter="create" /> + </menu_item_call> + <menu_item_call + label="Land Tool" + layout="topleft" + name="Land" + shortcut="control|5"> + <menu_item_call.on_click + function="Tools.SelectTool" + 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 + function="Tools.Link" /> + <menu_item_call.on_enable + function="Tools.EnableLink" /> + </menu_item_call> + <menu_item_call + label="Unlink" + layout="topleft" + name="Unlink" + shortcut="control|shift|L"> + <menu_item_call.on_click + function="Tools.Unlink" /> + <menu_item_call.on_enable + function="Tools.EnableUnlink" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Focus on Selection" + layout="topleft" + name="Focus on Selection" + shortcut="H"> + <menu_item_call.on_click + function="Tools.LookAtSelection" + parameter="focus" /> + <menu_item_call.on_enable + function="Tools.SomethingSelectedNoHUD" /> + </menu_item_call> + <menu_item_call + label="Zoom to Selection" + layout="topleft" + name="Zoom to Selection" + shortcut="shift|H"> + <menu_item_call.on_click + function="Tools.LookAtSelection" + parameter="zoom" /> + <menu_item_call.on_enable + function="Tools.SomethingSelectedNoHUD" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <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" /> + </menu_item_call> + <menu_item_call + label="Take Copy" + layout="topleft" + name="Take Copy"> + <menu_item_call.on_click + function="Tools.TakeCopy" /> + <menu_item_call.on_enable + function="Tools.EnableTakeCopy" /> + </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" /> + <menu_item_call.on_enable + function="Tools.EnableSaveToInventory" /> + </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" /> + <menu_item_call.on_enable + function="Tools.EnableSaveToObjectInventory" /> + </menu_item_call> + </menu> + <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" + parameter="compile mono" /> + <menu_item_call.on_enable + function="EditableSelectedMono" /> + </menu_item_call> + <menu_item_call + label="Recompile Scripts (LSL)" + layout="topleft" + name="LSL"> + <menu_item_call.on_click + function="Tools.SelectedScriptAction" + parameter="compile lsl" /> + <menu_item_call.on_enable + function="EditableSelected" /> + </menu_item_call> + <menu_item_call + label="Reset Scripts" + layout="topleft" + name="Reset Scripts"> + <menu_item_call.on_click + function="Tools.SelectedScriptAction" + parameter="reset" /> + <menu_item_call.on_enable + function="EditableSelected" /> + </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" + parameter="start" /> + <menu_item_call.on_enable + function="EditableSelected" /> + </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" + parameter="stop" /> + <menu_item_call.on_enable + function="EditableSelected" /> + </menu_item_call> + </menu> + <menu_item_separator + layout="topleft" /> + <menu + create_jump_keys="true" + label="Options" + layout="topleft" + name="Options" + tear_off="true"> + <menu_item_check + label="Edit Linked Parts" + layout="topleft" + name="Edit Linked Parts"> + <menu_item_check.on_check + control="EditLinkedParts" /> + <menu_item_check.on_click + function="Tools.EditLinkedParts" + parameter="EditLinkedParts" /> + <menu_item_check.on_enable + function="Tools.EnableToolNotPie" /> + </menu_item_check> + <menu_item_call + label="Set Default Upload Permissions" + layout="topleft" + name="perm prefs"> + <menu_item_call.on_click + function="Floater.Toggle" + parameter="perm_prefs" /> + </menu_item_call> + <menu_item_check + label="Show Advanced Permissions" + layout="topleft" + name="DebugPermissions"> + <menu_item_check.on_check + function="CheckControl" + parameter="DebugPermissions" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugPermissions" /> + </menu_item_check> + <!--menu_item_call + label="Show Script Warning/Error Window" + layout="topleft" + name="Show Script Warning/Error Window"> + <menu_item_call.on_click + function="ShowFloater" + parameter="script errors" /> + </menu_item_call--> + <menu_item_separator + layout="topleft" /> + <menu + create_jump_keys="true" + label="Selection" + layout="topleft" + name="Selection" + tear_off="true"> + <menu_item_check + label="Select Only My Objects" + layout="topleft" + name="Select Only My Objects"> + <menu_item_check.on_check + control="SelectOwnedOnly" /> + <menu_item_check.on_click + function="Tools.SelectOnlyMyObjects" + parameter="agents" /> + </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" /> + <menu_item_check.on_click + function="Tools.SelectOnlyMovableObjects" + parameter="movable" /> + </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> + <menu + create_jump_keys="true" + label="Show" + layout="topleft" + name="Show" + tear_off="true"> + <menu_item_check + label="Show Hidden Selection" + layout="topleft" + name="Show Hidden Selection"> + <menu_item_check.on_check + control="RenderHiddenSelections" /> + <menu_item_check.on_click + function="Tools.ShowHiddenSelection" /> + </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" /> + <menu_item_check.on_click + function="Tools.ShowSelectionLightRadius" /> + </menu_item_check> + <menu_item_check + label="Show Selection Beam" + layout="topleft" + name="Show Selection Beam"> + <menu_item_check.on_check + control="ShowSelectionBeam" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowSelectionBeam" /> + </menu_item_check> + </menu> + <menu + create_jump_keys="true" + label="Grid" + layout="topleft" + name="Grid" + tear_off="true"> + <menu_item_check + label="Snap to Grid" + layout="topleft" + name="Snap to Grid" + shortcut="G"> + <menu_item_check.on_check + control="SnapEnabled" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="SnapEnabled" /> + <menu_item_check.on_enable + function="Tools.EnableToolNotPie" /> + </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 + function="Tools.SnapObjectXY" /> + <menu_item_call.on_enable + function="Tools.EnableToolNotPie" /> + </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 + function="Tools.UseSelectionForGrid" /> + <menu_item_call.on_enable + function="SomethingSelected" /> + </menu_item_call> + <menu_item_call + label="Grid Options" + layout="topleft" + name="Grid Options" + shortcut="control|shift|B"> + <menu_item_call.on_click + function="Floater.Show" + parameter="build_options" /> + <menu_item_call.on_enable + function="Tools.EnableToolNotPie" /> + </menu_item_call> + </menu> + </menu> + <menu + create_jump_keys="true" + label="Select Linked Parts" + layout="topleft" + name="Select Linked Parts" + tear_off="true"> + <menu_item_call + label="Select Next Part" + layout="topleft" + 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" + layout="topleft" + 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" + layout="topleft" + 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" + layout="topleft" + 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> + <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="ShowFloater" + parameter="help f1" /> + </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_call + label="Report Abuse" + layout="topleft" + name="Report Abuse"> + <menu_item_call.on_click + function="ShowFloater" + parameter="complaint reporter" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="About [APP_NAME]" + layout="topleft" + name="About Second Life"> + <menu_item_call.on_click + function="Floater.Show" + parameter="sl_about" /> + </menu_item_call> + </menu> + <menu + label="Advanced" + layout="topleft" + name="Advanced" + tear_off="true" + visible="false"> + <menu_item_check + label="Set Away After 30 Minutes" + layout="topleft" + name="Go Away/AFK When Idle"> + <menu_item_check.on_check + function="CheckControl" + parameter="AllowIdleAFK" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="AllowIdleAFK" /> + </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 + function="Advanced.RebakeTextures" /> + </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/> + <menu_item_check + label="Limit Select Distance" + layout="topleft" + name="Limit Select Distance"> + <menu_item_check.on_check + function="CheckControl" + parameter="LimitSelectDistance" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="LimitSelectDistance" /> + </menu_item_check> + <menu_item_check + label="Disable Camera Constraints" + layout="topleft" + name="Disable Camera Distance"> + <menu_item_check.on_check + function="CheckControl" + parameter="DisableCameraConstraints" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DisableCameraConstraints" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_check + label="High-res Snapshot" + layout="topleft" + name="HighResSnapshot"> + <menu_item_check.on_check + function="CheckControl" + parameter="HighResSnapshot" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="HighResSnapshot" /> + </menu_item_check> + <menu_item_check + label="Quiet Snapshots to Disk" + layout="topleft" + name="QuietSnapshotsToDisk"> + <menu_item_check.on_check + function="CheckControl" + parameter="QuietSnapshotsToDisk" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="QuietSnapshotsToDisk" /> + </menu_item_check> + <menu_item_check + label="Compress Snapshots to Disk" + layout="topleft" + name="CompressSnapshotsToDisk"> + <menu_item_check.on_check + function="CheckControl" + parameter="CompressSnapshotsToDisk" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="CompressSnapshotsToDisk" /> + </menu_item_check> + <menu_item_call + label="Save Texture As" + layout="topleft" + name="Save Texture As"> + <menu_item_call.on_click + function="File.SaveTexture" /> + <menu_item_call.on_enable + function="File.EnableSaveAs" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <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" + parameter="lagmeter" /> + </menu_item_call> + <menu_item_check + label="Statistics Bar" + layout="topleft" + name="Statistics Bar" + shortcut="control|shift|1"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="stats" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="stats" /> + </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" + parameter="shame" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="shame" /> + </menu_item_check> + </menu> + <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" + parameter="CheesyBeacon" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="CheesyBeacon" /> + </menu_item_check> + <menu_item_check + label="Hide Particles" + layout="topleft" + name="Hide Particles" + shortcut="control|alt|shift|="> + <menu_item_check.on_check + function="View.CheckRenderType" + parameter="hideparticles" /> + <menu_item_check.on_click + function="View.ToggleRenderType" + parameter="hideparticles" /> + </menu_item_check> + <menu_item_check + label="Hide Selected" + layout="topleft" + name="Hide Selected"> + <menu_item_check.on_check + function="CheckControl" + parameter="HideSelectedObjects" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="HideSelectedObjects" /> + </menu_item_check> + <menu_item_check + label="Highlight Transparent" + layout="topleft" + name="Highlight Transparent" + shortcut="control|alt|T"> + <menu_item_check.on_check + function="View.CheckHighlightTransparent" /> + <menu_item_check.on_click + function="View.HighlightTransparent" /> + </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 + function="View.CheckHUDAttachments" /> + <menu_item_check.on_click + function="View.ShowHUDAttachments" /> + </menu_item_check> + <menu_item_check + label="Show Mouselook Crosshairs" + layout="topleft" + name="ShowCrosshairs"> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowCrosshairs" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowCrosshairs" /> + </menu_item_check> + <!-- <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 + function="View.CheckShowHoverTips" /> + <menu_item_check.on_click + function="View.ShowHoverTips" /> + </menu_item_check> + <menu_item_separator + layout="topleft" />--> + <menu_item_check + label="Show Land Tooltips" + layout="topleft" + name="Land Tips"> + <menu_item_check.on_check + control="ShowLandHoverTip" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowLandHoverTip" /> + <menu_item_check.on_enable + function="View.CheckShowHoverTips" /> + </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" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowAllObjectHoverTip" /> + <menu_item_check.on_enable + function="View.CheckShowHoverTips" /> + </menu_item_check> + </menu>--> + + </menu> + + <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 + function="Advanced.CheckRenderType" + parameter="simple" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="simple" /> + </menu_item_check> + <menu_item_check + label="Alpha" + layout="topleft" + name="Alpha" + shortcut="control|alt|shift|2"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="alpha" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="alpha" /> + </menu_item_check> + <menu_item_check + label="Tree" + layout="topleft" + name="Tree" + shortcut="control|alt|shift|3"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="tree" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="tree" /> + </menu_item_check> + <menu_item_check + label="Avatars" + layout="topleft" + name="Character" + shortcut="control|alt|shift|4"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="character" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="character" /> + </menu_item_check> + <menu_item_check + label="SurfacePath" + layout="topleft" + name="SurfacePath" + shortcut="control|alt|shift|5"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="surfacePath" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="surfacePath" /> + </menu_item_check> + <menu_item_check + label="Sky" + layout="topleft" + name="Sky" + shortcut="control|alt|shift|6"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="sky" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="sky" /> + </menu_item_check> + <menu_item_check + label="Water" + layout="topleft" + name="Water" + shortcut="control|alt|shift|7"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="water" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="water" /> + </menu_item_check> + <menu_item_check + label="Ground" + layout="topleft" + name="Ground" + shortcut="control|alt|shift|8"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="ground" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="ground" /> + </menu_item_check> + <menu_item_check + label="Volume" + layout="topleft" + name="Volume" + shortcut="control|alt|shift|9"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="volume" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="volume" /> + </menu_item_check> + <menu_item_check + label="Grass" + layout="topleft" + name="Grass" + shortcut="control|alt|shift|0"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="grass" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="grass" /> + </menu_item_check> + <menu_item_check + label="Clouds" + layout="topleft" + name="Clouds" + shortcut="control|alt|shift|-"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="clouds" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="clouds" /> + </menu_item_check> + <menu_item_check + label="Particles" + layout="topleft" + name="Particles" + shortcut="control|alt|shift|="> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="particles" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="particles" /> + </menu_item_check> + <menu_item_check + label="Bump" + layout="topleft" + name="Bump" + shortcut="control|alt|shift|\"> + <menu_item_check.on_check + function="Advanced.CheckRenderType" + parameter="bump" /> + <menu_item_check.on_click + function="Advanced.ToggleRenderType" + parameter="bump" /> + </menu_item_check> + </menu> + <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 + function="Advanced.CheckFeature" + parameter="ui" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="ui" /> + </menu_item_check> + <menu_item_check + label="Selected" + layout="topleft" + name="Selected" + shortcut="control|alt|F2"> + <menu_item_check.on_check + function="Advanced.CheckFeature" + parameter="selected" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="selected" /> + </menu_item_check> + <menu_item_check + label="Highlighted" + layout="topleft" + name="Highlighted" + shortcut="control|alt|F3"> + <menu_item_check.on_check + function="Advanced.CheckFeature" + parameter="highlighted" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="highlighted" /> + </menu_item_check> + <menu_item_check + label="Dynamic Textures" + layout="topleft" + name="Dynamic Textures" + shortcut="control|alt|F4"> + <menu_item_check.on_check + function="Advanced.CheckFeature" + parameter="dynamic textures" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="dynamic textures" /> + </menu_item_check> + <menu_item_check + label="Foot Shadows" + layout="topleft" + name="Foot Shadows" + shortcut="control|alt|F5"> + <menu_item_check.on_check + function="Advanced.CheckFeature" + parameter="foot shadows" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="foot shadows" /> + </menu_item_check> + <menu_item_check + label="Fog" + layout="topleft" + name="Fog" + shortcut="control|alt|F6"> + <menu_item_check.on_check + function="Advanced.CheckFeature" + parameter="fog" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="fog" /> + </menu_item_check> + <menu_item_check + label="Test FRInfo" + layout="topleft" + name="Test FRInfo" + shortcut="control|alt|F8"> + <menu_item_check.on_check + function="Advanced.CheckFeature" + parameter="fr info" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="fr info" /> + </menu_item_check> + <menu_item_check + label="Flexible Objects" + layout="topleft" + name="Flexible Objects" + shortcut="control|alt|F9"> + <menu_item_check.on_check + function="Advanced.CheckFeature" + parameter="flexible" /> + <menu_item_check.on_click + function="Advanced.ToggleFeature" + parameter="flexible" /> + </menu_item_check> + </menu> + <menu_item_check + label="Run Multiple Threads" + layout="topleft" + name="Run Multiple Threads"> + <menu_item_check.on_check + function="CheckControl" + parameter="RunMultipleThreads" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RunMultipleThreads" /> + </menu_item_check> + <menu_item_call + label="Clear Group Cache" + layout="topleft" + name="ClearGroupCache"> + <menu_item_call.on_click + function="Advanced.ClearGroupCache" + parameter="ClearGroupCache" /> + </menu_item_call> + <menu_item_check + label="Mouse Smoothing" + layout="topleft" + name="Mouse Smoothing"> + <menu_item_check.on_check + function="CheckControl" + parameter="MouseSmooth" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="MouseSmooth" /> + </menu_item_check> + <menu_item_check + label="Show IMs in Nearby Chat" + layout="topleft" + name="IMInChat"> + <menu_item_check.on_check + function="CheckControl" + parameter="IMInChat" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="IMInChat" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu + label="Shortcuts" + layout="topleft" + name="Shortcuts" + tear_off="true" + visible="false"> + <menu_item_check + label="Search" + layout="topleft" + name="Search" + shortcut="control|F"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="search" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="search" /> + </menu_item_check> + <menu_item_call + enabled="false" + label="Release Keys" + layout="topleft" + name="Release Keys"> + <menu_item_call.on_click + function="Tools.ReleaseKeys" + parameter="" /> + <menu_item_call.on_enable + function="Tools.EnableReleaseKeys" + parameter="" /> + </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" /> + <menu_item_check + label="Always Run" + layout="topleft" + name="Always Run" + shortcut="control|R"> + <menu_item_check.on_check + function="World.CheckAlwaysRun" /> + <menu_item_check.on_click + function="World.AlwaysRun" /> + </menu_item_check> + <menu_item_check + label="Fly" + layout="topleft" + name="Fly" + shortcut="Home"> + <menu_item_check.on_click + function="Agent.toggleFlying" /> + <menu_item_check.on_enable + function="Agent.enableFlying" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Close Window" + layout="topleft" + name="Close Window" + shortcut="control|W"> + <menu_item_call.on_click + function="File.CloseWindow" /> + <menu_item_call.on_enable + function="File.EnableCloseWindow" /> + </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 + function="File.CloseAllWindows" /> + <menu_item_call.on_enable + function="File.EnableCloseAllWindows" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <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_call + label="Mouselook" + layout="topleft" + name="Mouselook" + shortcut="M"> + <menu_item_call.on_click + function="View.Mouselook" /> + <menu_item_call.on_enable + function="View.EnableMouselook" /> + </menu_item_call> + <menu_item_check + label="Joystick Flycam" + layout="topleft" + name="Joystick Flycam" + shortcut="alt|shift|F"> + <menu_item_check.on_check + function="View.CheckJoystickFlycam" /> + <menu_item_check.on_click + function="View.JoystickFlycam" /> + <menu_item_check.on_enable + function="View.EnableJoystickFlycam" /> + </menu_item_check> + <menu_item_call + label="Reset View" + layout="topleft" + name="Reset View" + shortcut="Esc"> + <menu_item_call.on_click + function="View.ResetView" /> + </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 + function="View.LookAtLastChatter" /> + <menu_item_call.on_enable + function="View.EnableLastChatter" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <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 + function="Tools.SelectTool" + parameter="focus" /> + </menu_item_call> + <menu_item_call + label="Move Tool" + layout="topleft" + name="Move" + shortcut="control|2"> + <menu_item_call.on_click + function="Tools.SelectTool" + parameter="move" /> + </menu_item_call> + <menu_item_call + label="Edit Tool" + layout="topleft" + name="Edit" + shortcut="control|3"> + <menu_item_call.on_click + function="Tools.SelectTool" + parameter="edit" /> + </menu_item_call> + <menu_item_call + label="Create Tool" + layout="topleft" + name="Create" + shortcut="control|4"> + <menu_item_call.on_click + function="Tools.SelectTool" + parameter="create" /> + </menu_item_call> + <menu_item_call + label="Land Tool" + layout="topleft" + name="Land" + shortcut="control|5"> + <menu_item_call.on_click + function="Tools.SelectTool" + parameter="land" /> + </menu_item_call> + </menu> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Zoom In" + layout="topleft" + name="Zoom In" + shortcut="control|0"> + <menu_item_call.on_click + function="View.ZoomIn" /> + </menu_item_call> + <menu_item_call + label="Zoom Default" + layout="topleft" + name="Zoom Default" + shortcut="control|9"> + <menu_item_call.on_click + function="View.ZoomDefault" /> + </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_call + label="Show Debug Settings" + layout="topleft" + name="Debug Settings"> + <menu_item_call.on_click + function="Advanced.ShowDebugSettings" + parameter="all" /> + </menu_item_call> + <menu_item_check + label="Show Develop Menu" + layout="topleft" + name="Debug Mode" + shortcut="control|alt|Q"> + <menu_item_check.on_check + function="CheckControl" + parameter="QAMode" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="QAMode" /> + </menu_item_check> + </menu> + <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"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="texture" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="texture" /> + </menu_item_check> + <menu_item_check + label="Debug Console" + layout="topleft" + name="Debug Console" + shortcut="control|shift|4" + use_mac_ctrl="true"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="debug" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="debug" /> + </menu_item_check> + <menu_item_call + label="Notifications Console" + layout="topleft" + name="Notifications" + shortcut="control|shift|5"> + <menu_item_call.on_click + function="Floater.Toggle" + parameter="notifications_console" /> + </menu_item_call> + <menu_item_check + label="Texture Size Console" + layout="topleft" + name="Texture Size" + shortcut="control|shift|6"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="texture size" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="texture size" /> + </menu_item_check> + <menu_item_check + label="Texture Category Console" + layout="topleft" + name="Texture Category" + shortcut="control|shift|7"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="texture category" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="texture category" /> + </menu_item_check> + <menu_item_check + label="Fast Timers" + layout="topleft" + name="Fast Timers" + shortcut="control|shift|9" + use_mac_ctrl="true"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="fast timers" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="fast timers" /> + </menu_item_check> + <menu_item_check + label="Memory" + layout="topleft" + name="Memory" + shortcut="control|shift|0" + use_mac_ctrl="true"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="memory view" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="memory view" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <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" + parameter="region" /> + </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" + parameter="group" /> + </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_check + label="Camera" + layout="topleft" + name="Camera"> + <menu_item_check.on_check + function="Advanced.CheckHUDInfo" + parameter="camera" /> + <menu_item_check.on_click + function="Advanced.ToggleHUDInfo" + parameter="camera" /> + </menu_item_check> + <menu_item_check + label="Wind" + layout="topleft" + name="Wind"> + <menu_item_check.on_check + function="Advanced.CheckHUDInfo" + parameter="wind" /> + <menu_item_check.on_click + function="Advanced.ToggleHUDInfo" + parameter="wind" /> + </menu_item_check> + <menu_item_check + label="FOV" + layout="topleft" + name="FOV"> + <menu_item_check.on_check + function="Advanced.CheckHUDInfo" + parameter="fov" /> + <menu_item_check.on_click + function="Advanced.ToggleHUDInfo" + parameter="fov" /> + </menu_item_check> + </menu> + <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" + parameter="DebugShowTime" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugShowTime" /> + </menu_item_check> + <menu_item_check + label="Show Render Info" + layout="topleft" + name="Show Render Info"> + <menu_item_check.on_check + function="CheckControl" + parameter="DebugShowRenderInfo" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugShowRenderInfo" /> + </menu_item_check> + <menu_item_check + label="Show Matrices" + layout="topleft" + name="Show Matrices"> + <menu_item_check.on_check + function="CheckControl" + parameter="DebugShowRenderMatrices" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugShowRenderMatrices" /> + </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" + parameter="DebugShowColor" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugShowColor" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_check + label="Show Updates to Objects" + layout="topleft" + name="Show Updates" + shortcut="control|alt|shift|U"> + <menu_item_check.on_check + function="Advanced.CheckShowObjectUpdates" + parameter="ObjectUpdates" /> + <menu_item_check.on_click + function="Advanced.ToggleShowObjectUpdates" /> + </menu_item_check> + </menu> + <menu_item_separator + layout="topleft" /> + <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 + function="Advanced.ForceErrorBreakpoint" /> + </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" + parameter="mem_leaking" /> + </menu_item_call> + </menu> + <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" + parameter="CameraOffset" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="CameraOffset" /> + </menu_item_check> + <menu_item_check + label="Randomize Framerate" + layout="topleft" + name="Randomize Framerate"> + <menu_item_check.on_check + function="Advanced.CheckRandomizeFramerate" + parameter="Randomize Framerate" /> + <menu_item_check.on_click + function="Advanced.ToggleRandomizeFramerate" /> + </menu_item_check> + <menu_item_check + label="Periodic Slow Frame" + layout="topleft" + name="Periodic Slow Frame"> + <menu_item_check.on_check + function="Advanced.CheckPeriodicSlowFrame" + parameter="points" /> + <menu_item_check.on_click + function="Advanced.TogglePeriodicSlowFrame" + parameter="points" /> + </menu_item_check> + <menu_item_check + label="Frame Test" + layout="topleft" + name="Frame Test"> + <menu_item_check.on_check + function="Advanced.CheckFrameTest" + parameter="Frame Test" /> + <menu_item_check.on_click + function="Advanced.ToggleFrameTest" /> + </menu_item_check> + </menu> + <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" + parameter="bboxes" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="bboxes" /> + </menu_item_check> + <menu_item_check + label="Octree" + layout="topleft" + name="Octree"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="octree" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="octree" /> + </menu_item_check> + <menu_item_check + label="Shadow Frusta" + layout="topleft" + name="Shadow Frusta"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="shadow frusta" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="shadow frusta" /> + </menu_item_check> + <menu_item_check + label="Occlusion" + layout="topleft" + name="Occlusion"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="occlusion" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="occlusion" /> + </menu_item_check> + <menu_item_check + label="Render Batches" + layout="topleft" + name="Render Batches"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="render batches" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="render batches" /> + </menu_item_check> + <menu_item_check + label="Texture Anim" + layout="topleft" + name="Texture Anim"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="texture anim" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="texture anim" /> + </menu_item_check> + <menu_item_check + label="Texture Priority" + layout="topleft" + name="Texture Priority"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="texture priority" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="texture priority" /> + </menu_item_check> + <menu_item_check + label="Texture Area" + layout="topleft" + name="Texture Area"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="texture area" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="texture area" /> + </menu_item_check> + <menu_item_check + label="Face Area" + layout="topleft" + name="Face Area"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="face area" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="face area" /> + </menu_item_check> + <menu_item_check + label="Lights" + layout="topleft" + name="Lights"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="lights" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="lights" /> + </menu_item_check> + <menu_item_check + label="Collision Skeleton" + layout="topleft" + name="Collision Skeleton"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="collision skeleton" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="collision skeleton" /> + </menu_item_check> + <menu_item_check + label="Raycast" + layout="topleft" + name="Raycast"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="raycast" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="raycast" /> + </menu_item_check> + </menu> + <menu + create_jump_keys="true" + label="Rendering" + layout="topleft" + name="Rendering" + tear_off="true"> + <menu_item_check + label="Axes" + name="Axes"> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowAxes" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowAxes" /> + </menu_item_check> + <menu_item_check + label="Tangent Basis" + name="Tangent Basis"> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowTangentBasis" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowTangentBasis" /> + </menu_item_check> + <menu_item_call + label="Selected Texture Info Basis" + name="Selected Texture Info Basis" + shortcut="control|alt|shift|T"> + <menu_item_call.on_click + function="Advanced.SelectedTextureInfo" /> + </menu_item_call> + <menu_item_check + label="Wireframe" + name="Wireframe" + shortcut="control|shift|R"> + <menu_item_check.on_check + function="Advanced.CheckWireframe" + parameter="Wireframe" /> + <menu_item_check.on_click + function="Advanced.ToggleWireframe" /> + </menu_item_check> + <menu_item_check + label="Object-Object Occlusion" + name="Object-Object Occlusion" + shortcut="control|shift|O"> + <menu_item_check.on_check + function="CheckControl" + parameter="UseOcclusion" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="UseOcclusion" /> + <menu_item_check.on_enable + function="Advanced.EnableObjectObjectOcclusion" /> + </menu_item_check> + <menu_item_check + label="Framebuffer Objects" + name="Framebuffer Objects"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderUseFBO" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderUseFBO" /> + <menu_item_check.on_enable + function="Advanced.EnableRenderFBO" /> + </menu_item_check> + <menu_item_check + label="Deferred Rendering" + name="Deferred Rendering"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderDeferred" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderDeferred" /> + <menu_item_check.on_enable + function="Advanced.EnableRenderDeferred" /> + </menu_item_check> + <menu_item_check + label="Global Illumination" + name="Global Illumination"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderDeferredGI" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderDeferredGI" /> + <menu_item_check.on_enable + function="Advanced.EnableRenderDeferredGI" /> + </menu_item_check> + <menu_item_separator /> + <menu_item_check + label="Debug GL" + name="Debug GL"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderDebugGL" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderDebugGL" /> + </menu_item_check> + <menu_item_check + label="Debug Pipeline" + name="Debug Pipeline"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderDebugGL" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderDebugGL" /> + </menu_item_check> + <menu_item_check + label="Fast Alpha" + name="Fast Alpha"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderDebugGL" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderDebugGL" /> + </menu_item_check> + <menu_item_check + label="Animation Textures" + name="Animation Textures"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderDebugGL" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderDebugGL" /> + </menu_item_check> + <menu_item_check + label="Disable Textures" + name="Disable Textures"> + <menu_item_check.on_check + function="CheckControl" + parameter="TextureDisable" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="TextureDisable" /> + </menu_item_check> + <menu_item_check + label="Full Res Textures" + layout="topleft" + name="Rull Res Textures"> + <menu_item_check.on_check + function="CheckControl" + parameter="TextureLoadFullRes" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="TextureLoadFullRes" /> + </menu_item_check> + <menu_item_check + label="Audit Textures" + layout="topleft" + name="Audit Textures"> + <menu_item_check.on_check + function="CheckControl" + parameter="AuditTexture" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="AuditTexture" /> + </menu_item_check> + <menu_item_check + label="Texture Atlas" + name="Texture Atlas"> + <menu_item_check.on_check + function="CheckControl" + parameter="EnableTextureAtlas" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="EnableTextureAtlas" /> + </menu_item_check> + <menu_item_check + label="Render Attached Lights" + name="Render Attached Lights"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderAttachedLights" /> + <menu_item_check.on_click + function="Advanced.HandleAttchedLightParticles" + parameter="RenderAttachedLights" /> + </menu_item_check> + <menu_item_check + label="Render Attached Particles" + name="Render Attached Particles"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderAttachedParticles" /> + <menu_item_check.on_click + function="Advanced.HandleAttchedLightParticles" + parameter="RenderAttachedParticles" /> + </menu_item_check> + <menu_item_check + label="Hover Glow Objects" + name="Hover Glow Objects"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderHoverGlowEnable" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderHoverGlowEnable" /> + </menu_item_check> + </menu> + + <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" + parameter="AgentPause" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="AgentPause" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <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_check + label="Velocity Interpolate Objects" + layout="topleft" + name="Velocity Interpolate Objects"> + <menu_item_check.on_check + function="CheckControl" + parameter="VelocityInterpolate" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="VelocityInterpolate" /> + </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" + parameter="PingInterpolate" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="PingInterpolate" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Drop a Packet" + layout="topleft" + name="Drop a Packet" + shortcut="control|alt|L"> + <menu_item_call.on_click + function="Advanced.DropPacket" /> + </menu_item_call> + </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" + parameter="bumps" /> + </menu_item_call> + + <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" + parameter="start playback" /> + </menu_item_call> + <menu_item_call + label="Stop Playback" + layout="topleft" + name="Stop Playback"> + <menu_item_call.on_click + function="Advanced.AgentPilot" + parameter="stop playback" /> + </menu_item_call> + <menu_item_check + label="Loop Playback" + layout="topleft" + name="Loop Playback"> + <menu_item_check.on_check + function="Advanced.CheckAgentPilotLoop" + parameter="loopPlayback" /> + <menu_item_check.on_click + function="Advanced.ToggleAgentPilotLoop" /> + </menu_item_check> + <menu_item_call + label="Start Record" + layout="topleft" + name="Start Record"> + <menu_item_call.on_click + function="Advanced.AgentPilot" + parameter="start record" /> + </menu_item_call> + <menu_item_call + label="Stop Record" + layout="topleft" + name="Stop Record"> + <menu_item_call.on_click + function="Advanced.AgentPilot" + parameter="stop record" /> + </menu_item_call> + </menu> + + <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" + parameter="SkyOverrideSimSunPosition" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="SkyOverrideSimSunPosition" /> + </menu_item_check> + <menu_item_check + label="Cheesy Beacon" + layout="topleft" + name="Cheesy Beacon"> + <menu_item_check.on_check + function="CheckControl" + parameter="CheesyBeacon" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="CheesyBeacon" /> + </menu_item_check> + <menu_item_check + label="Fixed Weather" + layout="topleft" + name="Fixed Weather"> + <menu_item_check.on_check + function="CheckControl" + parameter="FixedWeather" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="FixedWeather" /> + </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" /> + </menu_item_call> + </menu> + <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" + parameter="BottomPanelNew" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="BottomPanelNew" /> + </menu_item_check>--> + <menu_item_call + label="Web Browser Test" + layout="topleft" + name="Web Browser Test"> + <menu_item_call.on_click + function="Advanced.WebBrowserTest" + parameter="http://secondlife.com/app/search/slurls.html"/> + </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" /> + </menu_item_call> + <menu_item_call + label="Dump Timers" + name="Dump Timers"> + <menu_item_call.on_click + function="Advanced.DumpTimers" /> + </menu_item_call> + <menu_item_call + label="Dump Focus Holder" + layout="topleft" + name="Dump Focus Holder" + shortcut="control|alt|F"> + <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 + function="Advanced.PrintSelectedObjectInfo" /> + </menu_item_call> + <menu_item_call + label="Print Agent Info" + layout="topleft" + name="Print Agent Info" + shortcut="shift|P"> + <menu_item_call.on_click + function="Advanced.PrintAgentInfo" /> + </menu_item_call> + <menu_item_call + label="Memory Stats" + layout="topleft" + name="Memory Stats" + shortcut="control|alt|shift|M"> + <menu_item_call.on_click + function="Advanced.PrintTextureMemoryStats" /> + </menu_item_call> + <menu_item_check + label="Double-ClickAuto-Pilot" + layout="topleft" + name="Double-ClickAuto-Pilot"> + <menu_item_check.on_check + function="CheckControl" + parameter="DoubleClickAutoPilot" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DoubleClickAutoPilot" /> + </menu_item_check> + + <menu_item_separator /> + <menu_item_check + label="Debug SelectMgr" + layout="topleft" + name="Debug SelectMgr"> + <menu_item_check.on_check + function="CheckControl" + parameter="DebugSelectMgr" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugSelectMgr" /> + </menu_item_check> + <menu_item_check + label="Debug Clicks" + layout="topleft" + name="Debug Clicks"> + <menu_item_check.on_check + function="Advanced.CheckDebugClicks" + parameter="DebugClicks" /> + <menu_item_check.on_click + function="Advanced.ToggleDebugClicks" + parameter="DebugClicks" /> + </menu_item_check> + <menu_item_check + label="Debug Views" + layout="topleft" + name="Debug Views"> + <menu_item_check.on_check + function="Advanced.CheckDebugViews" /> + <menu_item_check.on_click + function="Advanced.ToggleDebugViews" /> + </menu_item_check> + <menu_item_check + label="Debug Name Tooltips" + layout="topleft" + name="Debug Name Tooltips"> + <menu_item_check.on_check + function="Advanced.CheckXUINameTooltips" + parameter="XUINameTooltips" /> + <menu_item_check.on_click + function="Advanced.ToggleXUINameTooltips" /> + </menu_item_check> + <menu_item_check + label="Debug Mouse Events" + layout="topleft" + name="Debug Mouse Events"> + <menu_item_check.on_check + function="Advanced.CheckDebugMouseEvents" + parameter="MouseEvents" /> + <menu_item_check.on_click + function="Advanced.ToggleDebugMouseEvents" /> + </menu_item_check> + <menu_item_check + label="Debug Keys" + layout="topleft" + name="Debug Keys"> + <menu_item_check.on_check + function="Advanced.CheckDebugKeys" + parameter="DebugKeys" /> + <menu_item_check.on_click + function="Advanced.ToggleDebugKeys" /> + </menu_item_check> + <menu_item_check + label="Debug WindowProc" + layout="topleft" + name="Debug WindowProc"> + <menu_item_check.on_check + function="Advanced.CheckDebugWindowProc" + parameter="DebugWindowProc" /> + <menu_item_check.on_click + function="Advanced.ToggleDebugWindowProc" + parameter="DebugWindowProc" /> + </menu_item_check> + </menu> + <menu + create_jump_keys="true" + label="XUI" + name="XUI" + 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" + parameter="font_test" /> + </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" + parameter="showUIname" /> + <menu_item_check.on_click + function="Advanced.ToggleXUINames" /> + </menu_item_check> + <menu_item_call + label="Send Test IMs" + layout="topleft" + name="Send Test IMs"> + <menu_item_call.on_click + function="Advanced.SendTestIMs" /> + </menu_item_call> + <menu_item_call + label="Test Inspectors" + name="Test Inspectors" + shortcut="control|shift|I"> + <menu_item_call.on_click + function="Floater.Show" + parameter="test_inspectors" /> + </menu_item_call> + </menu> + <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" + parameter="iris" /> + <menu_item_call.on_enable + function="Advanced.EnableGrabBakedTexture" + parameter="iris" /> + </menu_item_call> + <menu_item_call + label="Head" + layout="topleft" + name="Head"> + <menu_item_call.on_click + function="Advanced.GrabBakedTexture" + parameter="head" /> + <menu_item_call.on_enable + function="Advanced.EnableGrabBakedTexture" + parameter="head" /> + </menu_item_call> + <menu_item_call + label="Upper Body" + layout="topleft" + name="Upper Body"> + <menu_item_call.on_click + function="Advanced.GrabBakedTexture" + parameter="upper" /> + <menu_item_call.on_enable + function="Advanced.EnableGrabBakedTexture" + parameter="upper" /> + </menu_item_call> + <menu_item_call + label="Lower Body" + layout="topleft" + name="Lower Body"> + <menu_item_call.on_click + function="Advanced.GrabBakedTexture" + parameter="lower" /> + <menu_item_call.on_enable + function="Advanced.EnableGrabBakedTexture" + parameter="lower" /> + </menu_item_call> + <menu_item_call + label="Skirt" + layout="topleft" + name="Skirt"> + <menu_item_call.on_click + function="Advanced.GrabBakedTexture" + parameter="skirt" /> + <menu_item_call.on_enable + function="Advanced.EnableGrabBakedTexture" + parameter="skirt" /> + </menu_item_call> + </menu> + <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" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </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" + parameter="AllowSelectAvatar" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="AllowSelectAvatar" /> + </menu_item_check> + </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" + parameter="AnimationInfo" /> + <menu_item_check.on_click + function="Advanced.ToggleAnimationInfo" + parameter="" /> + </menu_item_check> + <menu_item_check + label="Slow Motion Animations" + layout="topleft" + name="Slow Motion Animations"> + <menu_item_check.on_check + function="CheckControl" + parameter="SlowMotionAnimation" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="SlowMotionAnimation" /> + </menu_item_check> + <menu_item_check + label="Show Look At" + layout="topleft" + name="Show Look At"> + <menu_item_check.on_check + function="Advanced.CheckShowLookAt" + parameter="ShowLookAt" /> + <menu_item_check.on_click + function="Advanced.ToggleShowLookAt" /> + </menu_item_check> + <menu_item_check + label="Show Point At" + layout="topleft" + name="Show Point At"> + <menu_item_check.on_check + function="Advanced.CheckShowPointAt" + parameter="ShowPointAt" /> + <menu_item_check.on_click + function="Advanced.ToggleShowPointAt" /> + </menu_item_check> + <menu_item_check + label="Debug Joint Updates" + layout="topleft" + name="Debug Joint Updates"> + <menu_item_check.on_check + function="Advanced.CheckDebugJointUpdates" + parameter="DebugJointUpdates" /> + <menu_item_check.on_click + function="Advanced.ToggleDebugJointUpdates" /> + </menu_item_check> + <menu_item_check + label="Disable LOD" + layout="topleft" + name="Disable LOD"> + <menu_item_check.on_check + function="Advanced.CheckDisableLOD" + parameter="DisableLOD" /> + <menu_item_check.on_click + function="Advanced.ToggleDisableLOD" /> + </menu_item_check> + <menu_item_check + label="Debug Character Vis" + layout="topleft" + name="Debug Character Vis"> + <menu_item_check.on_check + function="Advanced.CheckDebugCharacterVis" + parameter="DebugCharacterVis" /> + <menu_item_check.on_click + function="Advanced.ToggleDebugCharacterVis" /> + </menu_item_check> + <menu_item_check + label="Show Collision Skeleton" + layout="topleft" + name="Show Collision Skeleton"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="collision skeleton" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="collision skeleton" /> + </menu_item_check> + <menu_item_check + label="Display Agent Target" + layout="topleft" + name="Display Agent Target"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="agent target" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="agent target" /> + </menu_item_check> +<!-- Appears not to exist anymore + <menu_item_check + label="Debug Rotation" + layout="topleft" + name="Debug Rotation"> + <menu_item_check.on_check + function="CheckControl" + parameter="DebugAvatarRotation" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugAvatarRotation" /> + </menu_item_check> --> +--> + <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 + function="Advanced.DebugAvatarTextures" /> + </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_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" + parameter="SaveMinidump" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="SaveMinidump" /> + </menu_item_check> + <menu_item_check + label="Console Window on next Run" + layout="topleft" + name="Console Window"> + <menu_item_check.on_check + function="CheckControl" + parameter="ShowConsoleWindow" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="ShowConsoleWindow" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_check + label="Show Admin Menu" + layout="topleft" + name="View Admin Options"> + <menu_item_check.on_check + function="Advanced.CheckViewAdminOptions" + parameter="ViewAdminOptions" /> + <menu_item_check.on_click + function="Advanced.ToggleViewAdminOptions" /> + </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 + function="Advanced.RequestAdminStatus" /> + </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 + function="Advanced.LeaveAdminStatus" /> + </menu_item_call> + </menu> + <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 + function="Admin.ForceTakeCopy" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </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" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + <menu_item_call + label="Force Owner Permissive" + layout="topleft" + name="Force Owner Permissive"> + <menu_item_call.on_click + function="Admin.HandleObjectOwnerPermissive" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + <menu_item_call + label="Delete" + layout="topleft" + name="Delete" + shortcut="control|alt|shift|Del"> + <menu_item_call.on_click + function="Admin.HandleForceDelete" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + <menu_item_call + label="Lock" + layout="topleft" + name="Lock" + shortcut="control|alt|shift|L"> + <menu_item_call.on_click + function="Admin.HandleObjectLock" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </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 + function="Admin.HandleObjectAssetIDs" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + </menu> + <menu + create_jump_keys="true" + label="Parcel" + layout="topleft" + name="Parcel" + tear_off="true"> + <menu_item_call + label="Owner To Me" + layout="topleft" + name="Owner To Me"> + <menu_item_call.on_click + function="Admin.HandleForceParcelOwnerToMe" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </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 + function="Admin.HandleForceParcelToContent" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + <menu_item_call + label="Claim Public Land" + layout="topleft" + name="Claim Public Land"> + <menu_item_call.on_click + function="Admin.HandleClaimPublicLand" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + </menu> + <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" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + <menu_item_call + label="Save Region State" + layout="topleft" + name="Save Region State"> + <menu_item_call.on_click + function="Admin.OnSaveState" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + </menu> + <menu_item_call + label="God Tools" + layout="topleft" + name="God Tools"> + <menu_item_call.on_click + function="Floater.Show" + parameter="god_tools" /> + <menu_item_call.on_enable + function="IsGodCustomerService" /> + </menu_item_call> + </menu> + <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" + parameter="shirt" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="shirt" /> + </menu_item_call> + <menu_item_call + label="Pants" + layout="topleft" + name="Pants"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="pants" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="pants" /> + </menu_item_call> + <menu_item_call + label="Shoes" + layout="topleft" + name="Shoes"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="shoes" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="shoes" /> + </menu_item_call> + <menu_item_call + label="Socks" + layout="topleft" + name="Socks"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="socks" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="socks" /> + </menu_item_call> + <menu_item_call + label="Jacket" + layout="topleft" + name="Jacket"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="jacket" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="jacket" /> + </menu_item_call> + <menu_item_call + label="Gloves" + layout="topleft" + name="Gloves"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="gloves" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="gloves" /> + </menu_item_call> + <menu_item_call + label="Undershirt" + layout="topleft" + name="Menu Undershirt"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="undershirt" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="undershirt" /> + </menu_item_call> + <menu_item_call + label="Underpants" + layout="topleft" + name="Menu Underpants"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="underpants" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="underpants" /> + </menu_item_call> + <menu_item_call + label="Skirt" + layout="topleft" + name="Skirt"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="skirt" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="skirt" /> + </menu_item_call> + <menu_item_call + label="Alpha" + layout="topleft" + name="Alpha"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="alpha" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="alpha" /> + </menu_item_call> + <menu_item_call + label="Tattoo" + layout="topleft" + name="Tattoo"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="tattoo" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="tattoo" /> + </menu_item_call> + <menu_item_call + label="All Clothes" + layout="topleft" + name="All Clothes"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="all" /> + </menu_item_call> + </menu> + <menu_item_check + label="Show Toolbar" + layout="topleft" + name="Show Toolbar"> + <menu_item_check.on_check + function="FloaterVisible" + parameter="toolbar" /> + <menu_item_check.on_click + function="ShowFloater" + parameter="toolbar" /> + </menu_item_check> + <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" + name="OfficialLindenBlog_url" + parameter="WebLaunchSupportWiki,http://blog.secondlife.com/" /> + </menu_item_call> + <menu_item_call + label="Scripting Portal" + layout="topleft" + name="Scripting Portal"> + <menu_item_call.on_click + function="PromptShowURL" + name="ScriptingPortal_url" + parameter="WebLaunchLSLWiki,http://wiki.secondlife.com/wiki/LSL_Portal" /> + </menu_item_call> + <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" + name="PublicIssueTracker_url" + parameter="WebLaunchPublicIssue,http://jira.secondlife.com" /> + </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_call + label="Bug Reporting 101" + layout="topleft" + name="Bug Reporing 101"> + <menu_item_call.on_click + function="PromptShowURL" + name="BugReporting101_url" + parameter="WebLaunchBugReport101,http://wiki.secondlife.com/wiki/Bug_Reporting_101" /> + </menu_item_call> + <menu_item_call + label="Security Issues" + layout="topleft" + name="Security Issues"> + <menu_item_call.on_click + function="PromptShowURL" + name="SecurityIssues_url" + parameter="WebLaunchSecurityIssues,http://wiki.secondlife.com/wiki/Security_issues" /> + </menu_item_call> + <menu_item_call + label="QA Wiki" + layout="topleft" + name="QA Wiki"> + <menu_item_call.on_click + function="PromptShowURL" + name="QAWiki_url" + parameter="WebLaunchQAWiki,http://wiki.secondlife.com/wiki/QA_Portal" /> + </menu_item_call> + </menu> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 989dc8885127499e1566013aa5a601aafa90ed86..a87f05cbcc0ec342e06e95ed22e742d730696afc 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -581,9 +581,10 @@ Multiple faces are currently selected. If you continue this action, separate instances of media will be set on multiple faces of the object. To place the media on only one face, choose Select Texture and click on the desired face of that object then click Add. <usetemplate - name="okcancelignore" - notext="Cancel" - yestext="OK"/> + ignoretext="Media will be set on multiple selected faces" + name="okcancelignore" + notext="Cancel" + yestext="OK"/> </notification> <notification @@ -721,7 +722,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now? icon="alertmodal.tga" name="AddClassified" type="alertmodal"> -Classified ads appear in the 'Classified' section of the Search directory and on [http://www.secondlife.com secondlife.com] for one week. +Classified ads appear in the 'Classified' section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week. Fill out your ad, then click 'Publish...' to add it to the directory. You'll be asked for a price to pay when clicking Publish. Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords. @@ -1433,6 +1434,13 @@ Not able to perform 'reset'. Select objects with scripts that you have permission to modify. </notification> + <notification + icon="alertmodal.tga" + name="CannotOpenScriptObjectNoMod" + type="alertmodal"> + Unable to open script in object without modify permissions. + </notification> + <notification icon="alertmodal.tga" name="CannotSetRunningSelectObjectsNoScripts" @@ -3050,6 +3058,18 @@ Teleport to [PICK]? yestext="Teleport"/> </notification> + <notification + icon="alertmodal.tga" + name="TeleportToClassified" + type="alertmodal"> + Teleport to [CLASSIFIED]? + <usetemplate + ignoretext="Confirm that I want to teleport to a location in Classifieds" + name="okcancelignore" + notext="Cancel" + yestext="Teleport"/> + </notification> + <notification icon="alert.tga" label="Message everyone in your Estate" @@ -3248,7 +3268,7 @@ You are not allowed in that region due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? <url option="0" name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview </url> <usetemplate name="okcancelignore" @@ -3305,7 +3325,7 @@ You cannot claim this land due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? <url option="0" name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview </url> <usetemplate name="okcancelignore" @@ -3355,7 +3375,7 @@ You cannot buy this land due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? <url option="0" name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview </url> <usetemplate name="okcancelignore" @@ -3752,7 +3772,7 @@ There are no items in this object that you are allowed to copy. icon="alertmodal.tga" name="WebLaunchAccountHistory" type="alertmodal"> -Go to your [http://secondlife.com/account/ Dashboard] to see your account history? +Go to your [http://secondlife.com/account/ Dashboard] to see your account history? <usetemplate ignoretext="Launch my browser to see my account history" name="okcancelignore" @@ -4474,7 +4494,7 @@ You don't have permission to copy this. icon="notifytip.tga" name="InventoryAccepted" type="notifytip"> -[NAME] accepted your inventory offer. +[NAME] received your inventory offer. </notification> <notification @@ -4684,7 +4704,12 @@ The objects on the selected parcel that are NOT owned by you have been returned icon="notify.tga" name="ServerObjectMessage" type="notify"> +Message from [NAME]: [MSG] + <usetemplate + name="okcancelbuttons" + notext="OK" + yestext="Inspect"/> </notification> <notification @@ -4940,17 +4965,18 @@ No valid parcel could be found. <notification icon="notify.tga" name="ObjectGiveItem" - type="notify"> -An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME]. + type="offer"> +An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> <button index="0" name="Keep" - text="OK"/> + text="Keep"/> <button index="1" name="Discard" - text="Cancel"/> + text="Discard"/> <button index="2" name="Mute" @@ -4961,17 +4987,18 @@ An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECT <notification icon="notify.tga" name="ObjectGiveItemUnknownUser" - type="notify"> -An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a [OBJECTTYPE] named [OBJECTNAME]. + type="offer"> +An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> <button index="0" name="Keep" - text="OK"/> + text="Keep"/> <button index="1" name="Discard" - text="Cancel"/> + text="Discard"/> <button index="2" name="Mute" @@ -4983,16 +5010,21 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a icon="notify.tga" name="UserGiveItem" type="offer"> -[NAME] has given you a [OBJECTTYPE] named '[OBJECTNAME]'. +[NAME_SLURL] has given you [OBJECTTYPE]: +[ITEM_SLURL] <form name="form"> <button index="0" name="Keep" - text="Accept"/> + text="Keep"/> + <button + index="4" + name="Show" + text="Show"/> <button index="1" name="Discard" - text="No, thanks"/> + text="Discard"/> </form> </notification> @@ -5001,6 +5033,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a name="GodMessage" type="notify"> [NAME] + [MESSAGE] </notification> @@ -5276,6 +5309,27 @@ 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" @@ -5567,7 +5621,7 @@ We're sorry. This area has reached maximum capacity for voice conversation icon="notifytip.tga" name="VoiceChannelDisconnected" type="notifytip"> -You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to spatial voice chat. +You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat. <unique> <context key="VOICE_CHANNEL_NAME"/> </unique> @@ -5577,7 +5631,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect icon="notifytip.tga" name="VoiceChannelDisconnectedP2P" type="notifytip"> -[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to spatial voice chat. +[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat. <unique> <context key="VOICE_CHANNEL_NAME"/> </unique> @@ -5587,7 +5641,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect icon="notifytip.tga" name="P2PCallDeclined" type="notifytip"> -[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to spatial voice chat. +[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat. <unique> <context key="VOICE_CHANNEL_NAME"/> </unique> @@ -5597,7 +5651,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect icon="notifytip.tga" name="P2PCallNoAnswer" type="notifytip"> -[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to spatial voice chat. +[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat. <unique> <context key="VOICE_CHANNEL_NAME"/> </unique> @@ -5607,7 +5661,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect icon="notifytip.tga" name="VoiceChannelJoinFailed" type="notifytip"> -Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat. +Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat. <unique> <context key="VOICE_CHANNEL_NAME"/> </unique> @@ -5721,6 +5775,15 @@ Are you sure you want to delete your teleport history? yestext="OK"/> </notification> + <notification + icon="alert.tga" + name="BottomTrayButtonCanNotBeShown" + type="alert"> +Selected button can not be shown right now. +The button will be shown when there is enough space for it. + </notification> + + <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. </global> diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml index 8b815b0f711cc1cde2702d8bf90f7670fe6bdba9..3ed91cb48f8f479d975ffa9e02db0642b0aa15a5 100644 --- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml +++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml @@ -7,7 +7,9 @@ left="0" height="35" width="318" - background_visible="false"> + background_opaque="false" + background_visible="true" + bg_alpha_color="0.0 0.0 0.0 0.0" > <chiclet_im_p2p name="p2p_chiclet" layout="topleft" @@ -15,7 +17,16 @@ top="3" left="5" height="25" - width="25"> + width="25" + visible="false" + speaker.name="speaker_p2p" + speaker.width="20" + speaker.height="25" + speaker.left="25" + speaker.top="25" + speaker.auto_update="true" + speaker.draw_border="false" + speaker.visible="false"> </chiclet_im_p2p> <chiclet_im_group name="group_chiclet" @@ -24,14 +35,41 @@ top="3" left="5" height="25" - width="25"> + width="25" + visible="false" + speaker.name="speaker_grp" + speaker.width="20" + speaker.height="25" + speaker.left="25" + speaker.top="25" + speaker.auto_update="true" + speaker.draw_border="false" + speaker.visible="false"> </chiclet_im_group> + <chiclet_im_adhoc + name="adhoc_chiclet" + layout="topleft" + follows="left" + top="3" + left="5" + height="25" + width="25" + visible="false" + speaker.name="speaker_hoc" + speaker.width="20" + speaker.height="25" + speaker.left="25" + speaker.top="25" + speaker.auto_update="true" + speaker.draw_border="false" + speaker.visible="false"> + </chiclet_im_adhoc> <text type="string" name="contact_name" layout="topleft" top="10" - left_pad="0" + left_pad="20" height="14" width="245" length="1" 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 0246e21d254d83bf6a69e9331c8b07310bb053b4..368ab17689451d7fffe14577c4dc05d8a8aaed3c 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 @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" + follows="all" height="215" name="panel_im_control_panel" width="180"> - <avatar_list color="DkGray2" - follows="left|top|right|bottom" + follows="all" height="130" ignore_online_status="true" layout="topleft" @@ -18,46 +18,43 @@ show_profile_btn="false" show_speaking_indicator="false" top="10" - width="180"/> - + width="180" /> <panel background_visible="true" - bg_alpha_color="0.2 0.2 0.2 1" + bg_alpha_color="DkGray2" border="false" bottom="1" - follows="left|bottom" + follows="left|right|bottom" height="70" left="0" left_pad="0" name="panel_call_buttons" top_pad="0" width="180"> - <button bottom="10" + follows="all" height="20" label="Call" - left_delta="28" + left_delta="40" name="call_btn" - width="125"/> - + width="100" /> <button bottom="40" + follows="all" height="20" label="Leave Call" name="end_call_btn" visible="false" - width="125"/> - + width="100" /> <button enabled="false" + follows="all" bottom="10" height="20" - label="Open Voice Controls" + label="Voice Controls" name="voice_ctrls_btn" visible="false" - width="125"/> - + width="100" /> </panel> - </panel> 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 0c426865310df0ffdd978d7a716d7f296ec42cc1..2eaa3a94ee29d138d8f89a077ab976f4e4eea61c 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 @@ -30,7 +30,7 @@ <avatar_icon follows="top|left" height="20" - image_name="smile.png" + default_icon_name="Generic_Person" layout="topleft" left="5" mouse_opaque="true" diff --git a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml index 16c8660781ecdd01fa9d53b1078b8afb9726cd6f..b779b08a63c487e6c637a42d39f8c21a9279ebd4 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml @@ -4,66 +4,63 @@ top="10" width="250" height="100" - background_opaque="false" - background_visible="true" - follows="left|top|bottom|right" - bg_alpha_color="0.3 0.3 0.3 1.0"> - <panel - width="250" - height="30" - background_visible="true" - background_opaque="false" + follows="all"> + <panel + width="240" + height="24" + left="5" + background_visible="true" + background_opaque="false" follows="left|top|right" - bg_alpha_color="0.0 0.0 0.0 1.0" + top="-5" + bg_alpha_color="black" name="msg_caption"> - <avatar_icon - top="-7" - left="10" - width="20" - height="20" + <avatar_icon + top="-3" + left="3" + width="18" + image_name="Generic_Person" + height="18" follows="left|top" - color="1 1 1 1" - enabled="true" - name="avatar_tag_icon"/> + enabled="true" + name="avatar_tag_icon" /> <text - width="160" - top="-10" - left="40" - height="20" + width="160" + top="-8" + left="30" + height="20" follows="left|right|top" - font="SansSerifBigBold" - text_color="white" + font.style="BOLD" + text_color="white" word_wrap="true" - mouse_opaque="true" - name="sender_tag_name" > + mouse_opaque="true" + name="sender_tag_name"> Angela Tester </text> - <text - width="30" - top="-12" - left="210" - height="20" - follows="right|top" - text_color="white" - word_wrap="true" - mouse_opaque="true" - name="tag_time" > - 07:52 - </text> + <text + font="SansSerifSmall" + follows="right" + height="13" + layout="topleft" + halign="right" + right="-5" + name="tag_time" + top="8" + value="23:30" + width="50" /> </panel> - <text_editor - top="65" - left="10" - right="-10" - height="100" - follows="left|top|bottom|right" - font="SansSerifSmall" + <text_editor + bg_readonly_color="DkGray" + font="SansSerifSmall" + top="65" + left="5" + right="-5" + height="100" + follows="all" read_only="true" - bg_readonly_color="0 0 0 0" word_wrap="true" - mouse_opaque="true" - name="msg_text" > + mouse_opaque="true" + name="msg_text"> The quick brown fox jumps over the lazy dog. </text_editor> </panel> - 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 5c8a8ee2081ad20d78d6066edc58d5e8d3492240..3842c2a8db833e48184703e5ae7ba5965e67ddcf 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 @@ -61,6 +61,7 @@ layout="topleft" left_delta="0" name="Block object by name..." + tool_tip="Pick an object to block by name" top_pad="4" width="210" > <button.commit_callback diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 3fbc8e1afd82045bcd93b1397e449a012bc1a517..da8006d545efb993611305c915bba5235614600e 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -13,6 +13,8 @@ chrome="true" border_visible="false" width="1000"> + <string name="SpeakBtnToolTip">Turns microphone on/off</string> + <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string> <layout_stack mouse_opaque="false" border_size="0" @@ -44,8 +46,8 @@ left="0" min_height="23" width="310" - top="0" - min_width="310" + top="4" + min_width="192" name="chat_bar" user_resize="false" filename="panel_nearby_chat_bar.xml" /> @@ -56,23 +58,21 @@ height="28" layout="topleft" min_height="28" - width="104" + width="100" top_delta="0" - min_width="104" + min_width="54" name="speak_panel" user_resize="false"> <talk_button - follows="right" + follows="left|right" height="23" speak_button.tab_stop="true" show_button.tab_stop="true" layout="topleft" left="0" name="talk" - top="3" - width="100" - speak_button.tool_tip="Turns microphone on/off" - show_button.tool_tip="Shows/hides voice control panel" /> + top="4" + width="100" /> </layout_panel> <icon auto_resize="false" @@ -92,22 +92,25 @@ height="28" layout="topleft" min_height="28" - width="80" + width="82" top_delta="0" - min_width="76" + min_width="52" name="gesture_panel" user_resize="false"> - <button - follows="right" + <gesture_combo_box + follows="left|right" height="23" label="Gesture" layout="topleft" name="Gesture" left="0" - top="3" - use_ellipses="true" - width="80" - tool_tip="Shows/hides gestures"/> + top="4" + width="82" + tool_tip="Shows/hides gestures"> + <gesture_combo_box.drop_down_button + pad_right="10" + use_ellipses="true" /> + </gesture_combo_box> </layout_panel> <icon auto_resize="false" @@ -129,9 +132,13 @@ layout="topleft" min_height="28" name="movement_panel" + user_resize="false" width="80" - min_width="76"> + min_width="49"> <button + image_selected="PushButton_Selected_Press" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" follows="left|right" height="23" use_ellipses="true" @@ -140,7 +147,7 @@ layout="topleft" name="movement_btn" tool_tip="Shows/hides movement controls" - top="3" + top="4" width="80"> <button.init_callback function="Button.SetDockableFloaterToggle" @@ -166,11 +173,14 @@ height="28" layout="topleft" min_height="28" - min_width="76" + min_width="49" name="cam_panel" - top_delta="-10" - width="100"> + user_resize="false" + width="80"> <button + image_selected="PushButton_Selected_Press" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" follows="left|right" height="23" use_ellipses="true" @@ -179,7 +189,7 @@ layout="topleft" left="0" tool_tip="Shows/hides camera controls" - top="3" + top="4" name="camera_btn" width="80"> <button.init_callback @@ -205,21 +215,25 @@ follows="left|right" height="28" layout="topleft" + min_width="40" name="snapshot_panel" width="40"> <button - follows="left|right" + follows="left|right" height="23" left="0" label="" layout="topleft" name="snapshots" width="36" - top="3" + top="4" image_overlay="Snapshot_Off" - tool_tip="Take snapshot" - /> - </layout_panel> + tool_tip="Take snapshot"> + <button.commit_callback + function="Floater.Toggle" + parameter="snapshot" /> + </button> + </layout_panel> <layout_panel mouse_opaque="false" follows="left|right" @@ -228,20 +242,58 @@ top="0" name="chiclet_list_panel" width="189" - min_width="189" + min_width="180" user_resize="false" auto_resize="true"> +<!--*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" follows="left|right" - height="28" + height="23" layout="topleft" left="0" + min_width="180" name="chiclet_list" - top="0" - chiclet_padding="3" + top="4" + chiclet_padding="4" scrolling_offset="40" - width="189" /> + width="189"> + <button + auto_resize="true" + follows="right" + height="23" + 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" + tab_stop="false" + top="0" + visible="false" + width="20" /> + <button + auto_resize="true" + follows="right" + height="23" + 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" + tab_stop="false" + top="0" + visible="false" + width="20" /> + </chiclet_panel> </layout_panel> <icon auto_resize="false" @@ -262,8 +314,8 @@ min_height="28" top="0" name="sys_well_panel" - width="34" - min_width="34" + width="54" + min_width="54" user_resize="false"> <chiclet_notification follows="right" @@ -272,22 +324,24 @@ left="0" name="sys_well" top="4" - width="34"> + width="54"> <button + image_selected="PushButton_Selected_Press" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" auto_resize="true" halign="right" height="23" follows="right" flash_color="EmphasisColor" + left="0" name="Unread" image_overlay="Notices_Unread" - width="20" + image_overlay_alignment="right" + pad_right="6" + pad_left="6" + width="54" /> - <unread_notifications - width="34" - height="23" - left="22" - top="23" /> </chiclet_notification> </layout_panel> <icon @@ -300,6 +354,6 @@ min_width="4" right="-1" top="0" - width="26"/> + width="4"/> </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 64519b2571543aabb8d9d9134471b171009de1c2..c1090a16865f0ab482bd73a1eb390b61cf346a7b 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -1,44 +1,48 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - background_visible="true" - bevel_style="in" - bg_alpha_color="black" - follows="left|top|right" - height="20" - label="im_header" - layout="topleft" - name="im_header" > - <avatar_icon - follows="left" - height="16" - image_name="icon_avatar_online.tga" - layout="topleft" - left="2" - mouse_opaque="true" - name="avatar_icon" - top="2" - width="16" /> - <text + background_visible="true" + bevel_style="in" + bg_alpha_color="black" + follows="top|left|right" + height="24" + label="im_header" + layout="topleft" + name="im_header" + width="300"> + <avatar_icon + follows="left" + height="18" + image_name="Generic_Person" + layout="topleft" + left="3" + mouse_opaque="true" + name="avatar_icon" + top="3" + width="18" /> + <text_editor + v_pad = "0" + read_only = "true" follows="left|right" - font="SansSerifBigBold" - height="20" - layout="topleft" - left_pad="6" - right="-50" + font.style="BOLD" + height="12" + layout="topleft" + left_pad="5" + right="-60" name="user_name" text_color="white" - top="3" - value="Darth Vader" - use_ellipses="true" /> + top="8" + use_ellipses="true" + value="Ericag Vader" /> <text - follows="right" - font="SansSerifBig" - height="20" - layout="topleft" + font="SansSerifSmall" + follows="right" + halign="right" + height="13" + layout="topleft" + left_pad="5" name="time_box" - right="0" - text_color="white" - top="3" - value="23:30" - width="50" /> + right="-5" + top="8" + value="23:30" + width="50" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml index 05b04bbf8eac97e57d39549695672ddf81cce3db..2b29796f0a1b4571260af2067c1149bf9db9b29e 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_item.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml @@ -1,38 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- All our XML is utf-8 encoded. --> - <panel name="instant_message" width="300" height="180" - background_opaque="true" - background_visible="false" - follows="left|top|right|bottom" - bg_alpha_color="0.3 0.3 0.3 0"> - <panel width="250" height="30" background_visible="true" background_opaque="false" bg_alpha_color="0.0 0.0 0.0 1.0" name="msg_caption"> - <avatar_icon - top="25" left="10" width="20" height="20" follows="left|top" - color="1 1 1 1" enabled="true" name="avatar_icon" - /> + follows="all"> + <panel + width="290" + height="24" + background_visible="true" + background_opaque="false" + bg_alpha_color="Black" + left="5" + name="msg_caption"> + <avatar_icon + follows="left" + height="18" + image_name="Generic_Person" + layout="topleft" + left="3" + mouse_opaque="true" + name="avatar_icon" + top="3" + width="18" /> <text - width="130" top="25" left="40" height="20" follows="left|right|top" - font="SansSerifBigBold" text_color="white" word_wrap="false" use_ellipses="true" - mouse_opaque="true" name="sender_name" > + font.style="BOLD" + height="12" + layout="topleft" + left_pad="5" + top="7" + text_color="white" + word_wrap="false" + use_ellipses="true" + mouse_opaque="true" + name="sender_name" + width="150"> Jerry Knight </text> - <icon top="22" left="170" width="15" height="15" follows="top|right" - image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector"/> - <icon top="22" left="190" width="10" height="10" follows="top|right" - image_name="speaking_indicator.tga" name="msg_icon"/> - <text width="35" top="22" left="205" height="20" follows="right|top" - text_color="white" word_wrap="true" mouse_opaque="true" name="msg_time" > - 10:32 - </text> + <!-- <icon top="22" left="215" width="15" height="15" follows="top|right" + image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector" />--> + <!--<icon top="22" left="215" width="10" height="10" follows="top|right" + image_name="speaking_indicator.tga" name="msg_icon"/>--> + <text + font="SansSerifSmall" + follows="right|top" + halign="right" + height="13" + layout="topleft" + right="-10" + left="205" + mouse_opaque="true" + name="msg_time" + top="8" + value="23:30" + width="50" + word_wrap="true" /> </panel> <text_chat - top="-35" left="10" right="-10" height="120" follows="left|right|bottom" - font="SansSerifSmall" text_color="white" word_wrap="true" - mouse_opaque="true" name="msg_text" > + top="-35" + left="10" + right="-10" + height="120" + follows="left|right|bottom" + text_color="white" + word_wrap="true" + mouse_opaque="true" + name="msg_text"> + To be or not to be, that is the question. Tis a far far better thing I do than I have ever done. Tis a far far better place I go, than I have ever been. </text_chat> </panel> - diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml new file mode 100644 index 0000000000000000000000000000000000000000..df889e87c3a5199a50aeb641d9b9573809868faa --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -0,0 +1,180 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="panel_classified_info" + top="0" + width="333"> + <panel.string + name="type_mature"> + Mature + </panel.string> + <panel.string + name="type_pg"> + PG Content + </panel.string> + <button + follows="top|right" + height="23" + image_overlay="BackArrow_Off" + layout="topleft" + name="back_btn" + picture_style="true" + left="10" + tab_stop="false" + top="2" + width="23" /> + <text + follows="top|left|right" + font="SansSerifHugeBold" + height="26" + layout="topleft" + left_pad="10" + name="title" + text_color="white" + top="0" + value="Classified Info" + use_ellipses="true" + width="275" /> + <scroll_container + color="DkGray2" + opaque="true" + follows="all" + height="500" + layout="topleft" + left="10" + top_pad="10" + name="profile_scroll" + reserve_scroll_corner="false" + width="313"> + <panel + name="scroll_content_panel" + follows="left|top" + min_height="300" + layout="topleft" + top="0" + background_visible="false" + height="500" + left="0" + width="295"> + <texture_picker + enabled="false" + follows="left|top" + height="197" + layout="topleft" + left="10" + name="classified_snapshot" + top="20" + width="290" /> + <text + follows="left|top|right" + height="35" + width="290" + layout="topleft" + font="SansSerifBig" + font.style="BOLD" + left="10" + top_pad="10" + name="classified_name" + text_color="white" + value="[name]" + use_ellipses="true" /> + <text + follows="left|top" + height="25" + layout="topleft" + left="10" + name="classified_location" + width="290" + word_wrap="true" + value="[loading...]" /> + <text + follows="left|top|right" + height="18" + layout="topleft" + left="10" + name="content_type" + width="290" + top_pad="5" + value="[content type]" /> + <text + follows="left|top|right" + height="18" + layout="topleft" + left="10" + name="category" + width="290" + top_pad="5" + value="[category]" /> + <check_box + enabled="false" + height="16" + label="Auto renew each week" + layout="topleft" + left="10" + name="auto_renew" + top_pad="5" + width="290" /> + <text + follows="left|top" + halign="left" + height="16" + layout="topleft" + left="10" + name="price_for_listing" + top_pad="5" + tool_tip="Price for listing." + width="105"> + L$[PRICE] + </text> + <text + follows="left|top|right" + height="200" + layout="topleft" + left="10" + name="classified_desc" + width="290" + value="[description]" + word_wrap="true" /> + </panel> + </scroll_container> + <panel + follows="left|right|bottom" + height="20" + layout="topleft" + top_pad="8" + left="10" + name="buttons"> + <button + follows="bottom|left" + height="19" + label="Teleport" + layout="topleft" + left="0" + name="teleport_btn" + top="0" + width="90" /> + <button + follows="bottom|left" + height="19" + label="Map" + layout="topleft" + left_pad="10" + name="show_on_map_btn" + top="0" + width="90" /> + <button + follows="bottom|left" + height="19" + label="Edit" + layout="topleft" + right="-1" + name="edit_btn" + top="0" + width="90" /> + </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 new file mode 100644 index 0000000000000000000000000000000000000000..ee333be0cb0cfca2a1892ba7d14f42519f1eef2a --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + bevel_style="none" + follows="top|left|right" + height="85" + layout="topleft" + left="0" + name="classified_item" + top="0" + width="313"> + <icon + follows="all" + height="85" + image_name="ListItem_Over" + right="-3" + mouse_opaque="false" + name="hovered_icon" + top="1" + scale_image="true" + visible="false" + width="307"/> + <icon + follows="all" + height="85" + image_name="ListItem_Select" + right="-3" + mouse_opaque="false" + name="selected_icon" + top="1" + scale_image="true" + visible="false" + width="307"/> + <texture_picker + allow_no_texture="true" + border_enabled="true" + default_image_name="TabIcon_Places_Large" + enabled="false" + follows="left|top" + height="80" + layout="topleft" + left="10" + mouse_opaque="false" + name="picture" + tab_stop="false" + top="10" + top_pad="10" + width="90" /> + <text + follows="top|left|right" + font="SansSerifSmallBold" + height="16" + layout="topleft" + left="110" + name="name" + text_color="white" + top="9" + use_ellipses="false" + width="197" + word_wrap="false" /> + <expandable_text + follows="top|left|right" + font="SansSerifSmall" + height="40" + layout="topleft" + left="110" + name="description" + top_pad="3" + width="178" + word_wrap="true" /> + <button + follows="top|right" + height="16" + image_selected="BuyArrow_Press" + image_pressed="BuyArrow_Press" + image_unselected="BuyArrow_Press" + layout="topleft" + name="info_chevron" + picture_style="true" + right="-7" + tab_stop="false" + top="27" + width="16" /> +</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 new file mode 100644 index 0000000000000000000000000000000000000000..2f3277804f3d4278bbf5fc973bd5641d8bb82dbc --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -0,0 +1,255 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bevel_style="in" + follows="left|top|right|bottom" + height="570" + label="Edit Classified" + layout="topleft" + left="0" + min_height="350" + name="panel_edit_classified" + 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" + layout="topleft" + name="back_btn" + picture_style="true" + left="10" + tab_stop="false" + top="2" + width="23" /> + <text + type="string" + length="1" + follows="top" + font="SansSerifHuge" + height="15" + layout="topleft" + left_pad="10" + name="title" + text_color="white" + top="5" + 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"> + <panel + name="scroll_content_panel" + follows="left|top" + min_height="300" + layout="topleft" + top="0" + background_visible="false" + height="600" + 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" + layout="topleft" + right="-5" + name="edit_icon" + label="" + tool_tip="Click to select an image" + top="27" + width="18" /> + <text + type="string" + length="1" + follows="left|top" + height="15" + font="SansSerifSmall" + font.style="BOLD" + layout="topleft" + left="10" + top="215" + name="Name:" + text_color="white" + width="290"> + Title: + </text> + <line_editor + follows="left|top|right" + font="SansSerif" + height="20" + layout="topleft" + left="10" + top_pad="2" + max_length="63" + name="classified_name" + text_color="black" + width="290" /> + <text + type="string" + length="1" + follows="left|top" + height="15" + font="SansSerifSmall" + font.style="BOLD" + layout="topleft" + left="10" + top_pad="20" + name="description_label" + text_color="white" + width="290"> + Description: + </text> + <text_editor + follows="left|top|right" + height="100" + width="290" + hide_scrollbar="false" + layout="topleft" + left="10" + top_pad="2" + max_length="1023" + name="classified_desc" + text_color="black" + word_wrap="true" /> + <text + type="string" + length="1" + font="SansSerifSmall" + font.style="BOLD" + follows="left|top" + height="15" + layout="topleft" + left="10" + name="location_label" + text_color="white" + top_pad="20" + width="290"> + Location: + </text> + <text + type="string" + length="1" + follows="left|top" + height="50" + layout="topleft" + left="10" + name="classified_location" + right="-10" + top_pad="2" + width="290" + word_wrap="true"> + loading... + </text> + <button + follows="left|top" + height="20" + label="Set to Current Location" + layout="topleft" + left="8" + top_pad="5" + name="set_to_curr_location_btn" + width="200" /> + <combo_box + follows="left|top" + height="18" + label="" + left="10" + name="category" + top_pad="5" + width="200" /> + <combo_box + allow_text_entry="false" + follows="left|top" + height="18" + left="10" + name="content_type" + top_pad="5" + width="200"> + <combo_item + name="mature_ci" + value="Mature"> + Mature Content + </combo_item> + <combo_item + name="pg_ci" + value="PG"> + PG Content + </combo_item> + </combo_box> + <spinner + decimal_digits="0" + follows="left|top" + halign="left" + height="16" + increment="1" + label_width="20" + label="L$" + layout="topleft" + left="10" + value="50" + min_val="50" + max_val="99999" + name="price_for_listing" + top_pad="5" + tool_tip="Price for listing." + width="105" /> + <check_box + height="16" + label="Auto renew each week" + layout="topleft" + left="10" + name="auto_renew" + top_pad="5" + width="250" /> + </panel> + </scroll_container> + <panel + follows="left|right|bottom" + height="20" + label="bottom_panel" + layout="topleft" + left="10" + name="bottom_panel" + top_pad="5" + width="303"> + <button + follows="bottom|left" + height="19" + label="Save" + layout="topleft" + name="save_changes_btn" + left="0" + top="0" + width="130" /> + <button + follows="bottom|left" + height="19" + label="Cancel" + layout="topleft" + name="cancel_btn" + left_pad="5" + right="-1" + width="130" /> + </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 f4a212ba0a6def2276b0f6fae7922b8e6139f86e..d6de5af32d3808aa92d4f9898ae8dbba71881527 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -53,7 +53,7 @@ layout="topleft" top="0" background_visible="false" - height="470" + height="510" left="0" width="295"> <texture_picker 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 2378ae518bf9dbd583d969613fd4c0dca6443fcd..a833ad97d9d1728e6905373a309da6270e3199d6 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml @@ -15,6 +15,10 @@ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] </string> + <string + name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> <string name="AcctTypeResident" value="Resident" /> 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 763dd7b922055ac2aa41c6bebc22e829e836cc65..41b210557e2b85f4af5717646cee35e6515374f8 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 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" + follows="left|top|right|bottom" height="238" name="panel_im_control_panel" width="180"> @@ -8,7 +9,7 @@ <avatar_list color="DkGray2" follows="left|top|right|bottom" - height="130" + height="100" ignore_online_status="true" layout="topleft" left="3" @@ -22,6 +23,7 @@ <button bottom_pad="0" + follows="left|right|bottom" height="20" label="Group Info" left_delta="28" @@ -32,8 +34,7 @@ background_visible="true" bg_alpha_color="0.2 0.2 0.2 1" border="false" - bottom="1" - follows="left|bottom" + follows="left|right|bottom" height="70" left="0" left_pad="0" @@ -43,6 +44,7 @@ <button bottom="10" + follows="all" height="20" label="Call Group" left_delta="28" @@ -51,6 +53,7 @@ <button bottom="40" + follows="all" height="20" label="Leave Call" name="end_call_btn" @@ -60,6 +63,7 @@ <button enabled="false" bottom="10" + follows="all" height="20" label="Open Voice Controls" name="voice_ctrls_btn" 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 4f24c7a745b62232b734cb28ccdf2319fcc8505a..4c30db4034b24ad5e61d884284ded86bc97cc651 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="380" + height="378" label="General" class="panel_group_general" layout="topleft" left="0" top="0" name="general_tab" - width="303"> + width="310"> <panel.string name="help_text"> The General tab contains general information about this group, a list of members, general Group Preferences and member options. @@ -32,7 +32,7 @@ Hover your mouse over the options for more help. max_length="511" name="charter" top="5" - width="303" + width="305" word_wrap="true"> Group Charter </text_editor> @@ -40,13 +40,13 @@ Hover your mouse over the options for more help. column_padding="0" draw_heading="true" follows="left|top" - heading_height="16" + heading_height="20" height="130" layout="topleft" - left_delta="0" + left="0" name="visible_members" - top_pad="0" - width="303"> + top_pad="2" + width="310"> <name_list.columns label="Member" name="name" @@ -59,12 +59,12 @@ Hover your mouse over the options for more help. <text follows="left|top" type="string" - height="14" + height="12" layout="topleft" - left_delta="0" + left="5" name="active_title_label" top_pad="5" - width="303"> + width="300"> My Title </text> <combo_box @@ -75,7 +75,7 @@ Hover your mouse over the options for more help. name="active_title" tool_tip="Sets the title that appears in your avatar's name tag when this group is active." top_pad="2" - width="303" /> + width="300" /> <check_box height="16" font="SansSerifSmall" @@ -85,7 +85,7 @@ Hover your mouse over the options for more help. name="receive_notices" tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you." top_pad="5" - width="303" /> + width="300" /> <check_box height="16" label="Show in my profile" @@ -94,19 +94,19 @@ Hover your mouse over the options for more help. name="list_groups_in_profile" tool_tip="Sets whether you want to show this group in your profile" top_pad="5" - width="303" /> + width="295" /> <panel background_visible="true" bevel_style="in" border="true" bg_alpha_color="FloaterUnfocusBorderColor" follows="left|top" - height="93" + height="90" layout="topleft" left="5" name="preferences_container" top_pad="5" - width="303"> + width="300"> <check_box follows="right|top" height="16" @@ -140,7 +140,7 @@ Hover your mouse over the options for more help. left_pad="2" name="spin_enrollment_fee" tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked." - width="105" /> + width="100" /> <check_box height="16" initial_value="true" @@ -157,7 +157,7 @@ Hover your mouse over the options for more help. left_delta="0" name="group_mature_check" tool_tip="Sets whether your group information is considered mature" - top_pad="5" + top_pad="2" width="190"> <combo_box.item label="PG Content" 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 de1323d9cb51dee368e5d5a0178cba375c61b462..c0db734f8c165e3fac37ecb4639b72adef576690 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 @@ -2,14 +2,14 @@ <panel background_visible="true" follows="all" - height="570" + height="635" label="Group Info" layout="topleft" - min_height="425" + min_height="460" left="0" top="20" name="GroupInfo" - width="333"> + width="323"> <panel.string name="default_needs_apply_text"> There are unsaved changes to the current tab @@ -116,85 +116,49 @@ background_visible="true" visible="true" width="120" /> <accordion + single_expansion="true" follows="all" - height="425" + height="478" layout="topleft" left="0" name="groups_accordion" - top_pad="15" - width="336"> + top_pad="10" + width="323"> <accordion_tab - expanded="true" - layout="topleft" - name="group_general_tab" - title="General"> - <scroll_container - color="DkGray2" - opaque="true" - height="323" - follows="all" - layout="topleft" - left="0" - top="0" - name="general_scroll" - reserve_scroll_corner="false" - width="333"> + expanded="false" + layout="topleft" + name="group_general_tab" + title="General"> <panel - border="false" - class="panel_group_general" + border="false" + class="panel_group_general" filename="panel_group_general.xml" layout="topleft" left="0" help_topic="group_general_tab" - name="group_general_tab_panel" - top="0" - width="303" /> - </scroll_container> + name="group_general_tab_panel" + top="0" /> </accordion_tab> <accordion_tab - expanded="false" - layout="topleft" - name="group_roles_tab" - title="Roles"> - <scroll_container - color="DkGray2" - opaque="true" - height="323" - follows="all" - layout="topleft" - left="0" - top="0" - name="roles_scroll" - reserve_scroll_corner="false" - width="333"> - <panel - border="false" - class="panel_group_roles" - filename="panel_group_roles.xml" - layout="topleft" - left="0" - help_topic="group_roles_tab" - name="group_roles_tab_panel" - top="0" - width="303" /> - </scroll_container> + expanded="true" + layout="topleft" + name="group_roles_tab" + title="Roles"> + <panel + border="false" + class="panel_group_roles" + filename="panel_group_roles.xml" + layout="topleft" + left="0" + help_topic="group_roles_tab" + name="group_roles_tab_panel" + top="0" /> </accordion_tab> <accordion_tab expanded="false" layout="topleft" name="group_notices_tab" title="Notices"> - <scroll_container - color="DkGray2" - opaque="true" - height="323" - follows="all" - layout="topleft" - left="0" - top="0" - name="notices_scroll" - reserve_scroll_corner="false" - width="333"> <panel border="false" class="panel_group_notices" @@ -203,26 +167,13 @@ background_visible="true" left="0" help_topic="group_notices_tab" name="group_notices_tab_panel" - top="0" - width="303" /> - </scroll_container> + top="0" /> </accordion_tab> <accordion_tab expanded="false" layout="topleft" name="group_land_tab" title="Land/Assets"> - <scroll_container - color="DkGray2" - opaque="true" - height="323" - follows="all" - layout="topleft" - left="0" - top="0" - name="land_scroll" - reserve_scroll_corner="false" - width="333"> <panel border="false" class="panel_group_land_money" @@ -231,22 +182,25 @@ background_visible="true" left="0" help_topic="group_land_money_tab" name="group_land_tab_panel" - top="0" - width="313" /> - </scroll_container> + top="0" /> </accordion_tab> </accordion> + <panel + name="button_row" + height="23" + follows="bottom|left" + top_pad="-1" + width="323"> <button follows="top|left" height="22" image_overlay="Refresh_Off" layout="topleft" - left="5" + left="10" name="btn_refresh" - top_pad="-15" width="23" /> - <button - height="20" + <button + height="22" label="Create" label_selected="New group" name="btn_create" @@ -262,12 +216,12 @@ background_visible="true" visible="false" width="65" />--> <button - height="20" - font="SansSerifSmall" + height="22" label="Save" label_selected="Save" name="btn_apply" left_pad="10" right="-10" - width="65" /> + width="100" /> + </panel> </panel> \ No newline at end of file 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 1996977acb565633a428c38f95e4a4b2c4d7f857..37578eae7038b7fea6b99f0ce2db9d45bf056357 100644 --- a/indra/newview/skins/default/xui/en/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml @@ -33,7 +33,6 @@ invite to your group. Click 'Open Resident Chooser' to start. </text> <button - font="SansSerifSmall" height="20" label="Open Resident Chooser" layout="topleft" @@ -53,7 +52,6 @@ Resident Chooser' to start. top_pad="4" width="200" /> <button - font="SansSerifSmall" height="20" label="Remove Selected from List" layout="topleft" @@ -82,7 +80,6 @@ Resident Chooser' to start. top_delta="16" width="196" /> <button - font="SansSerifSmall" height="20" label="Send Invitations" layout="topleft" @@ -91,7 +88,6 @@ Resident Chooser' to start. top="356" width="130" /> <button - font="SansSerifSmall" height="20" label="Cancel" layout="topleft" 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 0c6f81f8fd892ea9f8681e4638237822b5caafbf..2075d7e05b518abbce55a73d3e0b5f81124a87d7 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 @@ -2,16 +2,16 @@ <panel border="false" follows="all" - height="510" + height="380" label="Land & L$" layout="topleft" - left="1" + left="0" name="land_money_tab" top="0" - width="313"> + width="310"> <panel.string name="help_text"> - Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution. + A warning appears until the Total Land in Use is less than or = to the Total Contribution. </panel.string> <panel.string name="cant_view_group_land_text"> @@ -43,14 +43,14 @@ </text> --> <scroll_list draw_heading="true" - follows="top" + follows="top|left|right" heading_height="20" - height="150" + height="130" layout="topleft" left="0" + top="0" name="group_parcel_list" - top_pad="0" - width="313"> + width="310"> <scroll_list.columns label="Parcel" name="name" @@ -72,34 +72,22 @@ name="hidden" width="-1" /> </scroll_list> - <button - follows="top" - height="23" - label="Map" - label_selected="Map" - layout="topleft" - name="map_button" - right="-10" - top_pad="5" - width="95" - enabled="false" /> <text type="string" follows="left|top" halign="right" - height="16" + height="15" layout="topleft" - left="5" + left="0" name="total_contributed_land_label" - top_pad="0" width="130"> - Total Contribution: + Total contribution: </text> <text text_color="EmphasisColor" type="string" follows="left|top" - height="16" + height="15" layout="topleft" left_pad="5" name="total_contributed_land_value" @@ -107,23 +95,34 @@ width="120"> [AREA] m² </text> + <button + follows="top" + height="20" + label="Map" + label_selected="Map" + layout="topleft" + name="map_button" + right="-5" + left_pad="0" + width="95" + enabled="false" /> <text type="string" follows="left|top" halign="right" - height="16" + height="15" layout="topleft" - left="5" + left="0" name="total_land_in_use_label" top_pad="0" width="130"> - Total Land In Use: + Total land in use: </text> <text text_color="EmphasisColor" type="string" follows="left|top" - height="16" + height="15" layout="topleft" left_pad="5" name="total_land_in_use_value" @@ -135,19 +134,19 @@ type="string" follows="left|top" halign="right" - height="16" + height="15" layout="topleft" - left="5" + left="0" name="land_available_label" top_pad="0" width="130"> - Land Available: + Land available: </text> <text text_color="EmphasisColor" type="string" follows="left|top" - height="16" + height="15" layout="topleft" left_pad="5" name="land_available_value" @@ -159,17 +158,15 @@ type="string" follows="left|top" halign="right" - height="16" + height="15" layout="topleft" - left="5" + left="0" name="your_contribution_label" top_pad="0" width="130"> - Your Contribution: + Your contribution: </text> <line_editor - border_style="line" - border_thickness="1" follows="left|top" height="19" layout="topleft" @@ -177,7 +174,7 @@ max_length="10" name="your_contribution_line_editor" top_delta="0" - width="95" /> + width="80" /> <text type="string" follows="left|top" @@ -185,14 +182,16 @@ layout="topleft" left_pad="3" name="your_contribution_units" - top_delta="2"> + top_delta="2" + width="40" + > m² </text> <text type="string" follows="left|top" halign="right" - height="16" + height="12" layout="topleft" left="140" name="your_contribution_max_value" @@ -201,27 +200,27 @@ ([AMOUNT] max) </text> <icon - height="16" - image_name="notify_next" + height="18" + image_name="BuyArrow_Over" layout="topleft" - left="9" + left="75" name="group_over_limit_icon" top_pad="0" - visible="false" - width="16" /> + visible="true" + width="18" /> <text - follows="left|top" + follows="left|top" type="string" word_wrap="true" font="SansSerifSmall" - height="35" + height="20" layout="topleft" - left_pad="0" + left_pad="2" name="group_over_limit_text" text_color="EmphasisColor" top_delta="0" - width="290"> - Group members must contribute more land credits to support land in use + width="213"> + More land credits are needed to support land in use </text> <text type="string" @@ -229,29 +228,29 @@ font="SansSerifBig" height="16" layout="topleft" - left="10" + left="0" name="group_money_heading" text_color="EmphasisColor" - top_pad="0" - width="150"> + top_pad="-15" + width="100"> Group L$ </text> <tab_container follows="all" - height="200" + height="173" halign="center" layout="topleft" - left="10" + left="0" name="group_money_tab_container" tab_position="top" tab_height="20" top_pad="2" - tab_min_width="70" - width="300"> + tab_min_width="75" + width="310"> <panel border="false" follows="all" - height="180" + height="173" label="PLANNING" layout="topleft" left="0" @@ -262,13 +261,12 @@ <text_editor type="string" follows="all" - font="SansSerif" height="140" layout="topleft" left="0" max_length="4096" name="group_money_planning_text" - top="0" + top="2" width="300" word_wrap="true"> Loading... @@ -277,13 +275,13 @@ <panel border="false" follows="all" - height="180" + height="173" label="DETAILS" layout="topleft" left="0" help_topic="group_money_details_tab" name="group_money_details_tab" - top="5" + top="0" width="300"> <text_editor type="string" @@ -293,41 +291,41 @@ left="0" max_length="4096" name="group_money_details_text" - top="0" + top="2" width="300" word_wrap="true"> Loading... </text_editor> <button follows="left|top" - height="23" + height="18" image_overlay="Arrow_Left_Off" layout="topleft" name="earlier_details_button" tool_tip="Back" - top_pad="3" - right="-35" - width="31" /> + right="-45" + bottom="0" + width="25" /> <button follows="left|top" - height="23" + height="18" image_overlay="Arrow_Right_Off" layout="topleft" left_pad="10" name="later_details_button" tool_tip="Next" - width="31" /> + width="25" /> </panel> <panel border="false" follows="all" - height="180" + height="173" label="SALES" layout="topleft" left_delta="0" help_topic="group_money_sales_tab" name="group_money_sales_tab" - top_delta="-1" + top="0" width="300"> <text_editor type="string" @@ -337,30 +335,30 @@ left="0" max_length="4096" name="group_money_sales_text" - top="0" + top="2" width="300" word_wrap="true"> Loading... </text_editor> <button + bottom="0" follows="left|top" - height="23" + height="18" image_overlay="Arrow_Left_Off" layout="topleft" name="earlier_sales_button" tool_tip="Back" - top_pad="3" - right="-35" - width="31" /> + right="-45" + width="25" /> <button follows="left|top" - height="23" + height="18" image_overlay="Arrow_Right_Off" layout="topleft" left_pad="10" - name="later_sales_button" + name="later_sales_button" tool_tip="Next" - width="31" /> + width="25" /> </panel> </tab_container> </panel> 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 24a4005a4595c256e6bc54678076e7648cd92372..0dea81eefe068caa55b8c1be1ce66791a36371df 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -1,20 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="485" + height="463" label="Notices" layout="topleft" left="0" name="notices_tab" top="0" - width="313"> + width="310"> <panel.string name="help_text"> - Notices are a quick way to communicate across a -group by broadcasting a message and delivering + Notices let you send a message and an optionally attached item. Notices only go to -group members in Roles granted the ability to -receive Notices. You can turn off Notices on +group members in Roles with the ability to +receive Notices. You can turn off Notices on the General tab. </panel.string> <panel.string @@ -25,14 +24,15 @@ the General tab. follows="left|top" type="string" word_wrap="true" - height="30" + height="24" + halign="right" layout="topleft" - left="10" + left="5" name="lbl2" top="5" width="300"> Notices are kept for 14 days -Groups are limited to 200 notices/group daily +Maximum 200 per group daily </text> <scroll_list follows="left|top" @@ -41,10 +41,10 @@ Groups are limited to 200 notices/group daily heading_height="16" height="125" layout="topleft" - left="0" + left="2" name="notice_list" top_pad="0" - width="303"> + width="300"> <scroll_list.columns label="" name="icon" @@ -52,15 +52,15 @@ Groups are limited to 200 notices/group daily <scroll_list.columns label="Subject" name="subject" - width="125" /> + width="110" /> <scroll_list.columns label="From" name="from" - width="90" /> + width="100" /> <scroll_list.columns label="Date" name="date" - width="30" /> + width="60" /> <scroll_list.columns name="sort" width="-1" /> @@ -81,10 +81,10 @@ Groups are limited to 200 notices/group daily image_disabled="AddItem_Disabled" layout="topleft" label="Create a new notice" - left="15" + left="5" name="create_new_notice" tool_tip="Create a new notice" - top_delta="-5" + top_delta="-3" width="18" /> <button follows="top|left" @@ -93,18 +93,18 @@ Groups are limited to 200 notices/group daily layout="topleft" name="refresh_notices" right="-5" - top_delta="5" + top_delta="0" width="23" /> <panel follows="left|top" - height="300" + height="280" label="Create New Notice" layout="topleft" left="0" - top_pad="10" - visible="false" + top_pad="0" + visible="true" name="panel_create_new_notice" - width="303"> + width="300"> <text follows="left|top" type="string" @@ -216,31 +216,31 @@ Groups are limited to 200 notices/group daily follows="left|top" height="23" label="Send" - label_selected="Send Notice" + label_selected="Send" layout="topleft" right="-10" - top_pad="20" + top_pad="10" name="send_notice" width="100" /> <group_drop_target - height="466" - top="0" - left="0" + height="95" + top="160" + left="10" layout="topleft" name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." - width="295" /> - </panel> + width="280" /> + </panel> <panel follows="left|top" - height="300" + height="280" label="View Past Notice" layout="topleft" left="0" - visible="true" + visible="false" name="panel_view_past_notice" top="180" - width="303"> + width="300"> <text type="string" font="SansSerifBig" @@ -303,7 +303,7 @@ Groups are limited to 200 notices/group daily </text> <text_editor enabled="false" - height="205" + height="160" layout="topleft" left="10" max_length="511" @@ -319,7 +319,7 @@ Groups are limited to 200 notices/group daily max_length="63" mouse_opaque="false" name="view_inventory_name" - top_pad="10" + top_pad="8" width="285" /> <icon height="16" diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml index ef3120174e8cb3337ff91ac1366f13df3c75b6b9..9b0b81cd0a2790041e53c474ed4cfc9bcae5ca37 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml @@ -1,77 +1,101 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel background_visible="true" bevel_style="in" bg_alpha_color="0 0 0 0" - height="155" label="instant_message" layout="topleft" left="0" - name="panel_group_notify" top="0" width="350"> +<panel + background_visible="true" + height="90" + label="instant_message" + layout="topleft" + left="0" + name="panel_group_notify" + top="0" + width="305"> <string - name="message_max_lines_count"> - 4 - </string> - <panel follows="top" background_visible="true" bevel_style="in" bg_alpha_color="black" - height="30" label="header" layout="topleft" left="0" name="header" - top="0" width="350"> - <icon follows="left|top|right|bottom" height="20" width="20" layout="topleft" - top="5" left="5" mouse_opaque="true" name="group_icon"/> - <text type="string" length="1" follows="left|top|right|bottom" - font="SansSerifBigBold" height="20" layout="topleft" left_pad="10" name="title" - text_color="GroupNotifyTextColor" top="5" width="275" use_ellipses="true"> - Sender Name / Group Name - </text> - </panel> - <text + name="message_max_lines_count" + value="7" /> + <string + name="subject_font" + value="SANSSERIF_BIG" /> + <string + name="date_font" + value="SANSSERIF" /> + <panel + background_visible="true" follows="top" - height="20" + height="30" + label="header" + layout="topleft" + left="0" + name="header" + top="0" + width="305"> + <icon + follows="all" + height="20" + layout="topleft" + left="5" + mouse_opaque="true" + name="group_icon" + top="5" + width="20" /> + <text + follows="all" + font="SansSerifBig" + height="20" + layout="topleft" + left_pad="10" + name="title" + text_color="GroupNotifyTextColor" + top="5" + use_ellipses="true" + value="Sender Name / Group Name" + width="230" /> + </panel> + <text_editor + allow_html="true" + enabled="true" + follows="all" + height="0" layout="topleft" left="25" - name="subject" + max_length="2147483647" + name="message" + parse_highlights="true" + read_only="true" text_color="GroupNotifyTextColor" - font="SansSerifBig" top="40" + type="string" use_ellipses="true" - value="subject" - width="300" - word_wrap="true"> - subject - </text> - <text - follows="top" - height="20" + value="message" + width="270" + word_wrap="true" > + </text_editor> + <icon + bottom="60" + follows="left|bottom|right" + height="15" layout="topleft" left="25" - name="datetime" - text_color="GroupNotifyTextColor" - font="SansSerif" - top="80" - use_ellipses="true" - value="datetime" - width="300" - word_wrap="true"> - datetime - </text> + mouse_opaque="true" + name="attachment_icon" + width="15" /> <text - follows="left|top|bottom|right" - height="0" + bottom="60" + follows="left|bottom|right" + font="SansSerif" + height="15" layout="topleft" - left="25" - name="message" + left="45" + name="attachment" text_color="GroupNotifyTextColor" - top="100" + value="Attachment" use_ellipses="true" - value="message" - width="300" - word_wrap="true" - visible="true" > - </text> - <icon - follows="left|bottom|right" height="15" width="15" - layout="topleft" bottom="122" left="25" mouse_opaque="true" name="attachment_icon" visible="true" - /> - <text font="SansSerif" font.style="UNDERLINE" font_shadow="none" - type="string" length="1" follows="left|bottom|right" layout="topleft" - left="45" bottom="122" height="15" width="280" name="attachment" - text_color="GroupNotifyTextColor" visible="true"> - Attachment - </text> - - <button label="OK" layout="topleft" bottom="145" left="140" height="20" - width="70" name="btn_ok" follows="bottom" /> -</panel> \ No newline at end of file + width="250" /> + <button + bottom="85" + follows="bottom" + height="20" + label="Ok" + layout="topleft" + right="-10" + name="btn_ok" + width="70" /> +</panel> 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 4129d7b44881e35e27a8c762a44c8da06151edca..5bae5c2711a38cb676d8e08e4733f972ab42f58b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,39 +1,40 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - border="false" + follows="all" height="552" label="Members & Roles" layout="topleft" left="0" top="0" name="roles_tab" - width="313"> + width="310"> <panel.string name="default_needs_apply_text"> There are unsaved changes to the current tab </panel.string> <panel.string name="want_apply_text"> - Do you want to save these changes? + Do you want to save your changes? </panel.string> <panel.string name="help_text" /> <tab_container border="false" follows="left|top" - height="245" + height="552" halign="center" layout="topleft" - left="5" + left="0" name="roles_tab_container" tab_position="top" tab_height="20" - tab_min_width="96" - top="3" - width="303"> + tab_min_width="75" + top="0" + width="310"> <panel border="false" - height="220" + follows="all" + height="303" label="MEMBERS" layout="topleft" left="0" @@ -41,7 +42,7 @@ name="members_sub_tab" tool_tip="Members" class="panel_group_members_subtab" - width="300"> + width="310"> <panel.string name="help_text"> You can add or remove Roles assigned to Members. @@ -50,29 +51,19 @@ clicking on their names. </panel.string> <filter_editor layout="topleft" - top="10" - left="4" + top="5" + left="5" width="280" height="20" - follows="left|top|right" + follows="top" max_length="250" label="Filter Members" name="filter_input" /> - <!-- <button - enabled="false" - font="SansSerifSmall" - height="20" - label="Show All" - layout="topleft" - left_pad="-90" - name="show_all_button" - top_delta="-6" - width="80" />--> <name_list column_padding="0" draw_heading="true" heading_height="20" - height="160" + height="240" follows="left|top" layout="topleft" left="0" @@ -83,53 +74,50 @@ clicking on their names. <name_list.columns label="Member" name="name" - relative_width="0.45" /> + relative_width="0.44" /> <name_list.columns - label="Donations" + label="Donation" name="donated" - relative_width="0.3" /> + relative_width="0.25" /> <name_list.columns - label="Online" + label="Status" name="online" - relative_width="0.2" /> + relative_width="0.15" /> </name_list> <button height="20" - font="SansSerifSmall" + follows="bottom|left" label="Invite" - layout="topleft" left="5" name="member_invite" - top_pad="3" width="100" /> <button height="20" - font="SansSerifSmall" label="Eject" - layout="topleft" left_pad="5" right="-5" name="member_eject" width="100" /> - <!--What is this?--> - <icon - height="16" - image_name="Inv_FolderClosed" - layout="topleft" - name="power_folder_icon" - visible="false" - width="16" /> </panel> <panel border="false" - height="220" + height="230" label="ROLES" layout="topleft" left="0" help_topic="roles_roles_tab" name="roles_sub_tab" class="panel_group_roles_subtab" - width="300"> + width="310"> + <!-- <button + enabled="false" + height="20" + label="Show All" + layout="topleft" + top="-65" + right="-5" + name="show_all_button" + width="100" />--> <panel.string name="help_text"> Roles have a title and an allowed list of Abilities @@ -139,7 +127,7 @@ including the Everyone and Owner Roles. </panel.string> <panel.string name="cant_delete_role"> - The 'Everyone' and 'Owners' Roles are special and cannot be deleted. + The 'Everyone' and 'Owners' Roles are special and can't be deleted. </panel.string> <panel.string name="power_folder_icon"> @@ -147,77 +135,64 @@ including the Everyone and Owner Roles. </panel.string> <panel.string name="power_all_have_icon"> - checkbox_enabled_true.tga + Checkbox_On </panel.string> <panel.string name="power_partial_icon"> - checkbox_enabled_false.tga + Checkbox_Off </panel.string> <filter_editor layout="topleft" - top="10" - left="4" + top="5" + left="5" width="280" height="20" follows="left|top|right" max_length="250" label="Filter Roles" name="filter_input" /> - <!-- - <button - enabled="false" - height="20" - label="Show All" - layout="topleft" - left_pad="0" - name="show_all_button" - top_delta="0" - width="80" /> --> <scroll_list column_padding="0" draw_heading="true" draw_stripes="false" follows="left|top" heading_height="20" - height="150" + height="170" layout="topleft" search_column="1" left="0" name="role_list" - top_pad="4" - width="300"> + top_pad="2" + width="310"> <scroll_list.columns label="Role" name="name" - width="80" /> + relative_width="0.45" /> <scroll_list.columns label="Title" name="title" - width="90" /> + relative_width="0.45" /> <scroll_list.columns - label="Members" + label="#" name="members" - width="95" /> + relative_width="0.15" /> </scroll_list> <button + follows="bottom|left" height="20" - font="SansSerifSmall" - label="Add Role" + label="New Role" layout="topleft" left="5" name="role_create" - top_pad="6" - width="125" /> + width="100" /> <button height="20" - font="SansSerifSmall" label="Delete Role" layout="topleft" left_pad="5" right="-5" name="role_delete" - top_delta="0" - width="125" /> + width="100" /> </panel> <panel border="false" @@ -229,7 +204,7 @@ including the Everyone and Owner Roles. name="actions_sub_tab" class="panel_group_actions_subtab" tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability." - width="300"> + width="310"> <panel.string name="help_text"> Abilities allow Members in Roles to do specific @@ -237,148 +212,120 @@ things in this group. There's a broad variety of Abilities. </panel.string> <filter_editor layout="topleft" - top="10" - left="4" + top="5" + left="5" width="280" height="20" follows="left|top|right" max_length="250" label="Filter Abilities" name="filter_input" /> - <!-- - <button - enabled="false" - font="SansSerifSmall" - height="20" - label="Show All" - layout="topleft" - left_pad="0" - name="show_all_button" - top_delta="0" - width="80" /> --> <scroll_list column_padding="0" draw_stripes="false" follows="left|top" - height="160" + height="200" layout="topleft" left="0" multi_select="true" name="action_list" search_column="1" tool_tip="Select an Ability to view more details" - top_pad="6" + top_pad="5" width="300"> <scroll_list.columns - label="" - name="icon" - width="16" /> - <scroll_list.columns - label="" name="action" - width="247" /> + width="300" /> </scroll_list> - <icon - height="16" - image_name="Inv_FolderClosed" - layout="topleft" - name="power_folder_icon" - visible="false" - width="16" /> </panel> </tab_container> <panel height="252" layout="topleft" follows="left|top" - left="10" + left="0" + mouse_opaque="false" name="members_footer" - top_pad="10" - top_delta="0" - width="300"> + top="300" + visible="false" + width="310"> <text type="string" - height="16" + height="14" layout="topleft" follows="left|top" left="0" name="static" top_pad="5" - width="295"> + width="300"> Assigned Roles </text> <scroll_list - draw_stripes="false" + draw_stripes="true" follows="left|top" - height="80" + height="90" layout="topleft" left="0" name="member_assigned_roles" top_pad="0" - width="295"> + width="300"> <scroll_list.columns label="" name="checkbox" - width="30" /> + width="20" /> <scroll_list.columns label="" name="role" - width="265" /> + width="270" /> </scroll_list> <text type="string" - height="16" + height="14" layout="topleft" follows="left|top" left="0" name="static2" top_pad="5" - width="295"> + width="285"> Allowed Abilities </text> <scroll_list - draw_stripes="false" - height="80" + draw_stripes="true" + height="90" layout="topleft" left="0" name="member_allowed_actions" search_column="2" tool_tip="For details of each allowed ability see the abilities tab" top_pad="0" - width="295"> - <scroll_list.columns - label="" - name="icon" - width="20" /> + width="300"> <scroll_list.columns label="" name="action" - width="275" /> + width="300" /> </scroll_list> </panel> <panel height="297" layout="topleft" - left="10" + left="0" name="roles_footer" top_delta="0" - top="245" + top="220" visible="false" - width="300"> + width="310"> <text type="string" - height="16" + height="14" layout="topleft" left="0" name="static" top="0" - width="140"> - Name + width="300"> + Role Name </text> <line_editor type="string" - border_style="line" - border_thickness="1" follows="left|top" height="20" layout="topleft" @@ -386,106 +333,97 @@ things in this group. There's a broad variety of Abilities. max_length="295" name="role_name" top_pad="0" - width="295"> - Employees + width="300"> </line_editor> <text type="string" - height="16" + height="14" layout="topleft" name="static3" top_pad="5" - width="295"> - Title + width="300"> + Role Title </text> <line_editor type="string" - border_style="line" - border_thickness="1" follows="left|top" height="20" layout="topleft" max_length="295" name="role_title" top_pad="0" - width="295"> - (waiting) + width="300"> </line_editor> <text type="string" - height="16" + height="14" layout="topleft" left="0" name="static2" top_pad="5" - width="100"> + width="200"> Description </text> <text_editor type="string" halign="left" - height="35" + height="50" layout="topleft" left="0" max_length="295" name="role_description" top_pad="0" - width="295" + width="300" word_wrap="true"> - (waiting) </text_editor> <text type="string" - height="16" + height="14" layout="topleft" follows="left|top" left="0" name="static4" top_pad="5" - width="295"> - Assigned Roles + width="300"> + Assigned Members </text> <name_list - draw_stripes="false" - height="50" + draw_stripes="true" + height="60" layout="topleft" left="0" name="role_assigned_members" top_pad="0" - width="295" /> + width="300" /> <check_box height="15" label="Reveal members" layout="topleft" name="role_visible_in_list" tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." - top_pad="3" - width="290" /> + top_pad="4" + width="300" /> <text type="string" - height="16" + height="13" layout="topleft" follows="left|top" left="0" name="static5" top_pad="5" - width="295"> + width="300"> Allowed Abilities </text> <scroll_list - draw_stripes="false" - height="50" + draw_stripes="true" + height="60" layout="topleft" left="0" name="role_allowed_actions" search_column="2" tool_tip="For details of each allowed ability see the abilities tab" top_pad="0" - width="295"> - <scroll_list.columns - label="" - name="icon" - width="20" /> + width="300"> <scroll_list.columns label="" name="checkbox" @@ -493,33 +431,27 @@ things in this group. There's a broad variety of Abilities. <scroll_list.columns label="" name="action" - width="250" /> + width="270" /> </scroll_list> </panel> <panel height="303" layout="topleft" - left="10" + left="0" name="actions_footer" top_delta="0" - top="245" + top="255" visible="false" - width="300"> - <text - type="string" - height="16" - layout="topleft" - name="static" - width="200"> - Ability description - </text> + width="310"> <text_editor + bg_readonly_color="Transparent" + text_readonly_color="EmphasisColor" + font="SansSerifSmall" type="string" enabled="false" halign="left" - height="80" + height="90" layout="topleft" - left_delta="0" max_length="512" name="action_description" top_pad="0" @@ -529,28 +461,28 @@ things in this group. There's a broad variety of Abilities. </text_editor> <text type="string" - height="16" + height="14" layout="topleft" - left_delta="0" + left="5" name="static2" top_pad="5" - width="295"> + width="300"> Roles with this ability </text> <scroll_list - height="60" + height="65" layout="topleft" - left="0" + left="5" name="action_roles" top_pad="0" - width="295" /> - <text + width="300" /> + <text type="string" - height="16" + height="14" layout="topleft" name="static3" top_pad="5" - width="295"> + width="300"> Members with this ability </text> <name_list @@ -558,6 +490,6 @@ things in this group. There's a broad variety of Abilities. layout="topleft" name="action_members" top_pad="0" - width="295" /> + width="300" /> </panel> </panel> 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 e81532ec3eb39f319a3bc5c36e26434d75b51767..73d843e6dd4821f3977d5d5b1c127bd84c4b13d3 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 @@ -1,101 +1,87 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" - height="350" + height="300" name="panel_im_control_panel" - width="131"> - + width="110"> <avatar_icon follows="left|top" - height="125" - left_delta="3" + height="100" + left_delta="5" name="avatar_icon" - top="-10" - width="125"/> - + top="-5" + width="100"/> <text follows="top|left|right" - font="SansSerifBig" - height="16" + font="SansSerifLarge" + height="22" layout="topleft" name="avatar_name" use_ellipses="true" value="Unknown" - width="125" /> - + width="100" /> <button - follows="left|bottom" + follows="left|top" height="20" - label="View Profile" + label="Profile" name="view_profile_btn" - width="125"/> - + width="100" /> <button - follows="left|bottom" + follows="left|top" height="20" label="Add Friend" name="add_friend_btn" - width="125"/> - + width="100" /> <button - follows="left|bottom" + follows="left|top" height="20" label="Teleport" name="teleport_btn" - width="125"/> - - <button - follows="left|bottom" + width="100" /> + <!-- <button + follows="left|top" height="20" label="Share" name="share_btn" - width="125"/> - - <button - follows="left|bottom" + width="100" />--> + <!--Removing pay button to save space - will update spec - verified by Erica/Steve --> + <!-- <button + follows="left|top" height="20" label="Pay" name="pay_btn" - width="125"/> - + width="100" />--> <panel background_visible="true" - bg_alpha_color="0.2 0.2 0.2 1" + bg_alpha_color="DkGray2" border="false" - bottom="1" + top_pad="10" follows="left|bottom" height="70" - left="0" - left_pad="0" + left="1" name="panel_call_buttons" - top_pad="0" - width="131"> - + width="109"> <button bottom="10" height="20" label="Call" - left_delta="3" + left_delta="5" name="call_btn" - width="125"/> - + width="100" /> <button - bottom="40" + bottom="35" height="20" label="Leave Call" name="end_call_btn" visible="false" - width="125"/> - + width="100" /> <button enabled="false" bottom="10" height="20" - label="Open Voice Controls" + label="Voice Controls" name="voice_ctrls_btn" visible="false" - width="125"/> - + width="100" /> </panel> - </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 26d8304551d543ea4aff4c9f8932ae0c74ab56c3..1e570bf207c6b809ac019526bc5ef02f0a4621f2 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_visible="true" - bg_alpha_color="0.3 0.3 0.3 0" height="175" label="im_panel" layout="topleft" @@ -18,7 +17,7 @@ bevel_style="in" bg_alpha_color="black" follows="top" - height="20" + height="24" label="im_header" layout="topleft" left="5" @@ -27,70 +26,70 @@ width="295"> <avatar_icon follows="right" - height="20" - image_name="icon_avatar_online.tga" + height="18" + image_name="Generic_Person" layout="topleft" - left="0" + left="3" mouse_opaque="true" name="avatar_icon" - top="0" - width="20" /> - <icon + top="3" + width="18" /> + <!--<icon follows="right" height="20" - image_name="icon_top_pick.tga" + image_name="" layout="topleft" - left="0" + left="3" mouse_opaque="true" name="sys_msg_icon" top="0" - width="20" /> + width="20" />--> <text follows="left|right" - font="SansSerifBold" - height="20" + font.style="BOLD" + height="12" layout="topleft" left_pad="5" name="user_name" text_color="white" - top="5" - value="Darth Vader" - width="295" /> + top="8" + use_ellipses="true" + value="Erica Vader" + width="212" /> <!-- TIME STAMP --> <text + font="SansSerifSmall" follows="right" - font="SansSerif" - height="20" + height="13" layout="topleft" halign="right" - left="245" + right="-5" name="time_box" - text_color="white" - top="5" + top="8" value="23:30" width="50" /> </panel> <text - follows="left|top|bottom|right" - height="86" + font="SansSerifSmall" + follows="all" + height="97" layout="topleft" left="10" name="message" text_color="white" top="33" use_ellipses="true" - value="MESSAGE" + value="" width="285" word_wrap="true" max_length="350" /> <button follows="bottom" - font="SansSerifBold" - height="25" + height="23" label="Reply" layout="topleft" - left="97" + left="100" name="reply" - top="137" - width="110" /> + top="144" + width="100" /> </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 0c24adfad5933cc3112ef6344a786571582dca92..a219e30b8bc8c28d5150aa3d87b429bf56145d12 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -43,6 +43,16 @@ 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> + <!-- Texture names for rating icons --> + <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 follows="top|right" height="23" @@ -77,8 +87,8 @@ width="313"> <panel bg_alpha_color="DkGray2" - follows="all" - height="533" + follows="left|top|right" + height="610" layout="topleft" left="0" min_height="300" @@ -125,6 +135,24 @@ top_pad="10" value="Du waltz die spritz" width="300" /> + <icon + follows="top|left" + height="16" + image_name="unknown" + layout="topleft" + left="10" + name="maturity_icon" + top_pad="10" + width="18" /> + <text + follows="left|top|right" + height="16" + layout="topleft" + left_pad="8" + name="maturity_value" + top_delta="0" + value="unknown" + width="268" /> <panel follows="left|top|right" height="55" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index f05684db10700adbcbf8a3178b153128fc4ad8c1..4b91dc6294d1e31a7a2e3a3406d5cc2ed8e34296 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -63,7 +63,7 @@ left="0" mouse_opaque="true" name="my_inventory_list" - start_folder="INVENTORY" + start_folder="My Inventory" width="380"/> </accordion_tab> <accordion_tab diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index cb5ec153875c28f18e5b9eae6c1934a57283ebbc..a9a02e8fc710c68e0caf2ddd478e42332aaa9f33 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -27,6 +27,7 @@ border_visible="false" bottom="600" follows="all" + hide_loading="true" left="0" name="login_html" start_url="" 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 fcee0ef95388c450a22d1a5be040e7b4b1c75035..a4149c174f111355a6b5aec21d32f86589870b67 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -1,467 +1,467 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="true" - follows="all" - height="400" - 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="12" - follows="left|top|right" - font="SanSerif" - height="20" - label="Filter" - layout="topleft" - left="15" - name="inventory search editor" - top="34" - width="300" /> - <tab_container - follows="left|top|right|bottom" - height="300" - layout="topleft" - left_delta="-4" - name="inventory filter tabs" - tab_position="top" - top_pad="4" - width="305"> - <inventory_panel - follows="left|top|right|bottom" - height="295" - label="All Items" - layout="topleft" - left="1" - name="All Items" - top="16" - width="290" /> - <inventory_panel - follows="left|top|right|bottom" - height="295" - label="Recent Items" - layout="topleft" - left_delta="0" - name="Recent Items" - top_delta="0" - width="290" /> - </tab_container> - - <panel - background_visible="true" - bevel_style="none" - bottom="0" - follows="left|right|bottom" - height="30" - layout="bottomleft" - 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="18" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="Inventory Menu" - top="15" - 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.ResetFilter" /> - </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 Note" - 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> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="400" + 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="12" + follows="left|top|right" + font="SanSerif" + height="20" + label="Filter" + layout="topleft" + left="15" + name="inventory search editor" + top="34" + width="300" /> + <tab_container + follows="left|top|right|bottom" + height="300" + layout="topleft" + left_delta="-4" + name="inventory filter tabs" + tab_position="top" + top_pad="4" + width="305"> + <inventory_panel + follows="left|top|right|bottom" + height="295" + label="All Items" + layout="topleft" + left="1" + name="All Items" + top="16" + width="290" /> + <inventory_panel + follows="left|top|right|bottom" + height="295" + label="Recent Items" + layout="topleft" + left_delta="0" + name="Recent Items" + top_delta="0" + width="290" /> + </tab_container> + + <panel + background_visible="true" + bevel_style="none" + bottom="0" + follows="left|right|bottom" + height="30" + layout="bottomleft" + 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="18" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="Inventory Menu" + top="15" + 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.ResetFilter" /> + </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 Note" + 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> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml new file mode 100644 index 0000000000000000000000000000000000000000..a99777848b88b125d5b625da9159fc0eb12188f0 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_me.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + border="false" + follows="all" + height="570" + label="My Profile" + layout="topleft" + left="0" + name="panel_me" + top="0" + width="333"> + <!--<text + type="string" + follows="top|left|right" + font="SansSerifHugeBold" + height="20" + layout="topleft" + left="15" + name="user_name" + text_color="white" + top="0" + mouse_opaque="true" + width="280"> + (Loading...) + </text> --> + <tab_container + follows="all" + height="575" + halign="center" + layout="topleft" + left="10" + name="tabs" + tab_min_width="95" + tab_height="30" + tab_position="top" + top_pad="10" + width="313"> + <panel + class="panel_my_profile" + filename="panel_my_profile.xml" + label="PROFILE" + help_topic="panel_my_profile_tab" + name="panel_profile" /> + <panel + class="panel_picks" + filename="panel_picks.xml" + label="PICKS" + help_topic="panel_my_picks_tab" + name="panel_picks" /> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml new file mode 100644 index 0000000000000000000000000000000000000000..fe3e010cf900da98a842a51246644c2da9ee43eb --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -0,0 +1,429 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="all" + height="535" + label="Profile" + layout="topleft" + left="0" + name="panel_profile" + top="0" + width="313"> + <string + name="CaptionTextAcctInfo"> + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] + </string> + <string + name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=en + </string> + <string + name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=en + </string> + <string + name="my_account_link_url" + value="http://secondlife.com/account" /> + <string + name="no_partner_text" + value="None" /> + <string + name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <scroll_container + color="DkGray2" + follows="all" + height="485" + layout="topleft" + name="profile_scroll" + reserve_scroll_corner="true" + opaque="true" + top="0" + width="313"> + <panel + name="scroll_content_panel" + follows="left|top|right" + height="485" + layout="topleft" + top="0" + left="0" + width="313"> + <panel + follows="left|top" + height="117" + layout="topleft" + left="10" + name="second_life_image_panel" + top="0" + width="280"> + <texture_picker + allow_no_texture="true" + default_image_name="None" + enabled="false" + follows="top|left" + height="117" + layout="topleft" + left="0" + name="2nd_life_pic" + top="10" + width="102" /> + <icon + height="102" + image_name="Blank" + layout="topleft" + name="2nd_life_edit_icon" + label="" + left="0" + tool_tip="Click the Edit Profile button below to change image" + top="10" + width="102" /> + <text + follows="left|top|right" + font.style="BOLD" + height="15" + layout="topleft" + left_pad="10" + name="title_sl_descr_text" + text_color="white" + top_delta="0" + value="[SECOND_LIFE]:" + width="165" /> + <expandable_text + follows="left|top|right" + height="95" + layout="topleft" + left="107" + textbox.max_length="512" + name="sl_description_edit" + top_pad="-3" + width="173" + expanded_bg_visible="true" + expanded_bg_color="DkGray"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. + </expandable_text> + </panel> + <panel + follows="left|top" + height="117" + layout="topleft" + top_pad="10" + left="10" + name="first_life_image_panel" + width="280"> + <texture_picker + allow_no_texture="true" + default_image_name="None" + enabled="false" + follows="top|left" + height="117" + layout="topleft" + left="0" + name="real_world_pic" + width="102" /> + <icon + height="102" + image_name="Blank" + layout="topleft" + name="real_world_edit_icon" + label="" + left="0" + tool_tip="Click the Edit Profile button below to change image" + top="4" + width="102" /> + <text + follows="left|top|right" + font.style="BOLD" + height="15" + layout="topleft" + left_pad="10" + name="title_rw_descr_text" + text_color="white" + top_delta="0" + value="Real World:" + width="165" /> + <expandable_text + follows="left|top|right" + height="95" + layout="topleft" + left="107" + textbox.max_length="512" + name="fl_description_edit" + top_pad="-3" + width="173" + expanded_bg_visible="true" + expanded_bg_color="DkGray"> + Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. + </expandable_text> + </panel> + + + <!-- <panel + name="lifes_images_panel" + follows="left|top|right" + height="244" + layout="topleft" + top="0" + left="0" + width="285"> + <panel + follows="left|top" + height="117" + layout="topleft" + left="10" + name="second_life_image_panel" + top="0" + width="285"> + <text + follows="left|top|right" + font.style="BOLD" + height="15" + layout="topleft" + left="0" + name="second_life_photo_title_text" + text_color="white" + value="[SECOND_LIFE]:" + width="170" /> + <texture_picker + allow_no_texture="true" + default_image_name="None" + enabled="false" + follows="top|left" + height="117" + layout="topleft" + left="0" + name="2nd_life_pic" + top_pad="0" + width="102" /> + </panel> + <icon + height="18" + image_name="AddItem_Off" + layout="topleft" + name="2nd_life_edit_icon" + label="" + left="87" + tool_tip="Click to select an image" + top="25" + width="18" /> + </panel> --> + + + + + <text + type="string" + follows="left|top" + font="SansSerifSmall" + font.style="BOLD" + height="15" + layout="topleft" + left="10" + name="me_homepage_text" + text_color="white" + top_pad="0" + width="280"> + Homepage: + </text> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="homepage_edit" + top_pad="0" + value="http://librarianavengers.org" + width="280" + word_wrap="false" + use_ellipses="true" + /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="title_member_text" + text_color="white" + top_pad="10" + value="Member Since:" + width="280" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="register_date" + value="05/31/1976" + width="280" + word_wrap="true" /> + <text + follows="left|top" + font.style="BOLD" + height="15" + layout="topleft" + left="10" + name="title_acc_status_text" + text_color="white" + top_pad="10" + value="Account Status:" + width="280" /> + <!-- <text + type="string" + follows="left|top" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="10" + name="my_account_link" + top_delta="0" + value="Go to Dashboard" + width="100"/> --> + <text + follows="left|top" + height="20" + layout="topleft" + left="10" + name="acc_status_text" + top_pad="0" + value="Resident. No payment info on file." + width="280" + word_wrap="true" /> + <text + follows="left|top" + font.style="BOLD" + height="15" + layout="topleft" + left="10" + name="title_partner_text" + text_color="white" + top_pad="5" + value="Partner:" + width="280" /> + <panel + follows="left|top" + height="15" + layout="topleft" + left="10" + name="partner_data_panel" + top_pad="0" + width="280"> + <text + follows="left|top" + height="10" + layout="topleft" + left="0" + name="partner_text" + top="0" + value="[FIRST] [LAST]" + width="280" + word_wrap="true" /> + </panel> + <text + follows="left|top" + font.style="BOLD" + height="15" + layout="topleft" + left="10" + name="title_groups_text" + text_color="white" + top_pad="8" + value="Groups:" + width="280" /> + <expandable_text + follows="left|top|bottom" + height="60" + layout="topleft" + left="10" + name="sl_groups" + top_pad="0" + width="280" + expanded_bg_visible="true" + expanded_bg_color="DkGray"> + Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. + </expandable_text> + </panel> + </scroll_container> + <panel + follows="bottom|left" + layout="topleft" + left="0" + name="profile_buttons_panel" + top_pad="2" + bottom="10" + height="19" + width="303"> + <button + follows="bottom|left" + height="19" + label="Add Friend" + layout="topleft" + left="0" + mouse_opaque="false" + name="add_friend" + top="5" + width="75" /> + <button + follows="bottom|left" + height="19" + label="IM" + layout="topleft" + name="im" + top="5" + left_pad="5" + width="45" /> + <button + follows="bottom|left" + height="19" + label="Call" + layout="topleft" + name="call" + left_pad="5" + top="5" + width="45" /> + <button + enabled="false" + follows="bottom|left" + height="19" + label="Map" + layout="topleft" + name="show_on_map_btn" + top="5" + left_pad="5" + width="45" /> + <button + follows="bottom|left" + height="19" + label="Teleport" + layout="topleft" + name="teleport" + left_pad="5" + top="5" + width="80" /> + </panel> + <panel + follows="bottom|left" + layout="topleft" + left="0" + top_pad="-17" + name="profile_me_buttons_panel" + visible="false" + height="19" + width="303"> + <button + follows="bottom|right" + height="19" + left="10" + label="Edit Profile" + name="edit_profile_btn" + width="130" /> + <button + follows="bottom|right" + height="19" + label="Edit Appearance" + left_pad="10" + name="edit_appearance_btn" + right="-10" + width="130" /> + </panel> +</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 a90337d31a20705a16c36e1de1d78faa6df65fcb..bf33b752d9c819cfe54a99ef1093dac484147acf 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -41,7 +41,6 @@ width="600"> <button follows="left|top" - font="SansSerifSmall" height="23" image_disabled="PushButton_Disabled" image_disabled_selected="PushButton_Disabled" @@ -58,7 +57,6 @@ <button follows="left|top" - font="SansSerifSmall" height="23" image_disabled="PushButton_Disabled" image_disabled_selected="PushButton_Disabled" @@ -74,7 +72,6 @@ width="31" /> <button follows="left|top" - font="SansSerifSmall" height="23" image_disabled="PushButton_Disabled" image_disabled_selected="PushButton_Disabled" 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 7128c200380d8385100370f6dc2dd7aa86428e5d..de612fbbc3117455b977bd338137a19004a41ca8 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 @@ -9,7 +9,7 @@ top="21" width="310"> <string name="min_width"> - 310 + 192 </string> <string name="max_width"> 320 @@ -23,11 +23,11 @@ layout="topleft" left_delta="7" left="0" - max_length="254" + max_length="512" name="chat_box" tool_tip="Press Enter to say, Ctrl+Enter to shout" - top="0" - width="250" /> + top="1" + width="279" /> <output_monitor auto_update="true" follows="right" @@ -37,17 +37,21 @@ left_pad="-24" mouse_opaque="true" name="chat_zone_indicator" - top="4" + top="1" visible="true" width="20" /> <button follows="right" is_toggle="true" - width="45" - top="0" + width="20" + top="1" layout="topleft" - left_pad="8" - label="Log" + left_pad="4" + image_disabled="ComboButton_UpOff" + image_unselected="ComboButton_UpOff" + image_selected="ComboButton_Up_On_Selected" + image_pressed="ComboButton_UpSelected" + image_pressed_selected="ComboButton_Up_On_Selected" height="23" name="show_nearby_chat" tool_tip="Shows/hides nearby chat log"> diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml index 34a185fb44a23bb1e672f8ce58a8c3a4330a6f8b..df37f9973ce8e88548fabdd6f44666368b2482e5 100644 --- a/indra/newview/skins/default/xui/en/panel_notification.xml +++ b/indra/newview/skins/default/xui/en/panel_notification.xml @@ -10,7 +10,7 @@ left="0" name="notification_panel" top="0" - height="10" + height="140" width="305"> <!-- THIS PANEL CONTROLS TOAST HEIGHT? --> <panel @@ -20,18 +20,18 @@ bg_alpha_color="0.3 0.3 0.3 0" bg_opaque_color="0.3 0.3 0.3 0" follows="left|right|top" - height="10" + height="100" label="info_panel" layout="topleft" left="0" name="info_panel" top="0" width="305"> - <!-- <text + <text border_visible="false" follows="left|right|top|bottom" font="SansSerif" - height="90" + height="85" layout="topleft" left="10" name="text_box" @@ -39,21 +39,21 @@ text_color="white" top="10" visible="false" - width="300" + width="285" wrap="true"/> <text border_visible="false" follows="left|right|top|bottom" font="SansSerifBold" - height="90" + height="85" layout="topleft" - left="45" + left="10" name="caution_text_box" text_color="1 0.82 0.46 1" - top="5" + top="10" visible="false" - width="300" - wrap="true"/> --> + width="285" + wrap="true"/> <text_editor h_pad="0" v_pad="0" @@ -63,6 +63,7 @@ enabled="false" follows="left|right|top|bottom" font="SansSerif" + height="85" layout="topleft" left="10" mouse_opaque="false" @@ -74,27 +75,19 @@ top="10" visible="false" width="285" - wrap="true"/> + wrap="true" + parse_highlights="true" + allow_html="true"/> </panel> <panel background_visible="false" follows="left|right|bottom" + height="40" label="control_panel" layout="topleft" left="0" left_delta="-38" name="control_panel" - top="20"> + top_pad="0"> </panel> - <!-- - <icon - follows="left|top" - height="32" - image_name="notify_tip_icon.tga" - layout="topleft" - left="8" - mouse_opaque="false" - name="info_icon" - top="20" - width="32" /> --> </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 new file mode 100644 index 0000000000000000000000000000000000000000..f511ec0d6fb94bcf242a64709d22cd19277a86e3 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel name="Outfits" + bottom="0" + height="326" + left="0" + width="310" + border="true" + follows="left|top|right|bottom"> + <inventory_panel + allow_multi_select="true" + border="true" + bottom="0" + follows="left|top|right|bottom" + height="326" + left="0" + mouse_opaque="true" + name="outfits_list" + width="310" + start_folder="My Outfits"/> + <button bottom="0" + halign="center" + height="16" + label=">" + enabled="false" + mouse_opaque="false" + name="selector" + width="20" + left="0" + visible="false" + follows="right|bottom" + tool_tip="View outfit properties"/> + <panel + background_visible="true" + bevel_style="none" + bottom="0" + follows="left|right|bottom" + height="30" + layout="bottomleft" + left="0" + visible="true" + name="bottom_panel" + width="310"> + <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> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml new file mode 100644 index 0000000000000000000000000000000000000000..c8c79f87615493e144e86e61d762156b1fc1babf --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + bottom="806" + layout="topleft" + left="0" + mouse_opaque="false" + name="menu_gear_default" + visible="false"> + <menu_item_call + label="New Outfit" + layout="topleft" + name="new"> + <on_click + function="panel_outfits_inventory_gear_default.Custom.Action" + parameter="new" /> + <on_enable + function="panel_outfits_inventory_gear_default.Enable" + parameter="new" /> + </menu_item_call> + <menu_item_call + label="Wear Outfit" + layout="topleft" + name="wear"> + <on_click + function="panel_outfits_inventory_gear_default.Custom.Action" + parameter="wear" /> + <on_enable + function="panel_outfits_inventory_gear_default.Enable" + parameter="wear" /> + </menu_item_call> + <menu_item_call + label="Delete Outfit" + layout="topleft" + name="delete"> + <on_click + function="panel_outfits_inventory_gear_default.Custom.Action" + parameter="delete" /> + <on_enable + function="panel_outfits_inventory_gear_default.Enable" + parameter="delete" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 15fdd73bdc14bc2b260701706db04b971a4ec10a..87861e790189c7a148d1a520fd6b7ae652e5c1c6 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -16,7 +16,7 @@ background_visible="true" value="No people" /> <string name="no_one_near" - value="No-one near" /> + value="No one near" /> <string name="no_friends_online" value="No friends online" /> @@ -107,7 +107,10 @@ background_visible="true" name="add_friend_btn" top_delta="0" tool_tip="Add selected resident to your friends List" - width="18" /> + width="18"> + <commit_callback + function="People.addFriend" /> + </button> </panel> </panel> <panel @@ -325,7 +328,10 @@ background_visible="true" name="add_friend_btn" top_delta="0" tool_tip="Add selected resident to your friends List" - width="18" /> + width="18"> + <commit_callback + function="People.addFriend" /> + </button> </panel> </panel> </tab_container> @@ -338,7 +344,6 @@ background_visible="true" width="313"> <button follows="bottom|left" - font="SansSerifSmall" top="4" left="0" height="19" @@ -349,7 +354,6 @@ background_visible="true" width="70" /> <button follows="bottom|left" - font="SansSerifSmall" top="4" left_pad="2" height="19" @@ -360,7 +364,6 @@ background_visible="true" width="45" /> <button follows="bottom|left" - font="SansSerifSmall" top="4" left_pad="2" height="19" @@ -371,7 +374,6 @@ background_visible="true" width="50" /> <button follows="left|top" - font="SansSerifSmall" top="4" left_pad="2" height="19" @@ -381,7 +383,6 @@ background_visible="true" width="60" /> <button follows="bottom|left" - font="SansSerifSmall" top="4" left_pad="2" height="19" @@ -392,7 +393,6 @@ background_visible="true" width="75" /> <button follows="bottom|left" - font="SansSerifSmall" top="4" left="0" height="19" @@ -403,7 +403,6 @@ background_visible="true" width="110" /> <button follows="bottom|left" - font="SansSerifSmall" top="4" left_pad="2" height="19" 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 cf18aa2d393746bc90feb0f25e441cc208885669..0cf2a7afc3110590cd66be4cfba6144b4a3390cb 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -103,7 +103,6 @@ name="buttons"> <button follows="bottom|left" - font="SansSerifSmall" height="19" label="Teleport" layout="topleft" @@ -113,7 +112,6 @@ width="90" /> <button follows="bottom|left" - font="SansSerifSmall" height="19" label="Map" layout="topleft" @@ -123,7 +121,6 @@ width="90" /> <button follows="bottom|left" - font="SansSerifSmall" height="19" label="Edit" layout="topleft" 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 7ff227ecb608a6aafe388ad98b7d9d279267e553..023b1fc81d77c26e53abc60b03beb2c35a38562e 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 @@ -12,24 +12,24 @@ follows="all" height="85" image_name="ListItem_Over" - right="-3" + right="-2" mouse_opaque="false" name="hovered_icon" top="1" scale_image="true" visible="false" - width="307"/> + width="308" /> <icon follows="all" height="85" image_name="ListItem_Select" - right="-3" + right="-2" mouse_opaque="false" name="selected_icon" top="1" scale_image="true" visible="false" - width="307"/> + width="308" /> <texture_picker allow_no_texture="true" border_enabled="true" @@ -47,36 +47,34 @@ width="90" /> <text follows="top|left|right" - font="SansSerifSmallBold" - height="16" + font="SansSerifSmall" + height="15" layout="topleft" left="110" name="picture_name" text_color="white" top="9" - use_ellipses="false" - width="197" + use_ellipses="true" + width="193" word_wrap="false" /> <expandable_text follows="top|left|right" font="SansSerifSmall" - height="40" + height="55" layout="topleft" - left="110" + left="103" name="picture_descr" - top_pad="3" + top_pad="0" width="178" word_wrap="true" /> - <button - follows="top|right" - height="16" - image_selected="BuyArrow_Press" - image_pressed="BuyArrow_Press" - image_unselected="BuyArrow_Press" + <button + follows="right" + height="20" + image_overlay="ForwardArrow_Off" layout="topleft" + left_pad="5" + right="-8" name="info_chevron" - right="-7" - tab_stop="false" - top="27" - width="16" /> + top_delta="15" + 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 ae61852f68d256d7045be78e02bf50ca6943ae29..ca84c9147b4cfde2d21d7bf730e334c23f34e323 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -8,16 +8,69 @@ name="panel_picks" top="0" width="313"> + <string + name="no_picks" + value="No Picks" /> + <string + name="no_classifieds" + value="No Classifieds" /> + <text + type="string" + follows="all" + height="535" + layout="topleft" + left="6" + name="empty_picks_panel_text" + top="10" + visible="false" + width="313"> + There are no picks/classifieds here + </text> + <accordion + follows="all" + height="465" + layout="topleft" + left="0" + name="accordion" + top="0" + single_expansion="true" + width="313"> + <accordion_tab + can_resize="false" + layout="topleft" + height="235" + min_height="150" + name="tab_picks" + title="Picks" + visible="false"> <flat_list_view color="DkGray2" follows="all" - height="465" layout="topleft" left="0" name="picks_list" opaque="true" top="0" width="313" /> + </accordion_tab> + <accordion_tab + can_resize="false" + layout="topleft" + height="235" + name="tab_classifieds" + title="Classifieds" + visible="false"> + <flat_list_view + color="DkGray2" + follows="all" + layout="topleft" + left="0" + name="classifieds_list" + opaque="true" + top="0" + width="313" /> + </accordion_tab> + </accordion> <panel background_visible="true" bevel_style="none" @@ -78,7 +131,6 @@ <button enabled="false" follows="bottom|left" - font="SansSerifSmallBold" height="25" label="Info" layout="topleft" @@ -90,7 +142,6 @@ <button enabled="false" follows="bottom|left" - font="SansSerifSmallBold" height="25" label="Teleport" layout="topleft" @@ -102,7 +153,6 @@ <button enabled="false" follows="bottom|left" - font="SansSerifSmallBold" height="25" label="Map" layout="topleft" @@ -114,7 +164,6 @@ <button enabled="false" follows="bottom|right" - font="SansSerifSmallBold" height="25" label="â–¼" layout="topleft" 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 65f150b33c6c52a3ac3dba073fde4cef600bc5e6..9ab5c6b4f745bc822e45d9f91329e4c0e5e28296 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -172,14 +172,13 @@ width="313"> <panel bg_alpha_color="DkGray2" - follows="all" + follows="left|top|right" height="533" layout="topleft" left="0" min_height="300" name="scrolling_panel" top="0" - value=">" width="313"> <texture_picker enabled="false" @@ -193,7 +192,7 @@ <layout_stack border_size="0" clip="false" - follows="all" + follows="left|top|right" height="50" layout="topleft" mouse_opaque="false" @@ -296,6 +295,24 @@ top_delta="0" value="Alex Superduperlongenamenton" width="205" /> + <icon + follows="top|left" + height="16" + image_name="unknown" + layout="topleft" + left="10" + name="maturity_icon" + top_delta="0" + width="18" /> + <text + follows="left|top|right" + height="16" + layout="topleft" + left_pad="8" + name="maturity_value" + top_delta="0" + value="unknown" + width="268" /> <accordion follows="all" height="230" @@ -308,222 +325,211 @@ layout="topleft" name="parcel_characteristics_tab" title="Parcel"> - <scroll_container - color="DkGray2" + <panel follows="all" - height="132" + height="160" layout="topleft" left="0" - name="parcel_scroll" - opaque="true" top="0" - width="290"> - <panel - follows="all" - height="165" + width="275"> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_PG" layout="topleft" - left="0" + left="10" + name="rating_icon" top="0" - width="275"> - <icon - follows="top|left" - height="16" - image_name="parcel_drk_PG" - layout="topleft" - left="20" - name="rating_icon" - top="0" - width="18" /> - <text - follows="left|top" - height="16" - layout="topleft" - left_pad="8" - name="rating_label" - value="Rating:" - width="80" /> - <text - follows="right|top" - height="16" - layout="topleft" - left_pad="0" - name="rating_value" - top_delta="0" - value="unknown" - width="120" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_Voice" - layout="topleft" - left="20" - name="voice_icon" - top_pad="5" - width="22" /> - <text - follows="left|top" - height="18" - layout="topleft" - left_pad="8" - name="voice_label" - top_delta="0" - value="Voice:" - width="76" /> - <text - follows="right|top" - height="18" - layout="topleft" - left_pad="0" - name="voice_value" - top_delta="0" - value="On" - width="60" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_Fly" - layout="topleft" - left="20" - name="fly_icon" - top_pad="3" - width="22" /> - <text - follows="left|top" - height="16" - layout="topleft" - left_pad="8" - name="fly_label" - value="Fly:" - width="76" /> - <text - follows="right|top" - height="16" - layout="topleft" - left_pad="0" - name="fly_value" - top_delta="0" - value="On" - width="60" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_Push" - layout="topleft" - left="20" - name="push_icon" - top_pad="3" - width="22" /> - <text - follows="left|top" - height="14" - layout="topleft" - left_pad="8" - name="push_label" - value="Push:" - width="76" /> - <text - follows="right|top" - height="14" - layout="topleft" - left_pad="0" - name="push_value" - top_delta="0" - value="Off" - width="60" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_Build" - layout="topleft" - left="20" - name="build_icon" - top_pad="3" - width="22" /> - <text - follows="left|top" - height="14" - layout="topleft" - left_pad="8" - name="build_label" - value="Build:" - width="76" /> - <text - follows="right|top" - height="15" - layout="topleft" - left_pad="0" - name="build_value" - top_delta="0" - value="On" - width="60" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_Scripts" - layout="topleft" - left="20" - name="scripts_icon" - top_pad="3" - width="22" /> - <text - follows="left|top" - height="14" - layout="topleft" - left_pad="8" - name="scripts_label" - value="Scripts:" - width="76" /> - <text - follows="right|top" - height="14" - layout="topleft" - left_pad="0" - name="scripts_value" - top_delta="0" - value="On" - width="60" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_Damage" - layout="topleft" - left="20" - name="damage_icon" - top_pad="7" - width="22" /> - <text - follows="left|top" - height="14" - layout="topleft" - left_pad="8" - name="damage_label" - value="Damage:" - width="76" /> - <text - follows="right|top" - height="14" - layout="topleft" - left_pad="0" - name="damage_value" - top_delta="0" - value="Off" - width="60" /> - <button - follows="bottom|right" - height="19" - label="About Land" - layout="topleft" - name="about_land_btn" - right="-5" - tab_stop="false" - top="138" - width="90"> - <click_callback - function="ShowFloater" - parameter="about_land" /> - </button> - </panel> - </scroll_container> + width="18" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="12" + name="rating_label" + value="Rating:" + width="60" /> + <text + follows="left|right|top" + height="16" + layout="topleft" + left_pad="0" + name="rating_value" + top_delta="0" + value="unknown" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Voice" + layout="topleft" + left="10" + name="voice_icon" + top_pad="5" + width="22" /> + <text + follows="left|top" + height="18" + layout="topleft" + left_pad="8" + name="voice_label" + top_delta="0" + value="Voice:" + width="60" /> + <text + follows="left|right|top" + height="18" + layout="topleft" + left_pad="0" + name="voice_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Fly" + layout="topleft" + left="10" + name="fly_icon" + top_pad="3" + width="22" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="8" + name="fly_label" + value="Fly:" + width="60" /> + <text + follows="left|right|top" + height="16" + layout="topleft" + left_pad="0" + name="fly_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Push" + layout="topleft" + left="10" + name="push_icon" + top_pad="3" + width="22" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="push_label" + value="Push:" + width="60" /> + <text + follows="left|right|top" + height="14" + layout="topleft" + left_pad="0" + name="push_value" + top_delta="0" + value="Off" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Build" + layout="topleft" + left="10" + name="build_icon" + top_pad="3" + width="22" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="build_label" + value="Build:" + width="60" /> + <text + follows="left|right|top" + height="15" + layout="topleft" + left_pad="0" + name="build_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Scripts" + layout="topleft" + left="10" + name="scripts_icon" + top_pad="3" + width="22" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="scripts_label" + value="Scripts:" + width="60" /> + <text + follows="left|right|top" + height="14" + layout="topleft" + left_pad="0" + name="scripts_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Damage" + layout="topleft" + left="10" + name="damage_icon" + top_pad="7" + width="22" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="damage_label" + value="Damage:" + width="60" /> + <text + follows="left|right|top" + height="14" + layout="topleft" + left_pad="0" + name="damage_value" + top_delta="0" + value="Off" + width="60" /> + <button + follows="bottom|right" + height="19" + label="About Land" + layout="topleft" + name="about_land_btn" + right="-5" + tab_stop="false" + top="138" + width="90"> + <click_callback + function="ShowFloater" + parameter="about_land" /> + </button> + </panel> </accordion_tab> <accordion_tab expanded="false" @@ -545,7 +551,7 @@ name="region_name_label" top_pad="5" value="Region:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" @@ -554,7 +560,7 @@ name="region_name" top_delta="0" value="Mooseland" - width="195" /> + width="187" /> <text follows="left|top" height="15" @@ -563,7 +569,7 @@ name="region_type_label" top_pad="5" value="Type:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" @@ -572,7 +578,7 @@ name="region_type" top_delta="0" value="Moose" - width="195" /> + width="187" /> <text follows="left|top" height="15" @@ -581,7 +587,7 @@ name="region_rating_label" top_pad="7" value="Rating:" - width="80" /> + width="90" /> <icon follows="top|left" height="16" @@ -597,7 +603,7 @@ left_pad="10" name="region_rating" value="Explicit" - width="100" /> + width="159" /> <text follows="left|top" height="15" @@ -606,7 +612,7 @@ name="region_owner_label" top_pad="5" value="Owner:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" @@ -615,7 +621,7 @@ name="region_owner" top_delta="0" value="moose Van Moose" - width="195" /> + width="187" /> <text follows="left|top" height="15" @@ -624,7 +630,7 @@ name="region_group_label" top_pad="5" value="Group:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" @@ -633,7 +639,7 @@ name="region_group" top_delta="0" use_ellipses="true" - width="195"> + width="187"> The Mighty Moose of mooseville soundvillemoose </text> <button @@ -671,15 +677,15 @@ name="estate_name_label" top_pad="5" value="Estate:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="90" + left_pad="0" name="estate_name" top_delta="0" - width="160" /> + width="187" /> <text follows="left|top" height="15" @@ -688,15 +694,15 @@ name="estate_rating_label" top_pad="5" value="Rating:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="90" + left_pad="0" name="estate_rating" top_delta="0" - width="160" /> + width="187" /> <text follows="left|top" height="15" @@ -705,15 +711,15 @@ name="estate_owner_label" top_pad="5" value="Owner:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="90" + left_pad="0" name="estate_owner" top_delta="0" - width="160" /> + width="187" /> <text follows="left|top" height="15" @@ -722,7 +728,7 @@ name="covenant_label" top_pad="5" value="Covenant:" - width="220" /> + width="277" /> <text_editor bg_focus_color="DkGray2" bg_readonly_color="DkGray2" @@ -735,7 +741,8 @@ name="covenant" read_only="true" top_pad="0" - width="280" /> + width="277" + word_wrap="true" /> </panel> </accordion_tab> <accordion_tab @@ -758,15 +765,15 @@ name="sales_price_label" top_pad="5" value="Price:" - width="100" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="110" + left_pad="0" name="sales_price" top_delta="0" - width="140" /> + width="187" /> <text follows="left|top" height="15" @@ -775,15 +782,15 @@ name="area_label" top_pad="5" value="Area:" - width="100" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="110" + left_pad="0" name="area" top_delta="0" - width="140" /> + width="187" /> <text follows="left|top" height="15" @@ -792,15 +799,15 @@ name="traffic_label" top_pad="5" value="Traffic:" - width="100" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="110" + left_pad="0" name="traffic" top_delta="0" - width="140" /> + width="187" /> <text follows="left|top" height="15" @@ -809,15 +816,15 @@ name="primitives_label" top_pad="5" value="Primitives:" - width="100" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="110" + left_pad="0" name="primitives" top_delta="0" - width="140" /> + width="187" /> <text follows="left|top" height="15" @@ -826,15 +833,15 @@ name="parcel_scripts_label" top_pad="5" value="Scripts:" - width="100" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="110" + left_pad="0" name="parcel_scripts" top_delta="0" - width="140" /> + width="187" /> <text follows="left|top" height="15" @@ -843,15 +850,15 @@ name="terraform_limits_label" top_pad="5" value="Terraform limits:" - width="100" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="110" + left_pad="0" name="terraform_limits" top_delta="0" - width="140" /> + width="187" /> <text follows="left|top" height="15" @@ -860,7 +867,7 @@ name="subdivide_label" top_pad="5" value="Subdivide/Join ability:" - width="220" /> + width="277" /> <text_editor bg_focus_color="DkGray2" bg_readonly_color="DkGray2" @@ -872,7 +879,8 @@ name="subdivide" read_only="true" top_pad="5" - width="245" /> + width="277" + word_wrap="true" /> <text follows="left|top" height="15" @@ -881,7 +889,7 @@ name="resale_label" top_pad="5" value="ReSale ability:" - width="80" /> + width="277" /> <text_editor bg_focus_color="DkGray2" bg_readonly_color="DkGray2" @@ -893,7 +901,8 @@ name="resale" read_only="true" top_pad="5" - width="245" /> + width="277" + word_wrap="true" /> <text follows="left|top" height="15" @@ -902,15 +911,15 @@ name="sale_to_label" top_pad="5" value="For sale to:" - width="80" /> + width="90" /> <text follows="left|top|right" height="15" layout="topleft" - left="90" + left_pad="0" name="sale_to" top_delta="0" - width="160" /> + width="187" /> </panel> </accordion_tab> </accordion> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index cbbcfe50681d5c142a523c1427ef42a7b6c02d8d..88df529ec1f20d0cb389b432cffdceb6360d515a 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -72,7 +72,6 @@ background_visible="true" width="313"> <button follows="bottom|left" - font="SansSerifSmall" height="19" label="Teleport" layout="topleft" @@ -82,7 +81,6 @@ background_visible="true" width="100" /> <button follows="bottom|left" - font="SansSerifSmall" height="19" label="Map" layout="topleft" @@ -92,7 +90,6 @@ background_visible="true" width="70" /> <button follows="bottom|left" - font="SansSerifSmall" height="19" label="Edit" layout="topleft" @@ -102,9 +99,8 @@ background_visible="true" width="70" /> <button follows="bottom|right" - font="SansSerifSmall" height="19" - image_disabled="ForwardArrow_Disabled" + image_disabled="ForwardArrow_Off" image_selected="ForwardArrow_Press" image_unselected="ForwardArrow_Off" layout="topleft" @@ -114,7 +110,6 @@ background_visible="true" width="18" /> <button follows="bottom|right" - font="SansSerifSmall" height="19" label="Close" layout="topleft" @@ -124,7 +119,6 @@ background_visible="true" width="60" /> <button follows="bottom|right" - font="SansSerifSmall" height="19" label="Cancel" layout="topleft" @@ -134,7 +128,6 @@ background_visible="true" width="60" /> <button follows="bottom|right" - font="SansSerifSmall" height="19" label="Save" layout="topleft" 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 06f0710406538cd434ab7569fa0a763e5a8846ba..0ac0521b10c4d9fe071f82d6e94bb174e9c4e46f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -284,7 +284,7 @@ Avatars: enabled_control="EnableVoiceChat" control_name="PushToTalkToggle" height="20" - label="Toggle mode for microphone when I press the Speak trigger key:" + label="Toggle mode for microphone when I press the speak trigger key:" layout="topleft" left="30" name="push_to_talk_toggle_check" 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 645863e7a4ac804e53f4097eade5f44950ee4430..fac0d5c60f0521a0b354bd72e2f87cac15a62bc2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -45,14 +45,20 @@ <color_swatch border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" - control_name="UserChatColor" follows="left|top" height="47" layout="topleft" left="30" name="user" top_pad="10" - width="44" /> + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="UserChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="UserChatColor" /> + </color_swatch> <text type="string" length="1" @@ -69,14 +75,20 @@ <color_swatch border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" - control_name="AgentChatColor" follows="left|top" height="47" layout="topleft" left="180" name="agent" top_pad="-17" - width="44" /> + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="AgentChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="AgentChatColor" /> + </color_swatch> <text type="string" length="1" @@ -94,7 +106,6 @@ border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" color="0.6 0.6 1 1" - control_name="IMChatColor" follows="left|top" height="47" label_width="60" @@ -102,8 +113,15 @@ left="350" name="im" top_pad="-17" - width="44" /> - <text + width="44"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="IMChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="IMChatColor" /> + </color_swatch> + <text type="string" length="1" follows="left|top" @@ -120,7 +138,6 @@ border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" color="0.8 1 1 1" - control_name="SystemChatColor" follows="left|top" height="47" label_width="44" @@ -128,7 +145,14 @@ left="30" name="system" top_pad="40" - width="44" /> + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="SystemChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="SystemChatColor" /> + </color_swatch> <text type="string" length="1" @@ -146,14 +170,20 @@ border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" color="0.82 0.82 0.99 1" - control_name="ScriptErrorColor" follows="left|top" height="47" layout="topleft" left="180" name="script_error" top_pad="-17" - width="44" /> + width="44"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="ScriptErrorColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="ScriptErrorColor" /> + </color_swatch> <text type="string" length="1" @@ -171,14 +201,20 @@ border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" color="0.7 0.9 0.7 1" - control_name="ObjectChatColor" follows="left|top" height="47" layout="topleft" left="350" name="objects" top_pad="-17" - width="44" /> + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="ObjectChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="ObjectChatColor" /> + </color_swatch> <text type="string" length="1" @@ -196,14 +232,20 @@ border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" color="0.7 0.9 0.7 1" - control_name="llOwnerSayChatColor" follows="left|top" height="47" layout="topleft" left="30" name="owner" top_pad="40" - width="44" /> + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="llOwnerSayChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="llOwnerSayChatColor" /> + </color_swatch> <text type="string" length="1" @@ -221,14 +263,20 @@ border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" color="0.6 0.6 1 1" - control_name="HTMLLinkColor" follows="left|top" height="47" layout="topleft" left="180" name="links" top_pad="-17" - width="44" /> + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="HTMLLinkColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="HTMLLinkColor" /> + </color_swatch> <text type="string" length="1" @@ -261,4 +309,13 @@ name="send_im_to_email" top_pad="5" width="400" /> + <check_box + enabled="false" + height="16" + label="Enable plain text chat history" + layout="topleft" + left_delta="0" + name="plain_text_chat_history" + top_pad="5" + width="400" /> </panel> 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 975d21aaa6a16e1424bdfebceee7c2a1e380b0c6..6bb937e3c646d2614e651ea73051b8531a0c592b 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -66,11 +66,7 @@ label="Italiano (Italian) - Beta" name="Italian" value="it" /> - <combo_box.item - enabled="true" - label="Magyar (Hungarian) - Beta" - name="Hungarian" - value="hu" /> + <combo_box.item enabled="true" label="Nederlands (Dutch) - Beta" @@ -86,36 +82,16 @@ label="Portugués (Portuguese) - Beta" name="Portugese" value="pt" /> - <combo_box.item - enabled="true" - label="РуÑÑкий (Russian) - Beta" - name="Russian" - value="ru" /> - <combo_box.item - enabled="true" - label="Türkçe (Turkish) - Beta" - name="Turkish" - value="tr" /> - <combo_box.item - enabled="true" - label="УкраїнÑька (Ukrainian) - Beta" - name="Ukrainian" - value="uk" /> - <combo_box.item - enabled="true" - label="䏿–‡ (简体) (Chinese) - Beta" - name="Chinese" - value="zh" /> + + + + <combo_box.item enabled="true" label="日本語 (Japanese) - Beta" name="(Japanese)" value="ja" /> - <combo_box.item - enabled="true" - label="한êµì–´ (Korean) - Beta" - name="(Korean)" - value="ko" /> + <combo_box.item enabled="true" label="Test Language" @@ -305,7 +281,7 @@ name="effects_color_textbox" top_pad="5" width="400"> - My Effects: + My effects: </text> <color_swatch border_color="0.45098 0.517647 0.607843 1" 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 b1308a194283a2f0ff394bb8a5b16fc6281f4819..eb00b9b79a0490349ab60649a3d5565c4baa23db 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -16,81 +16,8 @@ height="12" layout="topleft" left="30" - name="WindowSizeLabel" - top="10" - width="300"> - Window size: - </text> - <check_box - control_name="WindowFullScreen" - height="16" - label="Use fullscreen" - layout="topleft" - left_delta="50" - name="windowed mode" - top_pad="4" - width="175"> - </check_box> - <combo_box - visiblity_control="WindowFullScreen" - allow_text_entry="false" - enabled="true" - layout="topleft" - height="18" - left_delta="220" - max_chars="20" - mouse_opaque="true" - name="windowsize combo" - top_delta="-1" - width="150"> - <combo_box.item - type="string" - length="1" - enabled="true" - name="640x480" - value="640 x 480" - label="640x480"/> - <combo_box.item - type="string" - length="1" - enabled="true" - name="800x600" - value="800 x 600" - label="800x600"/> - <combo_box.item - type="string" - length="1" - enabled="true" - name="720x480" - value="720 x 480" - label="720x480 (NTSC)"/> - <combo_box.item - type="string" - length="1" - enabled="true" - name="768x576" - value="768 x 576" - label="768x576 (PAL)"/> - <combo_box.item - type="string" - length="1" - enabled="true" - name="1024x768" - value="1024 x 768" - label="1024x768"/> - <combo_box.commit_callback - function="Pref.setControlFalse" - parameter="FullScreenAutoDetectAspectRatio" /> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left="30" name="UI Size:" - top_pad="4" + top="10" width="300"> UI size: </text> @@ -101,7 +28,7 @@ follows="left|top" height="15" increment="0.025" - initial_value="1" + initial_valu="1" layout="topleft" left_delta="52" max_val="1.4" @@ -109,19 +36,7 @@ name="ui_scale_slider" top_pad="2" width="180" /> - <spinner - control_name="UIScaleFactor" - height="16" - increment="0.025" - initial_value="1" - layout="topleft" - left_pad="10" - max_val="1.4" - min_val="0.75" - name="ui_scale_slider" - top_delta="0" - width="58" /> - <text + <text type="string" length="1" follows="left|top" 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 acf4601bfe5eaf6c2d7c8583193b582e65ff312a..23832ba120b728cc7e9090681b6c22ecc68922a6 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -86,7 +86,16 @@ name="autoplay_enabled" top_pad="10" width="350" /> - <text + <check_box + control_name="ParcelMediaAutoPlayEnable" + height="16" + label="Automatically Play Parcel Media" + layout="topleft" + left="30" + name="parcel_autoplay_enabled" + top_pad="10" + width="350" /> + <text type="string" length="1" follows="left|top" @@ -100,61 +109,27 @@ Logs: </text> <check_box - + enabled="false" + control_name="LogChat" + height="16" + label="Save nearby chat logs on my computer" + layout="topleft" + left="30" + name="log_nearby_chat" + top_pad="10" + width="350"> + </check_box> + <check_box enabled="false" control_name="LogInstantMessages" height="16" - label="Save logs on my computer" + label="Save IM logs on my computer" layout="topleft" left="30" name="log_instant_messages" top_pad="10" width="350"> - <check_box.commit_callback - function="Pref.Logging" /> </check_box> - <radio_group - control_name="IMLogOptions" - enabled="false" - height="80" - layout="topleft" - left_delta="50" - name="ChatIMLogs" - width="350" - top_pad="0"> - <radio_item - height="16" - label="Chat" - layout="topleft" - left="0" - name="radio1" - top="3" - width="200" /> - <radio_item - height="16" - label="IM" - layout="topleft" - left_delta="0" - name="radio2" - top_pad="3" - width="200" /> - <radio_item - height="16" - label="Both, together" - layout="topleft" - left_delta="0" - name="radio3" - top_pad="3" - width="200" /> - <radio_item - height="16" - label="Both, separate" - layout="topleft" - left_delta="0" - name="radio4" - top_pad="3" - width="200" /> - </radio_group> <check_box control_name="LogTimestamp" enabled="false" @@ -208,7 +183,7 @@ <button follows="left|bottom" height="20" - label="Block List" + label="Block list" layout="topleft" left="30" name="block_list" 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 9cf0bd26d882897d56ef147c4d791b47f56903cf..5cabae5fa0111691c609627757a0fbff624ac5a5 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -169,12 +169,12 @@ decimal_digits="0" follows="left|top" height="15" - increment="10" - initial_value="50" + increment="16" + initial_value="512" layout="topleft" left_delta="150" - max_val="1000" - min_val="10" + max_val="1024" + min_val="32" name="cache_size" top_delta="-1" width="180" /> 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 d454b9e5c8dce8d2dc6dfd17c45b6332ad2f1349..8ef2cdfc37fad3348759b54c3881d26d3c0a62f7 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -350,7 +350,7 @@ border="false" follows="top|left" height="145" - label="DeviceSettings" + label="Device Settings" layout="topleft" left="0" name="device_settings_panel" 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 3bdd7114eedaba636a4f5c019979aee0ea0e2554..88049fe7d1138970edb818b00f6fccd638546a69 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 @@ -2,19 +2,19 @@ <panel follows="left|right|top|bottom" name="MediaControls" - bg_alpha_color="1 1 1 0" + background_visible="false" height="160" layout="topleft" mouse_opaque="false" width="800"> + <string name="control_background_image_name">Inspector_Background</string> + <string name="skip_step">0.2</string> <panel name="media_region" bottom="125" follows="left|right|top|bottom" layout="topleft" - left="20" mouse_opaque="false" - right="-20" top="20" /> <layout_stack follows="left|right|bottom" @@ -33,6 +33,7 @@ name="media_progress_indicator" height="22" layout="topleft" + visible="false" left="0" top="0" auto_resize="false" @@ -64,6 +65,7 @@ top="128"> <!-- outer layout_panels center the inner one --> <layout_panel + name="left_bookend" width="0" layout="topleft" user_resize="false" /> @@ -76,13 +78,18 @@ width="22" top="4"> <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" auto_resize="false" height="22" - image_selected="media_btn_back.png" - image_unselected="media_btn_back.png" layout="topleft" - tool_tip="Step back" + tool_tip="Navigate back" width="22" + left="0" top_delta="4"> <button.commit_callback function="MediaCtrl.Back" /> @@ -94,37 +101,25 @@ user_resize="false" layout="topleft" top="10" - min_width="17" - width="17"> + min_width="22" + width="22"> <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" height="22" - image_selected="media_btn_forward.png" - image_unselected="media_btn_forward.png" layout="topleft" - tool_tip="Step forward" + tool_tip="Navigate forward" top_delta="0" - min_width="17" - width="17"> + min_width="22" + width="22"> <button.commit_callback function="MediaCtrl.Forward" /> </button> </layout_panel> -<!-- - <panel - height="22" - layout="topleft" - auto_resize="false" - min_width="3" - width="3"> - <icon - height="22" - image_name="media_panel_divider.png" - layout="topleft" - top="0" - min_width="3" - width="3" /> - </panel> ---> <layout_panel name="home" auto_resize="false" @@ -134,11 +129,15 @@ min_width="22" width="22"> <button - height="22" - image_selected="media_btn_home.png" - image_unselected="media_btn_home.png" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_overlay="Home_Off" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" layout="topleft" tool_tip="Home page" + height="22" min_width="22" width="22"> <button.commit_callback @@ -153,34 +152,23 @@ top="2" min_width="22" width="22"> + <!-- The stop button here is temporary artwork --> <button + image_overlay="media_btn_stoploading.png" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" height="22" - image_selected="button_anim_stop.tga" - image_unselected="button_anim_stop.tga" layout="topleft" tool_tip="Stop media" min_width="22" width="22"> <button.commit_callback - function="MediaCtrl.Stop" /> + function="MediaCtrl.MediaStop" /> </button> </layout_panel> -<!-- - <panel - height="22" - layout="topleft" - auto_resize="false" - min_width="3" - width="3"> - <icon - height="22" - image_name="media_panel_divider.png" - layout="topleft" - top="0" - min_width="3" - width="3" /> - </panel> ---> <layout_panel name="reload" auto_resize="false" @@ -191,8 +179,12 @@ width="22"> <button height="22" - image_selected="media_btn_reload.png" - image_unselected="media_btn_reload.png" + image_overlay="Refresh_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="Reload" min_width="22" @@ -211,8 +203,12 @@ width="22"> <button height="22" - image_selected="media_btn_stoploading.png" - image_unselected="media_btn_stoploading.png" + image_overlay="StopReload_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 loading" min_width="22" @@ -230,11 +226,15 @@ min_width="22" width="22"> <button - height="22" - image_selected="button_anim_play.tga" - image_unselected="button_anim_play.tga" + 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 media" + height="22" min_width="22" width="22"> <button.commit_callback @@ -250,10 +250,14 @@ min_width="22" width="22"> <button - height="22" - image_selected="button_anim_pause.tga" - image_unselected="button_anim_pause.tga" + 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" + height="22" tool_tip = "Pause media"> <button.commit_callback function="MediaCtrl.Pause" /> @@ -264,7 +268,7 @@ name="media_address" auto_resize="true" user_resize="false" - height="22" + height="24" follows="left|right|bottom" layout="topleft" width="190" @@ -294,31 +298,43 @@ function="MediaCtrl.CommitURL" /> function="MediaCtrl.CommitURL"/> </line_editor> <layout_stack + name="media_address_url_icons" animate="false" follows="right" - width="32" - min_width="32" - height="16" - top="3" - orientation="horizontal" - left_pad="-38"> - <icon - name="media_whitelist_flag" - follows="top|right" - height="16" - image_name="smicon_warn.tga" + height="20" + width="38" + right="-2" + top="-1" + orientation="horizontal"> + <layout_panel layout="topleft" - tool_tip="White List enabled" - min_width="16" - width="16" /> - <icon - name="media_secure_lock_flag" - height="16" - image_name="inv_item_eyes.tga" + width="16" + auto_resize="false" + user_resize="false"> + <icon + name="media_whitelist_flag" + follows="top|right" + height="16" + image_name="Flag" + layout="topleft" + tool_tip="White List enabled" + min_width="16" + width="16" /> + </layout_panel> + <layout_panel layout="topleft" - tool_tip="Secured Browsing" - min_width="16" - width="16" /> + width="16" + auto_resize="false" + user_resize="false"> + <icon + name="media_secure_lock_flag" + height="16" + image_name="Lock2" + layout="topleft" + tool_tip="Secured Browsing" + min_width="16" + width="16" /> + </layout_panel> </layout_stack> </layout_panel> <layout_panel @@ -337,54 +353,116 @@ function="MediaCtrl.CommitURL" /> initial_value="0.5" layout="topleft" tool_tip="Movie play progress" + top="8" min_width="100" width="200"> <slider_bar.commit_callback function="MediaCtrl.JumpProgress" /> </slider_bar> </layout_panel> + <layout_panel + name="skip_back" + auto_resize="false" + user_resize="false" + layout="topleft" + min_width="22" + width="22"> + <button + image_overlay="SkipBackward_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + auto_resize="false" + height="22" + layout="topleft" + tool_tip="Step back" + top="-14" + width="22" + left="0"> + <button.commit_callback + function="MediaCtrl.SkipBack" /> + </button> + </layout_panel> + <layout_panel + name="skip_forward" + auto_resize="false" + user_resize="false" + layout="topleft" + min_width="22" + width="22"> + <button + image_overlay="SkipForward_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + height="22" + layout="topleft" + tool_tip="Step forward" + top="-14" + min_width="22" + width="22"> + <button.commit_callback + function="MediaCtrl.SkipForward" /> + </button> + </layout_panel> <layout_panel name="media_volume" auto_resize="false" user_resize="false" layout="topleft" - height="24" - min_width="24" - width="24"> + height="22" + min_width="22" + width="22"> + <!-- Note: this isn't quite right either...the mute button is not the --> + <!-- same as the others because it can't have the "image_overlay" be --> + <!-- two different images. --> <button + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" + hover_glow_amount="0.15" name="media_volume_button" height="22" - image_selected="icn_speaker-muted_dark.tga" - image_unselected="icn_speaker_dark.tga" is_toggle="true" layout="topleft" scale_image="false" tool_tip="Mute This Media" - top_delta="22" - min_width="24" - width="24" > + top_delta="18" + min_width="22" + width="22" > <button.commit_callback function="MediaCtrl.ToggleMute" /> </button> </layout_panel> + <!-- We don't have a design yet for "volume", so this is a temporary --> + <!-- solution. See DEV-42827. --> <layout_panel name="volume_up" auto_resize="false" user_resize="false" layout="topleft" - min_width="20" + min_width="14" height="14" - width="20"> + width="14"> <button - top="-3" + image_overlay="media_btn_scrollup.png" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" + top="-5" height="14" - image_selected="media_btn_scrollup.png" - image_unselected="media_btn_scrollup.png" layout="topleft" tool_tip="Volume up" scale_image="true" - min_width="20" - width="20" > + min_width="14" + width="14" > <button.commit_callback function="MediaCtrl.CommitVolumeUp" /> </button> @@ -394,26 +472,32 @@ function="MediaCtrl.CommitURL" /> auto_resize="false" user_resize="false" layout="topleft" - min_width="20" + min_width="14" height="14" - width="20"> + width="14"> <button - top="-5" - height="14" - image_selected="media_btn_scrolldown.png" - image_unselected="media_btn_scrolldown.png" + image_overlay="media_btn_scrolldown.png" + 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="Volume down" scale_image="true" - min_width="20" - width="20"> + top="-5" + height="14" + min_width="14" + width="14"> <button.commit_callback function="MediaCtrl.CommitVolumeDown" /> </button> </layout_panel> <!-- Scroll pad --> -<!-- -disabled + <!-- This was removed from the design, but is still here because it is --> + <!-- complex, and recreating it would be hard. In case the design --> + <!-- changes, here it lies: --> + <!-- <layout_panel name="media_panel_scroll" auto_resize="false" @@ -479,8 +563,21 @@ disabled min_width="8" width="8" /> </layout_panel> -disabled ---> + --> + <panel + height="28" + layout="topleft" + auto_resize="false" + min_width="3" + width="3"> + <icon + height="26" + image_name="media_panel_divider.png" + layout="topleft" + top="0" + min_width="3" + width="3" /> + </panel> <layout_panel name="zoom_frame" auto_resize="false" @@ -490,9 +587,13 @@ disabled min_width="22" width="22"> <button + 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" height="22" - image_selected="media_btn_optimalzoom.png" - image_unselected="media_btn_optimalzoom.png" layout="topleft" tool_tip="Zoom into media" min_width="22" @@ -508,10 +609,15 @@ disabled layout="topleft" min_width="21" width="21" > + <!-- There is no "Zoom out" icon, so we use this temporarily --> <button + image_overlay="ForwardArrow_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" height="22" - image_selected="media_btn_done.png" - image_unselected="media_btn_done.png" layout="topleft" tool_tip ="Zoom Back" top_delta="-4" @@ -520,22 +626,6 @@ disabled function="MediaCtrl.Close" /> </button> </layout_panel> -<!-- - <panel - height="22" - layout="topleft" - auto_resize="false" - min_width="3" - width="3"> - <icon - height="22" - image_name="media_panel_divider.png" - layout="topleft" - top="0" - min_width="3" - width="3" /> - </panel> ---> <layout_panel name="new_window" auto_resize="false" @@ -544,35 +634,25 @@ disabled min_width="22" width="22"> <button + image_overlay="ExternalBrowser_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + hover_glow_amount="0.15" height="22" - image_selected="media_btn_newwindow.png" - image_unselected="media_btn_newwindow.png" layout="topleft" tool_tip = "Open URL in browser" - top_delta="-3" + top_delta="-4" min_width="24" width="24" > <button.commit_callback function="MediaCtrl.Open" /> </button> </layout_panel> -<!-- - <panel - height="22" - layout="topleft" - auto_resize="false" - min_width="3" - width="3"> - <icon - height="22" - image_name="media_panel_divider.png" - layout="topleft" - top="0" - min_width="3" - width="3" /> - </panel> ---> + <!-- bookend panel --> <layout_panel + name="right_bookend" width="0" layout="topleft" user_resize="false" /> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 0f5e96416df6616f9cfa1cd98ecabcae1d417aca..947bb67152ac8bbcac400c0726e0f8aad7bda771 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -27,7 +27,11 @@ <string name="no_partner_text" value="None" /> - <scroll_container + <string + name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <scroll_container color="DkGray2" follows="all" height="485" @@ -283,7 +287,7 @@ mouse_opaque="false" name="add_friend" top="5" - width="75" /> + width="76" /> <button follows="bottom|left" height="19" @@ -292,7 +296,7 @@ name="im" top="5" left_pad="5" - width="45" /> + width="31" /> <button follows="bottom|left" height="19" @@ -301,7 +305,7 @@ name="call" left_pad="5" top="5" - width="45" /> + width="40" /> <button enabled="false" follows="bottom|left" @@ -311,7 +315,7 @@ name="show_on_map_btn" top="5" left_pad="5" - width="45" /> + width="42" /> <button follows="bottom|left" height="19" @@ -320,7 +324,16 @@ name="teleport" left_pad="5" top="5" - width="80" /> + width="64" /> + <button + follows="bottom|right" + height="19" + label="â–¼" + layout="topleft" + name="overflow_btn" + right="-1" + top="5" + width="21" /> </panel> <panel follows="bottom|left" @@ -333,7 +346,6 @@ width="303"> <button follows="bottom|right" - font="SansSerifSmall" height="19" left="10" label="Edit Profile" 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 b015346a799e9981d7af002b07f7dbca563d7f4f..8e683bffc102bae19993f353574d6cfa5eeeb451 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -25,10 +25,11 @@ tab_stop="false" top="2" width="23" /> - <text + <text_editor + read_only = "true" follows="top|left|right" font="SansSerifHugeBold" - height="26" + height="29" layout="topleft" left_pad="10" name="user_name" @@ -52,7 +53,7 @@ halign="center" layout="topleft" left="10" - min_width="333" + min_width="333" name="tabs" tab_min_width="80" tab_height="30" 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 49fc930cd8ae1ba18225cf3fbd683e082b45e174..75d7d85505f450068c224f8c14cbc7be3956cbb2 100644 --- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml @@ -119,7 +119,6 @@ </text_editor> <button follows="left|top" - font="SansSerifSmall" height="18" label="Reset" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml index a1bca4229dcfa2cf309ad46a369d0a254b0199ac..e07585d285e992431aaee6ca13426d7169d02ca3 100644 --- a/indra/newview/skins/default/xui/en/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml @@ -61,7 +61,6 @@ <button enabled="false" follows="left|top" - font="SansSerifSmall" height="20" label="Apply" layout="topleft" @@ -109,7 +108,6 @@ <button follows="left|top" height="20" - font="SansSerifSmall" label="Choose" layout="topleft" left_pad="5" @@ -156,7 +154,6 @@ <button follows="left|top" height="20" - font="SansSerifSmall" label="Return" layout="topleft" left="20" @@ -165,7 +162,6 @@ width="80" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="Get Top Colliders..." layout="topleft" @@ -176,7 +172,6 @@ width="150" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="Get Top Scripts..." layout="topleft" @@ -187,7 +182,6 @@ width="150" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="Restart Region" layout="topleft" @@ -198,7 +192,6 @@ width="130" /> <button follows="left|top" - font="SansSerifSmall" height="20" label="Delay Restart" layout="topleft" 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 add1476179191b8e1e3b021b91fddc1f275cb4b4..e25ff0d548503e4c47db38b5f0d277bebd58c468 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -81,7 +81,7 @@ regions in the estate. <view_border bevel_style="in" follows="top|left" - height="290" + height="310" layout="topleft" left_delta="-4" top_pad="5" @@ -185,48 +185,48 @@ regions in the estate. follows="left|top" height="20" layout="topleft" - left="10" + left="15" name="abuse_email_text" - top_pad="5" + top_pad="10" width="180"> Abuse email address: </text> <line_editor follows="top|left" - height="19" + height="23" layout="topleft" left="15" name="abuse_email_address" - top_pad="5" - width="205" /> + top_pad="-5" + width="230" /> <button enabled="false" follows="left|top" - height="20" + height="23" label="Apply" layout="topleft" name="apply_btn" - right="250" - top_pad="4" - width="90" /> + top_pad="10" + left="78" + width="97" /> <button follows="left|top" - height="20" + height="23" label="Send Message To Estate..." layout="topleft" - left="8" + left="50" name="message_estate_btn" - top_pad="5" - width="250" /> + top_pad="20" + width="160" /> <button follows="left|top" - height="20" + height="23" label="Kick User from Estate..." layout="topleft" - left="8" + left="50" name="kick_user_from_estate_btn" top_pad="5" - width="250" /> + width="160" /> <text type="string" @@ -243,14 +243,14 @@ regions in the estate. <view_border bevel_style="none" follows="top|left" - height="60" + height="71" layout="topleft" right="470" - top_pad="5" + top_pad="-5" width="200" /> <name_list follows="left|top" - height="60" + height="71" layout="topleft" left_delta="0" multi_select="true" @@ -259,22 +259,22 @@ regions in the estate. width="200" /> <button follows="left|top" - height="20" + height="23" label="Remove..." layout="topleft" name="remove_estate_manager_btn" right="470" top_pad="5" - width="90" /> + width="97" /> <button follows="left|top" - height="20" + height="23" label="Add..." layout="topleft" - left_delta="-110" + left_delta="-103" name="add_estate_manager_btn" top_delta="0" - width="90" /> + width="97" /> <text type="string" length="1" @@ -283,21 +283,21 @@ regions in the estate. layout="topleft" left_delta="0" name="allow_resident_label" - top_pad="5" + top_pad="10" width="200"> Allowed Residents: </text> <view_border bevel_style="none" follows="top|left" - height="60" + height="71" layout="topleft" right="470" - top_pad="5" + top_pad="-5" width="200" /> <name_list follows="left|top" - height="60" + height="71" layout="topleft" left_delta="0" multi_select="true" @@ -306,22 +306,22 @@ regions in the estate. width="200" /> <button follows="left|top" - height="20" + height="23" label="Remove..." layout="topleft" name="remove_allowed_avatar_btn" right="470" top_pad="5" - width="90" /> + width="97" /> <button follows="left|top" - height="20" + height="23" label="Add..." layout="topleft" - left_delta="-110" + left_delta="-103" name="add_allowed_avatar_btn" top_delta="0" - width="90" /> + width="97" /> <text type="string" length="1" @@ -330,21 +330,21 @@ regions in the estate. layout="topleft" left_delta="0" name="allow_group_label" - top_pad="5" + top_pad="10" width="200"> Allowed Groups: </text> <view_border bevel_style="none" follows="top|left" - height="60" + height="71" layout="topleft" right="470" - top_pad="5" + top_pad="-5" width="200" /> <name_list follows="left|top" - height="60" + height="71" layout="topleft" left_delta="0" multi_select="true" @@ -353,22 +353,22 @@ regions in the estate. width="200" /> <button follows="left|top" - height="20" + height="23" label="Remove..." layout="topleft" name="remove_allowed_group_btn" right="470" top_pad="5" - width="90" /> + width="97" /> <button follows="left|top" - height="20" + height="23" label="Add..." layout="topleft" - left_delta="-110" + left_delta="-103" name="add_allowed_group_btn" top_delta="0" - width="90" /> + width="97" /> <text type="string" length="1" @@ -377,21 +377,21 @@ regions in the estate. layout="topleft" left_delta="0" name="ban_resident_label" - top_pad="5" + top_pad="10" width="200"> Banned Residents: </text> <view_border bevel_style="none" follows="top|left" - height="60" + height="71" layout="topleft" right="470" - top_pad="5" + top_pad="-5" width="200" /> <name_list follows="left|top" - height="60" + height="71" layout="topleft" left_delta="0" multi_select="true" @@ -400,20 +400,20 @@ regions in the estate. width="200" /> <button follows="left|top" - height="20" + height="23" label="Remove..." layout="topleft" name="remove_banned_avatar_btn" right="470" top_pad="5" - width="90" /> + width="97" /> <button follows="left|top" - height="20" + height="23" label="Add..." layout="topleft" - left_delta="-110" + left_delta="-103" name="add_banned_avatar_btn" top_delta="0" - width="90" /> + width="97" /> </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 a9874f45530eb20b8a023079ab9fb8ec82d59ab1..95242a96397a81cdf069ee1e593de7392c1f7c01 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -94,7 +94,7 @@ <sidetray_tab name="sidebar_me" help_topic="sidebar_me" - tab_title="Me" + tab_title="My Profile" description="Edit your public profile and Picks." image="TabIcon_Me_Off" image_selected="TabIcon_Me_Selected" @@ -102,9 +102,9 @@ background_visible="true" > <panel - class="panel_me_profile_view" - name="panel_me_profile" - filename="panel_me_profile.xml" + class="panel_me" + name="panel_me" + filename="panel_me.xml" label="Me" /> </sidetray_tab> @@ -112,7 +112,7 @@ <sidetray_tab name="sidebar_appearance" help_topic="sidebar_appearance" - tab_title="Appearance" + tab_title="My Appearance" description="Change your appearance and current look." image="TabIcon_Appearance_Off" image_selected="TabIcon_Appearance_Selected" @@ -120,9 +120,9 @@ background_visible="true" > <panel - class="panel_appearance" - name="panel_appearance" - filename="panel_appearance.xml" + class="sidepanel_appearance" + name="sidepanel_appearance" + filename="sidepanel_appearance.xml" label="Edit Appearance" font="SansSerifBold" /> @@ -131,7 +131,7 @@ <sidetray_tab name="sidebar_inventory" help_topic="sidebar_inventory" - tab_title="Inventory" + tab_title="My Inventory" description="Browse your inventory." image="TabIcon_Things_Off" image_selected="TabIcon_Things_Selected" diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml index 9636e321870a9edab4944ca0df262dc0ba893e81..98390758629ebed7bd10c2265463b0640bae72bf 100644 --- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml +++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml @@ -7,6 +7,24 @@ layout="topleft" name="home_tab" width="333"> + <scroll_container + color="DkGray" + follows="all" + layout="topleft" + left="0" + name="profile_scroll" + opaque="true" + height="560" + width="333" + top="0"> + <panel + background_visible="true" + height="560" + layout="topleft" + name="profile_scroll_panel" + top="0" + left="0" + width="311"> <panel background_visible="true" bg_alpha_color="DkGray2" @@ -227,7 +245,7 @@ right="-10" top="10" width="20" - image_name="TabIcon_Inventory_Selected"/> + image_name="TabIcon_Things_Selected"/> <text follows="all" height="90" @@ -242,4 +260,6 @@ Browse your inventory. </text> </panel> + </panel> + </scroll_container> </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 1171a8f0b5d8a20ae6630a11778e873c3d706d83..65bc48265dd09f0153bc7d9e2fb693902f015fce 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -43,33 +43,44 @@ auto_resize="true" halign="right" follows="right|bottom" - font="SansSerifSmall" image_selected="BuyArrow_Over" image_unselected="BuyArrow_Off" - image_pressed="BuyArrow_Press" + image_pressed="BuyArrow_Press" height="16" - left="-220" + left="-200" name="buycurrency" - pad_right="22px" + pad_right="20px" tool_tip="My Balance: Click to buy more L$" top="1" - width="117" /> + width="90" /> <text type="string" length="1" + font="SansSerifSmall" text_readonly_color="TimeTextColor" follows="right|bottom" halign="right" height="16" - top="3" + top="5" layout="topleft" - left_pad="15" + left_pad="-5" name="TimeText" text_color="TimeTextColor" tool_tip="Current time (Pacific)" width="80"> 12:00 AM </text> + <button + follows="right|bottom" + height="16" + image_selected="parcel_drk_VoiceNo" + image_unselected="parcel_drk_Voice" + is_toggle="true" + left_pad="5" + top="1" + name="volume_btn" + tool_tip="Global Volume Control" + width="16" /> <text enabled="true" follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml index 7722583ce21c59630836e11e5304f7dc928e3542..ccb57b65526f0ce6f3a483e0c4e4dcf7d28540f5 100644 --- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml +++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml @@ -9,7 +9,10 @@ width="300" height="35" layout="topleft" - follows="left|right"> + follows="left|right" + background_opaque="false" + background_visible="true" + bg_alpha_color="0.0 0.0 0.0 0.0" > <text top="2" left="10" diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml index 1f67a0a7328bbf6eeda16fd0bc0dffad078f9377..3384852f2729aae390d21258ca2c56c79e297c99 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml @@ -18,7 +18,7 @@ visible="false" width="380" /> <icon - height="24" + height="20" follows="top|right|left" image_name="ListItem_Select" layout="topleft" @@ -26,7 +26,7 @@ name="selected_icon" top="0" visible="false" - width="320" /> + width="380" /> <icon height="16" follows="top|left" @@ -46,7 +46,7 @@ text_color="white" top="4" value="..." - width="242" /> + width="330" /> <button follows="right" height="20" @@ -55,7 +55,7 @@ left_pad="5" right="-3" name="profile_btn" - top_delta="-2" + top="1" visible="false" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index 7f7777586c21459c5de986ac9844f8297c7101c5..f16329f8d78a174fb58468abe9a3e798340e6937 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- All our XML is utf-8 encoded. --> -<!-- All this does is establish the position of the "close" button on the toast. --> +<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!--> <floater legacy_header_height="18" @@ -9,6 +9,7 @@ title="" visible="false" layout="topleft" + height="40" width="305" left="0" top="0" @@ -26,36 +27,21 @@ drop_shadow_visible = "false" border = "false" > - - <!-- + <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!--> <text visible="false" follows="left|top|right|bottom" font="SansSerifBold" - height="40" + height="20" layout="topleft" - left="60" + left="20" name="toast_text" word_wrap="true" text_color="white" - top="20" - width="290"> + top="5" + width="260"> Toast text; </text> - <icon - top="20" - left="10" - width="32" - height="32" - follows="top|left" - layout="topleft" - visible="false" - color="1 1 1 1" - enabled="true" - image_name="notify_tip_icon.tga" - mouse_opaque="true" - name="icon" - />--> <button layout="topleft" top="-6" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml new file mode 100644 index 0000000000000000000000000000000000000000..4dae8e48a0b36ac61e0bf8a92eeedb7f12fcaaac --- /dev/null +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="400" + label="Appearance" + layout="topleft" + min_height="350" + min_width="240" + name="appearance panel" + width="333"> + <string + name="No Outfit" + value="No Outfit" /> + <panel + left="5" width="320" height="55" + background_visible="true" + background_opaque="false" + bg_alpha_color="0.2 0.2 0.2 1.0" + name="panel_currentlook" + follows="left|top|right"> + <button + follows="left|right|top" + font="SansSerif" + top="28" right="-10" width="60" height="20" + layout="topleft" + label="Edit" + name="editappearance_btn"/> + <button + follows="left|right|top" + top="28" left="5" width="25" height="22" + image_overlay="Inv_LookFolderOpen" + layout="topleft" + name="openoutfit_btn" + picture_style="true" /> + <text + top="10" width="150" left="5" height="15" follows="left|right|top" + layout="topleft" + font="SansSerif" text_color="LtGray" word_wrap="true" + mouse_opaque="false" name="currentlook_title"> + Current Outfit: + </text> + <text + top="32" width="150" left="32" height="15" follows="left|right|top" + layout="topleft" + font="SansSerifBold" text_color="white" word_wrap="true" + mouse_opaque="false" name="currentlook_name" > + MyOutfit + </text> + </panel> + + <filter_editor + follows="left|top|right" + font="SansSerif" + label="Filter" + layout="topleft" + left="15" + width="313" + height="20" + name="Filter" /> + <panel + class="panel_outfits_inventory" + filename="panel_outfits_inventory.xml" + name="panel_outfits_inventory" + follows="all" + height="271" + halign="center" + layout="topleft" + left="10" + top_pad="19" + width="313" /> + <button + follows="bottom|left" + height="25" + label="Wear" + layout="topleft" + left="10" + name="wear_btn" + top_pad="0" + width="80" /> + <button + follows="bottom|left" + height="25" + label="New Outfit" + layout="topleft" + left_pad="0" + name="newlook_btn" + top_delta="0" + width="90" /> + + <panel + class="panel_look_info" + filename="panel_look_info.xml" + follows="all" + layout="topleft" + left="0" + name="panel_look_info" + top="-200" + visible="false" /> + + <panel + class="panel_edit_wearable" + filename="panel_edit_wearable.xml" + follows="all" + layout="topleft" + left="0" + name="panel_edit_wearable" + top="-200" + visible="false" + width="333" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index cbcc3f10ad2a7828edf69a0f7d1a8f646a3f2db8..51b74307c8a8dbeb098df85096549efd6dc69e9f 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -1,127 +1,122 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="true" - follows="all" - height="570" - label="Things" - layout="topleft" - min_height="350" - min_width="240" - name="objects panel" - width="333"> - <panel - follows="all" - layout="topleft" - left="0" - name="sidepanel__inventory_panel" - top="0" - label="" - height="570" - visible="true" - width="330"> - <panel - class="panel_main_inventory" - filename="panel_main_inventory.xml" - follows="all" - layout="topleft" - left="0" - name="panel_main_inventory" - top="0" - label="" - height="500" - width="330" /> - <panel - height="25" - layout="bottomright" - help_topic="item_button_tab" - name="button_panel" - left="5" - bottom="5" - width="313"> - <button - enabled="true" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Info" - layout="topleft" - left="0" - name="info_btn" - top="0" - width="60" /> - <button - enabled="true" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Share" - layout="topleft" - left_pad="5" - name="share_btn" - top="0" - width="60" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Wear" - layout="topleft" - left="130" - name="wear_btn" - top="0" - width="60" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Play" - layout="topleft" - name="play_btn" - left="130" - top="0" - width="50" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Teleport" - layout="topleft" - left="130" - name="teleport_btn" - top="0" - width="77" /> - </panel> - </panel> - - <panel - follows="all" - layout="topleft" - left="0" - class="sidepanel_item_info" - filename="sidepanel_item_info.xml" - name="sidepanel__item_panel" - top="0" - label="" - height="570" - visible="false" - width="330"> - </panel> - - <panel - follows="all" - layout="topleft" - left="0" - class="sidepanel_task_info" - filename="sidepanel_task_info.xml" - name="sidepanel__task_panel" - top="0" - label="" - height="570" - visible="false" - width="330"> - </panel> - -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + label="Things" + layout="topleft" + min_height="350" + min_width="240" + name="objects panel" + width="333"> + <panel + follows="all" + layout="topleft" + left="0" + name="sidepanel__inventory_panel" + top="0" + label="" + height="570" + visible="true" + width="330"> + <panel + class="panel_main_inventory" + filename="panel_main_inventory.xml" + follows="all" + layout="topleft" + left="0" + name="panel_main_inventory" + top="0" + label="" + height="500" + width="330" /> + <panel + height="25" + layout="bottomright" + help_topic="item_button_tab" + name="button_panel" + left="5" + bottom="5" + width="313"> + <button + enabled="true" + follows="bottom|left" + height="25" + label="Info" + layout="topleft" + left="0" + name="info_btn" + top="0" + width="60" /> + <button + enabled="true" + follows="bottom|left" + height="25" + label="Share" + layout="topleft" + left_pad="5" + name="share_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + height="25" + label="Wear" + layout="topleft" + left="130" + name="wear_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + height="25" + label="Play" + layout="topleft" + name="play_btn" + left="130" + top="0" + width="50" /> + <button + enabled="false" + follows="bottom|left" + height="25" + label="Teleport" + layout="topleft" + left="130" + name="teleport_btn" + top="0" + width="77" /> + </panel> + </panel> + + <panel + follows="all" + layout="topleft" + left="0" + class="sidepanel_item_info" + filename="sidepanel_item_info.xml" + name="sidepanel__item_panel" + top="0" + label="" + height="570" + visible="false" + width="330"> + </panel> + + <panel + follows="all" + layout="topleft" + left="0" + class="sidepanel_task_info" + filename="sidepanel_task_info.xml" + name="sidepanel__task_panel" + top="0" + label="" + height="570" + visible="false" + width="330"> + </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 39cd75074e566795af344c8f71a1066e712ac167..db8a844eb0fbb672625c441ede7510646ced95ba 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -1,511 +1,519 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - auto_tile="true" - height="570" - layout="topleft" - name="item properties" - help_topic="item_properties" - save_rect="true" - title="Inventory Item Properties" - width="333"> - <panel.string - name="unknown"> - (unknown) - </panel.string> - <panel.string - name="public"> - (public) - </panel.string> - <panel.string - name="you_can"> - You can: - </panel.string> - <panel.string - name="owner_can"> - Owner can: - </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> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - right="-50" - mouse_opaque="true" - name="IconLocked" - top="4" - width="18" /> - <button - follows="top|right" - height="25" - image_overlay="BackArrow_Off" - layout="topleft" - name="back_btn" - picture_style="true" - right="-5" - tab_stop="false" - top="0" - width="25" /> - <panel - follows="all" - height="500" - label="" - layout="topleft" - left="5" - help_topic="" - top="30" - border="1" - width="313"> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemNameTitle" - top="5" - width="78"> - Name: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - max_length="63" - name="LabelItemName" - top_delta="0" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemDescTitle" - top_delta="20" - width="78"> - Description: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - max_length="127" - name="LabelItemDesc" - top_delta="0" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelCreatorTitle" - top="65" - width="78"> - Creator: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelCreatorName" - top_delta="0" - width="200"> - Nicole Linden - </text> - <button - follows="top|right" - font="SansSerifSmall" - height="16" - label="Profile..." - layout="topleft" - left_delta="144" - name="BtnCreator" - top_delta="0" - width="78" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelOwnerTitle" - top="85" - width="78"> - Owner: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelOwnerName" - top_delta="0" - width="200"> - Thrax Linden - </text> - <button - follows="top|right" - font="SansSerifSmall" - height="16" - label="Profile..." - layout="topleft" - left_delta="144" - name="BtnOwner" - top_delta="0" - width="78" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelAcquiredTitle" - top="105" - width="78"> - Acquired: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelAcquiredDate" - top_delta="0" - width="252"> - Wed May 24 12:50:46 2006 - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="OwnerLabel" - top="125" - width="78"> - You: - </text> - <check_box - height="16" - label="Edit" - layout="topleft" - left_pad="5" - name="CheckOwnerModify" - top_delta="0" - width="78" /> - <check_box - height="16" - label="Copy" - layout="topleft" - left_delta="0" - name="CheckOwnerCopy" - top_pad="5" - width="88" /> - <check_box - height="16" - label="Resell" - layout="topleft" - left_delta="0" - name="CheckOwnerTransfer" - top_pad="5" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="AnyoneLabel" - top_pad="5" - width="78"> - Anyone: - </text> - <check_box - height="16" - label="Copy" - layout="topleft" - left_pad="5" - name="CheckEveryoneCopy" - top_delta="0" - width="130" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="GroupLabel" - top_pad="5" - width="78"> - Group: - </text> - <check_box - height="16" - label="Share" - layout="topleft" - left_pad="5" - name="CheckShareWithGroup" - top_delta="5" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="NextOwnerLabel" - top_pad="5" - width="78"> - Next owner: - </text> - <check_box - height="16" - label="Edit" - layout="topleft" - left_pad="5" - name="CheckNextOwnerModify" - top_delta="0" - width="78" /> - <check_box - height="16" - label="Copy" - layout="topleft" - left_delta="0" - name="CheckNextOwnerCopy" - top_pad="5" - width="88" /> - <check_box - height="16" - label="Resell" - layout="topleft" - left_delta="0" - name="CheckNextOwnerTransfer" - top_pad="5" - width="106" /> - <check_box - height="16" - label="For Sale" - layout="topleft" - left="10" - name="CheckPurchase" - top_pad="5" - width="78" /> - <combo_box - height="19" - left_pad="5" - layout="topleft" - follows="left|top" - name="combobox sale copy" - width="90"> - <combo_box.item - label="Copy" - name="Copy" - value="Copy" /> - <combo_box.item - label="Original" - name="Original" - value="Original" /> - </combo_box> - <spinner - follows="left|top" - decimal_digits="0" - increment="1" - control_name="Edit Cost" - name="Edit Cost" - label="Price: L$" - label_width="60" - left="10" - width="180" - min_val="1" - height="19" - max_val="999999999" - top_pad="5"/> - <!--line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_pad="5" - max_length="25" - name="EditPrice" - top_delta="0" - width="242" /--> - <!--text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="BaseMaskDebug" - top="155" - width="330"> - B: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="OwnerMaskDebug" - top_delta="0" - width="270"> - O: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="GroupMaskDebug" - top_delta="0" - width="210"> - G: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="EveryoneMaskDebug" - top_delta="0" - width="150"> - E: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="NextMaskDebug" - top_delta="0" - width="90"> - N: - </text--> - <!--text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="SaleLabel" - top_pad="5" - width="330"> - Mark Item: - </text--> - <!--radio_group - draw_border="false" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - name="RadioSaleType" - top_delta="0" - width="252"> - <radio_item - height="16" - label="Original" - layout="topleft" - left="0" - name="radio" - top="0" - width="70" /> - <radio_item - height="16" - label="Copy" - layout="topleft" - left_delta="60" - name="radio2" - top_delta="0" - width="70" /> - </radio_group--> - <!--text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="TextPrice" - top_pad="5" - width="78"> - Price: L$ - </text--> - </panel> - <panel - height="25" - layout="bottomright" - help_topic="button_tab" - name="button_panel" - left="5" - bottom="5" - width="313"> - <button - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Edit" - layout="topleft" - left="0" - name="edit_btn" - top="0" - width="50" /> - <button - follows="bottom|right" - font="SansSerifSmallBold" - height="25" - label="Cancel" - layout="topleft" - name="cancel_btn" - right="-1" - top="0" - width="70" /> - <button - follows="bottom|right" - font="SansSerifSmallBold" - height="25" - label="Save" - layout="topleft" - name="save_btn" - left_pad="-135" - top="0" - width="60" /> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + auto_tile="true" + height="570" + layout="topleft" + name="item properties" + help_topic="item_properties" + save_rect="true" + title="Inventory Item Properties" + width="333"> + <panel.string + name="unknown"> + (unknown) + </panel.string> + <panel.string + name="public"> + (public) + </panel.string> + <panel.string + name="you_can"> + You can: + </panel.string> + <panel.string + name="owner_can"> + Owner can: + </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> + <icon + follows="top|right" + height="18" + image_name="Lock" + layout="topleft" + right="-50" + mouse_opaque="true" + name="IconLocked" + top="4" + width="18" /> + <button + follows="top|right" + height="25" + image_overlay="BackArrow_Off" + layout="topleft" + name="back_btn" + picture_style="true" + right="-5" + tab_stop="false" + top="0" + width="25" /> + <panel + follows="all" + height="500" + label="" + layout="topleft" + left="5" + help_topic="" + top="30" + border="1" + width="313"> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemNameTitle" + top="5" + width="78"> + Name: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + max_length="63" + name="LabelItemName" + top_delta="0" + width="225" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemDescTitle" + top_delta="20" + width="78"> + Description: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + max_length="127" + name="LabelItemDesc" + top_delta="0" + width="225" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelCreatorTitle" + top="65" + width="78"> + Creator: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelCreatorName" + top_delta="0" + width="140"> + Nicole Linden + </text> + <button + follows="top|right" + height="16" + label="Profile..." + layout="topleft" + left_delta="144" + name="BtnCreator" + top_delta="0" + width="78" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelOwnerTitle" + top="85" + width="78"> + Owner: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelOwnerName" + top_delta="0" + width="140"> + Thrax Linden + </text> + <button + follows="top|right" + height="16" + label="Profile..." + layout="topleft" + left_delta="144" + name="BtnOwner" + top_delta="0" + width="78" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelAcquiredTitle" + top="105" + width="78"> + Acquired: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelAcquiredDate" + top_delta="0" + width="222"> + Wed May 24 12:50:46 2006 + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="OwnerLabel" + top="125" + width="78"> + You: + </text> + <check_box + height="16" + label="Edit" + layout="topleft" + left_pad="5" + name="CheckOwnerModify" + top_delta="0" + width="78" /> + <check_box + height="16" + label="Copy" + layout="topleft" + left_delta="0" + name="CheckOwnerCopy" + top_pad="5" + width="88" /> + <check_box + height="16" + label="Resell" + layout="topleft" + left_delta="0" + name="CheckOwnerTransfer" + top_pad="5" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="AnyoneLabel" + top_pad="5" + width="78"> + Anyone: + </text> + <check_box + height="16" + label="Copy" + layout="topleft" + left_pad="5" + name="CheckEveryoneCopy" + top_delta="0" + width="130" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="GroupLabel" + top_pad="5" + width="78"> + Group: + </text> + <check_box + height="16" + label="Share" + layout="topleft" + left_pad="5" + name="CheckShareWithGroup" + top_delta="5" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="25" + layout="topleft" + left="10" + name="NextOwnerLabel" + top_pad="5" + width="78" + word_wrap="true"> + Next owner: + </text> + <check_box + height="16" + label="Edit" + layout="topleft" + left_pad="5" + name="CheckNextOwnerModify" + top_delta="0" + width="78" /> + <check_box + height="16" + label="Copy" + layout="topleft" + left_delta="0" + name="CheckNextOwnerCopy" + top_pad="5" + width="88" /> + <check_box + height="16" + label="Resell" + layout="topleft" + left_delta="0" + name="CheckNextOwnerTransfer" + top_pad="5" + width="106" /> + <check_box + height="16" + label="For Sale" + layout="topleft" + left="10" + name="CheckPurchase" + top_pad="5" + width="78" /> + <combo_box + height="19" + left_pad="5" + layout="topleft" + follows="left|top" + name="combobox sale copy" + width="110"> + <combo_box.item + label="Copy" + name="Copy" + value="Copy" /> + <combo_box.item + label="Original" + name="Original" + value="Original" /> + </combo_box> + <spinner + follows="left|top" + decimal_digits="0" + increment="1" + control_name="Edit Cost" + name="Edit Cost" + label="Price:" + label_width="100" + left="10" + width="192" + min_val="1" + height="19" + max_val="999999999" + top_pad="5"/> + <text + type="string" + length="1" + height="15" + follows="left|top" + layout="topleft" + left_delta="82" + name="CurrencySymbol" + top_delta="1" + width="18"> + L$ + </text> + <!--line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_pad="5" + max_length="25" + name="EditPrice" + top_delta="0" + width="242" /--> + <!--text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="BaseMaskDebug" + top="155" + width="330"> + B: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="OwnerMaskDebug" + top_delta="0" + width="270"> + O: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="GroupMaskDebug" + top_delta="0" + width="210"> + G: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="EveryoneMaskDebug" + top_delta="0" + width="150"> + E: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="NextMaskDebug" + top_delta="0" + width="90"> + N: + </text--> + <!--text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="SaleLabel" + top_pad="5" + width="330"> + Mark Item: + </text--> + <!--radio_group + draw_border="false" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + name="RadioSaleType" + top_delta="0" + width="252"> + <radio_item + height="16" + label="Original" + layout="topleft" + left="0" + name="radio" + top="0" + width="70" /> + <radio_item + height="16" + label="Copy" + layout="topleft" + left_delta="60" + name="radio2" + top_delta="0" + width="70" /> + </radio_group--> + <!--text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="TextPrice" + top_pad="5" + width="78"> + Price: L$ + </text--> + </panel> + <panel + height="25" + layout="bottomright" + help_topic="button_tab" + name="button_panel" + left="5" + bottom="5" + width="313"> + <button + follows="bottom|left" + height="25" + label="Edit" + layout="topleft" + left="0" + name="edit_btn" + top="0" + width="50" /> + <button + follows="bottom|right" + height="25" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-1" + top="0" + width="70" /> + <button + follows="bottom|right" + height="25" + label="Save" + layout="topleft" + name="save_btn" + left_pad="-135" + top="0" + width="60" /> + </panel> +</panel> 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 8eb22541126304100d4f973b00110174e5ffd11a..348f0dfc095edf6a4bb8eb823a3ccab16b8a0cfc 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -203,7 +203,6 @@ width="150" /> <button follows="top|left" - font="SansSerifSmall" height="20" label="Deed" label_selected="Deed" @@ -485,7 +484,6 @@ width="313"> <button follows="bottom|left" - font="SansSerifSmallBold" height="25" label="Edit" layout="topleft" @@ -495,7 +493,6 @@ width="50" /> <button follows="bottom|left" - font="SansSerifSmallBold" height="25" label="Open" layout="topleft" @@ -505,7 +502,6 @@ width="60" /> <button follows="bottom|left" - font="SansSerifSmallBold" height="25" label="Pay" layout="topleft" @@ -515,7 +511,6 @@ width="50" /> <button follows="bottom|left" - font="SansSerifSmallBold" height="25" label="Buy" layout="topleft" @@ -525,7 +520,6 @@ width="60" /> <button follows="bottom|right" - font="SansSerifSmallBold" height="25" label="Cancel" layout="topleft" @@ -535,7 +529,6 @@ width="70" /> <button follows="bottom|right" - font="SansSerifSmallBold" height="25" label="Save" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index c850dce141947d07008d4fc24c75be8d0e7fbd5b..90fb3a6bf990dfc6af9fbd526ed890cdb728332a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/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> @@ -44,8 +44,8 @@ <!-- Disconnection --> <string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string> - - + + <!-- Tooltip, lltooltipview.cpp --> <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar --> <string name="TooltipNoName">(no name)</string> <!-- No name on an object --> @@ -80,11 +80,11 @@ <!-- text for SLURL labels --> <string name="SLurlLabelTeleport">Teleport to</string> <string name="SLurlLabelShowOnMap">Show Map for</string> - + <!-- ButtonToolTips, llfloater.cpp --> <string name="BUTTON_CLOSE_DARWIN">Close (⌘W)</string> <string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string> - <string name="BUTTON_RESTORE">Restore</string> + <string name="BUTTON_RESTORE">Restore</string> <string name="BUTTON_MINIMIZE">Minimize</string> <string name="BUTTON_TEAR_OFF">Tear Off</string> <string name="BUTTON_DOCK">Dock</string> @@ -103,24 +103,24 @@ <!-- Indicates something is being loaded. Maybe should be merged with RetrievingData --> <string name="LoadingData">Loading...</string> - - + + <!-- namecache --> <!-- Avatar name: text shown for LLUUID::null --> <string name="AvatarNameNobody">(nobody)</string> - + <!-- Avatar name: text shown while fetching name --> <string name="AvatarNameWaiting">(waiting)</string> <!-- Avatar name: More than one avatar is selected/used here --> <string name="AvatarNameMultiple">(multiple)</string> - + <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. --> <string name="AvatarNameHippos">(hippos)</string> - + <!-- Group name: text shown for LLUUID::null --> <string name="GroupNameNone">(none)</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> @@ -133,7 +133,7 @@ <string name="AssetErrorCircuitGone">Circuit gone</string> <string name="AssetErrorPriceMismatch">Viewer and server do not agree on price</string> <string name="AssetErrorUnknownStatus">Unknown status</string> - + <!-- Asset Type human readable names: these will replace variable [TYPE] in notification FailedToFindWearable* --> <string name="texture">texture</string> <string name="sound">sound</string> @@ -159,7 +159,7 @@ <string name="simstate">simstate</string> <string name="favorite">favorite</string> <string name="symbolic link">link</string> - + <!-- llvoavatar. Displayed in the avatar chat bubble --> <string name="AvatarEditingAppearance">(Editing Appearance)</string> <string name="AvatarAway">Away</string> @@ -236,17 +236,17 @@ <string name="anim_express_worry">Worry</string> <string name="anim_yes_happy">Yes (Happy)</string> <string name="anim_yes_head">Yes</string> - + <!-- world map --> <string name="texture_loading">Loading...</string> <string name="worldmap_offline">Offline</string> <string name="worldmap_results_none_found">None found.</string> - + <!-- animations uploading status codes --> <string name="Ok">OK</string> <string name="Premature end of file">Premature end of file</string> <string name="ST_NO_JOINT">Can't find ROOT or JOINT.</string> - + <!-- Chat --> <string name="whisper">whispers:</string> <string name="shout">shouts:</string> @@ -274,7 +274,7 @@ <string name="SIM_ACCESS_ADULT">Adult</string> <string name="SIM_ACCESS_DOWN">Offline</string> <string name="SIM_ACCESS_MIN">Unknown</string> - + <!-- For use when we do not have land type back from the server --> <string name="land_type_unknown">(unknown)</string> @@ -294,14 +294,14 @@ <string name="compressed_image_files">Compressed Images</string> <string name="load_files">Load Files</string> <string name="choose_the_directory">Choose Directory</string> - + <!-- LSL Usage Hover Tips --> <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window). This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings. --> <string name="LSLTipSleepTime" translate="false"> Sleeps script for [SLEEP_TIME] seconds. </string> - + <string name="LSLTipText_llSin" translate="false"> float llSin(float theta) Returns the sine of theta (theta in radians) @@ -1732,7 +1732,7 @@ Returns the value for header for request_id </string> <string name="LSLTipText_llSetPrimMediaParams" translate="false"> llSetPrimMediaParams(integer face, list params) -Sets the media params for a particular face on an object. If media is not already on this object, add it. +Sets the media params for a particular face on an object. If media is not already on this object, add it. List is a set of name/value pairs in no particular order. Params not specified are unchanged, or if new media is added then set to the default specified. The possible names are below, along with the types of values and what they mean. </string> @@ -1747,11 +1747,11 @@ Clears (deletes) the media and all params from the given face. </string> <!-- Avatar busy/away mode --> - <string name="AvatarSetNotAway">Set Not Away</string> - <string name="AvatarSetAway">Set Away</string> - <string name="AvatarSetNotBusy">Set Not Busy</string> - <string name="AvatarSetBusy">Set Busy</string> - + <string name="AvatarSetNotAway">Not Away</string> + <string name="AvatarSetAway">Away</string> + <string name="AvatarSetNotBusy">Not Busy</string> + <string name="AvatarSetBusy">Busy</string> + <!-- Wearable Types --> <string name="shape">Shape</string> <string name="skin">Skin</string> @@ -1769,7 +1769,7 @@ 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> - + <!-- notify --> <string name="next">Next</string> <string name="ok">OK</string> @@ -1782,12 +1782,11 @@ Clears (deletes) the media and all params from the given face. <string name="GroupNotifySaveAttachment">Save Attachment</string> <string name="TeleportOffer">Teleport offering</string> <!-- start-up toast's string--> - <string name="StartUpNotification">%d new notification arrived while you were away...</string> - <string name="StartUpNotifications">%d new notifications arrived while you were away...</string> + <string name="StartUpNotifications">New notifications arrived while you were away.</string> <!-- overflow toast's string--> <string name="OverflowInfoChannelString">You have %d more notification</string> - - + + <!-- body parts --> <string name="BodyPartsRightArm">Right Arm</string> <string name="BodyPartsHead">Head</string> @@ -1800,10 +1799,10 @@ Clears (deletes) the media and all params from the given face. <string name="GraphicsQualityLow">Low</string> <string name="GraphicsQualityMid">Mid</string> <string name="GraphicsQualityHigh">High</string> - + <!-- mouselook --> <string name="LeaveMouselook">Press ESC to return to World View</string> - + <!-- inventory --> <string name="InventoryNoMatchingItems">No matching items found in inventory.</string> <string name="InventoryNoTexture"> @@ -1831,7 +1830,7 @@ this texture in your inventory <string name="Wave" value=" Wave " /> <string name="HelloAvatar" value=" Hello, avatar! " /> <string name="ViewAllGestures" value=" View All >>" /> - + <!-- inventory filter --> <!-- use value="" because they have preceding spaces --> <string name="Animations" value=" Animations," /> @@ -1881,21 +1880,21 @@ this texture in your inventory <!-- inventory FVBridge --> <string name="Buy">Buy</string> <string name="BuyforL$">Buy for L$</string> - + <string name="Stone">Stone</string> <string name="Metal">Metal</string> <string name="Glass">Glass</string> <string name="Wood">Wood</string> <string name="Flesh">Flesh</string> <string name="Plastic">Plastic</string> - <string name="Rubber">Rubber</string> + <string name="Rubber">Rubber</string> <string name="Light">Light</string> - + <!-- keyboard --> <string name="KBShift">Shift</string> <string name="KBCtrl">Ctrl</string> - <!-- Avatar Skeleton --> + <!-- Avatar Skeleton --> <string name="Chest">Chest</string> <string name="Skull">Skull</string> <string name="Left Shoulder">Left Shoulder</string> @@ -1925,7 +1924,7 @@ this texture in your inventory <string name="L Lower Leg">L Lower Leg</string> <string name="Stomach">Stomach</string> <string name="Left Pec">Left Pec</string> - <string name="Right Pec">Right Pec</string> + <string name="Right Pec">Right Pec</string> <!-- Avatar age computation, see LLDateUtil::ageFromDate --> <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] old</string> @@ -1934,7 +1933,7 @@ this texture in your inventory <string name="WeeksOld">[AGEWEEKS] old</string> <string name="DaysOld">[AGEDAYS] old</string> <string name="TodayOld">Joined today</string> - + <!-- AgeYearsA = singular, AgeYearsB = plural, AgeYearsC = plural for non-English languages like Russian @@ -1967,16 +1966,16 @@ this texture in your inventory <string name="NoPaymentInfoOnFile">No Payment Info On File</string> <string name="AgeVerified">Age-verified</string> <string name="NotAgeVerified">Not Age-verified</string> - - <!-- HUD Position --> - <string name="Center 2">Center 2</string> - <string name="Top Right">Top Right</string> - <string name="Top">Top</string> - <string name="Top Left">Top Left</string> - <string name="Center">Center</string> - <string name="Bottom Left">Bottom Left</string> - <string name="Bottom">Bottom</string> - <string name="Bottom Right">Bottom Right</string> + + <!-- HUD Position --> + <string name="Center 2">Center 2</string> + <string name="Top Right">Top Right</string> + <string name="Top">Top</string> + <string name="Top Left">Top Left</string> + <string name="Center">Center</string> + <string name="Bottom Left">Bottom Left</string> + <string name="Bottom">Bottom</string> + <string name="Bottom Right">Bottom Right</string> <!-- compile queue--> <string name="CompileQueueDownloadedCompiling">Downloaded, now compiling</string> @@ -1998,11 +1997,11 @@ this texture in your inventory <string name="CompileSuccessful">Compile successful!</string> <string name="CompileSuccessfulSaving">Compile successful, saving...</string> <string name="SaveComplete">Save complete.</string> - <string name="ObjectOutOfRange">Script (object out of range)</string> - + <string name="ObjectOutOfRange">Script (object out of range)</string> + <!-- god tools --> <string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string> - + <!-- groups --> <string name="GroupsNone">none</string> <string name="Group" value=" (group)" /> @@ -2013,14 +2012,14 @@ this texture in your inventory <string name="Balance">Balance</string> <string name="Credits">Credits</string> <string name="Debits">Debits</string> - <string name="Total">Total</string> - <string name="NoGroupDataFound">No group data found for group </string> - + <string name="Total">Total</string> + <string name="NoGroupDataFound">No group data found for group </string> + <!-- floater IM --> <string name="IMParentEstate">parent estate</string> <string name="IMMainland">mainland</string> <string name="IMTeen">teen</string> - + <!-- floater region info --> <!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* --> <string name="RegionInfoError">error</string> @@ -2036,45 +2035,37 @@ this texture in your inventory <!-- script editor --> <string name="CursorPos">Line [LINE], Column [COLUMN]</string> - + <!-- panel dir browser --> <string name="PanelDirCountFound">[COUNT] found</string> <string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string> <!-- panel dir events --> <string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string> - + <!-- panel contents --> <string name="PanelContentsNewScript">New Script</string> - + <!-- Mute --> <string name="MuteByName">(by name)</string> <string name="MuteAgent">(resident)</string> <string name="MuteObject">(object)</string> <string name="MuteGroup">(group)</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="none_text" value=" (none) " /> <string name="never_text" value=" (never) " /> - + <!--Region Details--> <string name="GroupOwned">Group Owned</string> <string name="Public">Public</string> - + <!-- panel classified --> <string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string> <string name="ClassifiedUpdateAfterPublish">(will update after publish)</string> - - <!-- group voting dialog --> - <string name="GroupVoteYes">Yes</string> - <string name="GroupVoteNo">No</string> - <string name="GroupVoteNoActiveProposals">There are currently no active proposals</string> - <string name="GroupVoteNoArchivedProposals">There are currently no archived proposals</string> - <string name="GroupVoteRetrievingArchivedProposals">Retrieving archived proposals</string> - <string name="GroupVoteRetrievingActiveProposals">Retrieving active proposals</string> <!-- Multi Preview Floater --> <string name="MultiPreviewTitle">Preview</string> @@ -2089,7 +2080,7 @@ this texture in your inventory <string name="InvOfferGaveYou">gave you</string> <string name="InvOfferYouDecline">You decline</string> <string name="InvOfferFrom">from</string> - + <!-- group money --> <string name="GroupMoneyTotal">Total</string> <string name="GroupMoneyBought">bought</string> @@ -2101,21 +2092,21 @@ this texture in your inventory <string name="GroupMoneyBalance">Balance</string> <string name="GroupMoneyCredits">Credits</string> <string name="GroupMoneyDebits">Debits</string> - + <!-- viewer object --> <string name="ViewerObjectContents">Contents</string> - + <!-- Viewer menu --> <string name="AcquiredItems">Acquired Items</string> - <string name="Cancel">Cancel</string> - <string name="UploadingCosts">Uploading %s costs</string> + <string name="Cancel">Cancel</string> + <string name="UploadingCosts">Uploading %s costs</string> <string name="UnknownFileExtension"> Unknown file extension .%s Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh - </string> - <string name="AddLandmarkNavBarMenu">Add Landmark...</string> + </string> + <string name="AddLandmarkNavBarMenu">Add Landmark...</string> <string name="EditLandmarkNavBarMenu">Edit Landmark...</string> - + <!-- menu accelerators --> <string name="accel-mac-control">⌃</string> <string name="accel-mac-command">⌘</string> @@ -2126,72 +2117,72 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="accel-win-shift">Shift+</string> <!-- Previews --> - <string name="FileSaved">File Saved</string> - <string name="Receiving">Receiving</string> - + <string name="FileSaved">File Saved</string> + <string name="Receiving">Receiving</string> + <!-- status bar , Time --> - <string name="AM">AM</string> - <string name="PM">PM</string> - <string name="PST">PST</string> - <string name="PDT">PDT</string> + <string name="AM">AM</string> + <string name="PM">PM</string> + <string name="PST">PST</string> + <string name="PDT">PDT</string> <!-- Directions, HUD --> - <string name="Forward">Forward</string> - <string name="Left">Left</string> - <string name="Right">Right</string> - <string name="Back">Back</string> - <string name="North">North</string> - <string name="South">South</string> - <string name="West">West</string> - <string name="East">East</string> - <string name="Up">Up</string> - <string name="Down">Down</string> + <string name="Forward">Forward</string> + <string name="Left">Left</string> + <string name="Right">Right</string> + <string name="Back">Back</string> + <string name="North">North</string> + <string name="South">South</string> + <string name="West">West</string> + <string name="East">East</string> + <string name="Up">Up</string> + <string name="Down">Down</string> <!-- Search Category Strings --> - <string name="Any Category">Any Category</string> - <string name="Shopping">Shopping</string> - <string name="Land Rental">Land Rental</string> - <string name="Property Rental">Property Rental</string> - <string name="Special Attraction">Special Attraction</string> - <string name="New Products">New Products</string> - <string name="Employment">Employment</string> - <string name="Wanted">Wanted</string> - <string name="Service">Service</string> - <string name="Personal">Personal</string> + <string name="Any Category">Any Category</string> + <string name="Shopping">Shopping</string> + <string name="Land Rental">Land Rental</string> + <string name="Property Rental">Property Rental</string> + <string name="Special Attraction">Special Attraction</string> + <string name="New Products">New Products</string> + <string name="Employment">Employment</string> + <string name="Wanted">Wanted</string> + <string name="Service">Service</string> + <string name="Personal">Personal</string> <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="None">None</string> - <string name="Linden Location">Linden Location</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Arts & Culture</string> - <string name="Business">Business</string> - <string name="Educational">Educational</string> - <string name="Gaming">Gaming</string> - <string name="Hangout">Hangout</string> - <string name="Newcomer Friendly">Newcomer Friendly</string> + <string name="None">None</string> + <string name="Linden Location">Linden Location</string> + <string name="Adult">Adult</string> + <string name="Arts&Culture">Arts & Culture</string> + <string name="Business">Business</string> + <string name="Educational">Educational</string> + <string name="Gaming">Gaming</string> + <string name="Hangout">Hangout</string> + <string name="Newcomer Friendly">Newcomer Friendly</string> <string name="Parks&Nature">Parks & Nature</string> - <string name="Residential">Residential</string> + <string name="Residential">Residential</string> <!--<string name="Shopping">Shopping</string> --> - <string name="Stage">Stage</string> - <string name="Other">Other</string> - <string name="Any">Any</string> - <string name="You">You</string> - + <string name="Stage">Stage</string> + <string name="Other">Other</string> + <string name="Any">Any</string> + <string name="You">You</string> + <!-- punctuations --> - <string name=":">:</string> - <string name=",">,</string> - <string name="...">...</string> - <string name="***">***</string> - <string name="(">(</string> + <string name=":">:</string> + <string name=",">,</string> + <string name="...">...</string> + <string name="***">***</string> + <string name="(">(</string> <string name=")">)</string> - <string name=".">.</string> - <string name="'">'</string> - <string name="---">---</string> + <string name=".">.</string> + <string name="'">'</string> + <string name="---">---</string> <!-- media --> <string name="Multiple Media">Multiple Media</string> <string name="Play Media">Play/Pause Media</string> - + <!-- OSMessageBox messages --> <string name="MBCmdLineError"> An error was found parsing the command line. @@ -2800,13 +2791,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Wide Lips">Wide Lips</string> <string name="Wild">Wild</string> <string name="Wrinkles">Wrinkles</string> - + <!-- Favorites Bar --> <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> - + <!-- Strings used by the (currently Linux) auto-updater app --> <string name="UpdaterWindowTitle"> [APP_NAME] Update @@ -2850,7 +2841,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_to_label">To</string> <string name="IM_moderator_label">(Moderator)</string> - <string name="ringing-im"> Joining Voice Chat... </string> @@ -2863,6 +2853,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="answering-im"> Connecting... </string> + <string name="conference-title"> + Ad-hoc Conference + </string> <string name="inventory_item_offered-im"> Inventory item offered </string> diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml new file mode 100644 index 0000000000000000000000000000000000000000..a35e2c3663c4f68377411d93e4978d161f7c9ee0 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> + +<avatar_icon default_icon_name="Generic_Person_Large"> +</avatar_icon> diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml index 5bb48ef5aa2e3c5bec5ee5249a722057b7392ee3..7c54e618ef63740cdb8cd30566befe263c6ad7a2 100644 --- a/indra/newview/skins/default/xui/en/widgets/button.xml +++ b/indra/newview/skins/default/xui/en/widgets/button.xml @@ -1,4 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Additional attributes: + image_pressed + image_pressed_selected + --> <button image_unselected="PushButton_Off" image_selected="PushButton_Selected" image_disabled_selected="PushButton_Selected_Disabled" @@ -11,7 +15,6 @@ image_color="ButtonImageColor" image_color_disabled="ButtonImageColor" flash_color="ButtonFlashBgColor" - font="SansSerifSmall" hover_glow_amount="0.15" halign="center" scale_image="true"> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml new file mode 100644 index 0000000000000000000000000000000000000000..5011bf6a61aa58afbca4c5dbbcda0f1409c21b5d --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<chiclet_script + name="script_chiclet"> + <icon + name="chiclet_icon" + follows="all" + mouse_opaque="false" + image_name="Generic_Object_Small" /> +</expandable_text> \ No newline at end of file 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 fa3cb9275ec9afb9f9f76c386811fbe86a139686..132bd24bcae8f11e750cb65c505d18f216f5f70a 100644 --- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml @@ -16,7 +16,9 @@ scale_image="true" pad_right="24" image_unselected="DropDown_Off" - image_selected="DropDown_Selected" + image_selected="DropDown_On" + image_pressed="DropDown_Press" + image_pressed_selected="DropDown_Press" image_disabled="DropDown_Disabled" /> <combo_box.combo_list bg_writeable_color="MenuDefaultBgColor" background_visible="true" diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml index 6171be034f4b440171101213fe9fae9879089a33..4229f34c09ff6f6a281564401430611753d5cae9 100644 --- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<gesture_combo_box font="SansSerifSmall" +<gesture_combo_box label="Gestures" list_position="below" max_chars="20" @@ -7,7 +7,6 @@ <gesture_combo_box.combo_button name="Combobox Button" label="" hover_glow_amount="0.15" - font="SansSerifSmall" scale_image="true" image_unselected="ComboButton_Off" image_selected="ComboButton_Selected" @@ -17,15 +16,15 @@ label="" halign="center" hover_glow_amount="0.15" - font="SansSerif" scale_image="true" + image_selected="PushButton_Selected_Press" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" image_unselected="PushButton_Off" - image_selected="PushButton_Selected" image_disabled="PushButton_Disabled" image_disabled_selected="PushButton_Selected_Disabled" /> <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor" - scroll_bar_bg_visible="true" /> + scroll_bar_bg_visible="false" /> <gesture_combo_box.combo_editor name="Combo Text Entry" - select_on_focus="true" - font="SansSerifSmall" /> + select_on_focus="true" /> </gesture_combo_box> diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ec206023e5b89128caf1413e76393cf2e9b7ce7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml @@ -0,0 +1,10 @@ +<?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" + /> 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 d88bcfab1d7b6445f114247b1d8f9c204534a3e5..17b1479ec4df7d03f980820a195ef587c3ed26c4 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -11,7 +11,7 @@ add_landmark_image_disabled="Favorite_Star_Off" add_landmark_image_hover="Favorite_Star_Over" add_landmark_image_selected="Favorite_Star_Press" - add_landmark_hpad="2" + icon_hpad="2" allow_text_entry="true" list_position="below" show_text_as_tentative="false" @@ -38,6 +38,60 @@ scale_image="false" top="19" left="-3" /> + <voice_icon + name="voice_icon" + width="22" + height="18" + top="21" + image_name="parcel_lght_VoiceNo" + /> + <fly_icon + name="fly_icon" + width="22" + height="18" + top="21" + image_name="parcel_lght_FlyNo" + /> + <push_icon + name="push_icon" + width="22" + height="18" + top="21" + image_name="parcel_lght_PushNo" + /> + <build_icon + name="build_icon" + width="22" + height="18" + top="21" + image_name="parcel_lght_BuildNo" + /> + <scripts_icon + name="scripts_icon" + width="22" + height="18" + top="21" + image_name="parcel_lght_ScriptsNo" + /> + <!-- NOTE: Placeholder icon, there is no dark grayscale version --> + <damage_icon + name="damage_icon" + width="22" + height="18" + top="21" + image_name="parcel_lght_Damage" + /> + <!-- Default text color is invisible on top of nav bar background --> + <damage_text + name="damage_text" + width="50" + height="18" + top="16" + halign="right" + font="SansSerifSmall" + text_color="TextFgColor" + /> + <combo_button name="Location History" label="" pad_right="0"/> diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item.xml b/indra/newview/skins/default/xui/en/widgets/menu_item.xml index c98e9cb6b839b3c7aa5f846c1e18b66b3b36a53f..2bbaa6233ff717ad154c31cdc6fd7c64bb690c69 100644 --- a/indra/newview/skins/default/xui/en/widgets/menu_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/menu_item.xml @@ -1,6 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Use this for the top-level menu styling --> -<menu_item - font="SansSerifSmall" - > +<menu_item> </menu_item> diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml index 0794b49a0c63967a7360be806cd5b5f7af5a5f2c..f936a1e208af0e08a843b39472889cbc95bc66f8 100644 --- a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml +++ b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml @@ -1,9 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<scroll_column_header image_unselected="square_btn_32x128.tga" - image_selected="square_btn_selected_32x128.tga" - image_disabled="square_btn_32x128.tga" - image_disabled_selected="square_btn_selected_32x128.tga" - image_overlay="combobox_arrow.tga" +<scroll_column_header + image_unselected="SegmentedBtn_Middle_Selected" + image_selected="SegmentedBtn_Middle_Selected" + image_pressed="SegmentedBtn_Middle_Selected_Press" + image_disabled="SegmentedBtn_Middle_Disabled" + image_disabled_selected="SegmentedBtn_Middle_Selected_Disabled" + image_overlay="DisclosureArrow_Opened_Off" image_overlay_alignment="right" halign="left" - scale_image="true"/> + scale_image="true" /> 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 bc1ca339a2054ce9953be12ea1deb66715694178..706c89f5ed155bcf438253d73f011d02e928edce 100644 --- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml @@ -4,6 +4,8 @@ thumb_center_color="SliderThumbCenterColor" thumb_image="SliderThumb_Off" thumb_image_pressed="SliderThumb_Press" - thumb_image_disabled="SliderThumb_Disabled" - track_image="SliderTrack_Horiz" - track_highlight_image="SliderTrack_Horiz" /> + thumb_image_disabled="SliderThumb_Disabled" + track_image_horizontal="SliderTrack_Horiz" + track_image_vertical="SliderTrack_Vert" + track_highlight_horizontal_image="SliderTrack_Horiz" + track_highlight_vertical_image="SliderTrack_Vert" /> 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 f1401140deba3b7d952e38a176a54d690769ecd6..477c6fb8b8a060b4ab0bd6f94e219e77b61e8fb7 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -2,7 +2,7 @@ <tab_container tab_min_width="60" tab_max_width="150" font_halign="center" - font="SansSerif" + font="SansSerifSmall" tab_height="21"> <first_tab tab_top_image_unselected="TabTop_Left_Off" tab_top_image_selected="TabTop_Left_Selected" 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 1d8257fbc8ae0b308d4c09f24a1cdaef40e18dc6..7781bdd066bb62fd579a3ede8e4c1cfd88740b4f 100644 --- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -6,13 +6,18 @@ image_unselected="SegmentedBtn_Left_Off" --> <speak_button + follows="left|right" + image_selected="SegmentedBtn_Left_Selected_Press" + image_unselected="SegmentedBtn_Left_Off" + image_pressed="SegmentedBtn_Left_Selected_Press" + image_pressed_selected="SegmentedBtn_Left_Selected_Press" name="left" label="Speak" label_selected="Speak" - font="SansSerifSmall" tab_stop="false" /> <show_button + follows="right" name="right" label="" left="0" @@ -21,10 +26,14 @@ bottom="0" tab_stop="false" is_toggle="true" - image_selected="ComboButton_UpSelected" - image_unselected="ComboButton_UpOff" + 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" /> <monitor + follows="right" name="monitor" left="0" top="18" 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 6b49f832fd75272b4e872116aecf6985c0fa393e..a19201f7c33ff1db56c5ef28ad2d3524d0e3dac7 100644 --- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml +++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml @@ -5,6 +5,8 @@ padding="4" wrap="true" font="SansSerif" - bg_opaque_color="ToolTipBgColor" + bg_opaque_image="Tooltip" + background_opaque="true" background_visible="true" + text_color="ToolTipTextColor" /> diff --git a/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f72ad65a1513bdd53d9d735788e705bd3eb373a --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Global settings for all widgets ("UI Controls") --> +<ui_ctrl + font="SansSerif" + /> 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 ff50b56a32fd35b8cafe2f3fde923e0d9c001de8..cdc7ae49ffeb744fbb3ce2cd82de04fe6365549c 100644 --- a/indra/newview/skins/default/xui/es/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_about" title="NAVEGADOR"> + <floater.string name="home_page_url"> + http://es.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://es.secondlife.com/support + </floater.string> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Atrás" name="back" width="75"/> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 33754f39356ce1f99ed414b1cbaf4ae3a0ab398b..fdb6a920841f5b58d53138ea625f27563184ab55 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> + <menu 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> + </menu> <menu label="Archivo" name="File"> <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> <menu label="Subir" name="upload"> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 86f3f1f1259c9811a4db37aaf8b4d871eb78f816..6b58bbea4700018d8d5024b8631dd6451a17e44b 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -374,10 +374,13 @@ La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no Debe escribir tanto el nombre como el apellido de su avatar, los dos. Necesita una cuenta para entrar en [SECOND_LIFE]. ¿Quiere 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="AddClassified"> - Los anuncios clasificados aparecen durante una semana en la sección 'Clasificados' del directorio Buscar y en www.secondlife.com. + 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. @@ -398,6 +401,9 @@ No se reembolsan las cuotas pagadas. </notification> <notification name="PromptGoToEventsPage"> ¿Ir a la web de eventos de [SECOND_LIFE]? + <url name="url"> + http://secondlife.com/events/?lang=es-ES + </url> <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="SelectProposalToView"> @@ -575,6 +581,9 @@ misma región. [EXTRA] ¿Ir a [_URL] para informarse sobre la compra de L$? + <url name="url"> + http://secondlife.com/app/currency/?lang=es-ES + </url> <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="UnableToLinkObjects"> @@ -1140,13 +1149,16 @@ Puede usar normalmente [SECOND_LIFE], los demás residentes le verán correctame Se ha completado la instalación de [APP_NAME]. Si esta es la primera vez que usa [SECOND_LIFE], deberá crear una cuenta antes de que pueda iniciar una sesión. -¿Volver a www.secondlife.com para crear una cuenta nueva? +¿Volver a [https://join.secondlife.com/index.php?lang=es-ES 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]. 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. + <url name="url"> + http://es.secondlife.com/support/ + </url> <form name="form"> <button name="OK" text="OK"/> <button name="Help" text="Ayuda"/> @@ -1520,7 +1532,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C ¿Quiere ir a la Base de Conocimientos para aprender más sobre el nivel de calificación? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es </url> <usetemplate name="okcancelignore" @@ -1559,7 +1571,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C ¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es </url> <usetemplate name="okcancelignore" @@ -1593,7 +1605,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C ¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es </url> <usetemplate name="okcancelignore" @@ -2014,10 +2026,7 @@ Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar u <usetemplate ignoretext="Cuando esté saliendo de [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Salir"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Use esta herramienta para denunciar violaciones de las Normas de la Comunidad y las Condiciones del Servicio. Vea: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php + 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]. 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: diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml index 6505424b35d2ddeb1d0836bd7a19ad28d242016b..52c3855d6a357c152962b591415b04b994699554 100644 --- a/indra/newview/skins/default/xui/es/panel_login.xml +++ b/indra/newview/skins/default/xui/es/panel_login.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_login"> - <string name="real_url"> - http://secondlife.com/app/login/ - </string> - <string name="forgot_password_url"> - http://secondlife.com/account/request.php - </string> + <panel.string name="create_account_url"> + http://join.secondlife.com/index.php?lang=es-ES + </panel.string> + <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> @@ -35,3 +36,4 @@ [VERSION] </text> </panel> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml new file mode 100644 index 0000000000000000000000000000000000000000..218e03dcce02f9a37550439947a6f6c620f9297e --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_profile.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=es-ES + </string> + <string name="partner_edit_link_url"> + 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"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 294e407278f30ecb4c7df27b33601486701f1258..dc508f7c374303f89c517f2ee2ba9bc902aa651b 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -4,6 +4,7 @@ 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="LoginInProgress"> Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere. </string> diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml index 8cd1ec4e09a5c0ea7eefed6027ceb9717e41ef81..e442d09e4d24ecb2e871edad84583a45b330f858 100644 --- a/indra/newview/skins/default/xui/fr/floater_about.xml +++ b/indra/newview/skins/default/xui/fr/floater_about.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="A PROPOS DE [APP_NAME]"> - <tab_container name="about_tab"> - <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. - - 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 - - - - Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant - </text_editor> - </panel> - <panel label="Licences" 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) - expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. - 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) - jpeglib Copyright (C) 1991-1998, Thomas G. Lane. - ogg/vorbis Copyright (C) 2001, Xiphophorus - OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. - SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga - SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - xmlrpc-epi Copyright (C) 2000 Epinions, Inc. - zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler. - google-perftools Copyright (c) 2005, Google Inc. - - 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) - </text_editor> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="A PROPOS DE [APP_NAME]"> + <tab_container name="about_tab"> + <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. + + 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 + + + + Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant + </text_editor> + </panel> + <panel label="Licences" 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) + expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. + 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) + jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + ogg/vorbis Copyright (C) 2001, Xiphophorus + OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. + SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga + SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + xmlrpc-epi Copyright (C) 2000 Epinions, Inc. + zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler. + google-perftools Copyright (c) 2005, Google Inc. + + 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) + </text_editor> + </panel> + </tab_container> +</floater> 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 d1aea074e6a7c098a525426a879d539365803663..e2a567ff2887ae2c43e2df39981cc2de51ceb4d8 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -1,480 +1,480 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="À PROPOS DU TERRAIN"> - <floater.string name="Minutes"> - [MINUTES] minutes - </floater.string> - <floater.string name="Minute"> - minute - </floater.string> - <floater.string name="Seconds"> - [SECONDS] secondes - </floater.string> - <tab_container name="landtab"> - <panel label="Général" name="land_general_panel"> - <panel.string name="new users only"> - Nouveaux utilisateurs uniquement - </panel.string> - <panel.string name="anyone"> - Tout le monde - </panel.string> - <panel.string name="area_text"> - Surface - </panel.string> - <panel.string name="area_size_text"> - [AREA] m² - </panel.string> - <panel.string name="auction_id_text"> - Code de l'enchère : [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Pour modifier ce terrain, vous devez approuver votre achat. - </panel.string> - <panel.string name="group_owned_text"> - (propriété du groupe) - </panel.string> - <panel.string name="profile_text"> - Profil... - </panel.string> - <panel.string name="info_text"> - Infos... - </panel.string> - <panel.string name="public_text"> - (public) - </panel.string> - <panel.string name="none_text"> - (aucun) - </panel.string> - <panel.string name="sale_pending_text"> - (vente en cours) - </panel.string> - <panel.string name="no_selection_text"> - Aucune parcelle sélectionnée. -Allez dans le menu Monde > À propos du terrain ou sélectionnez une autre parcelle pour en afficher les détails. - </panel.string> - <text name="Name:"> - Nom : - </text> - <line_editor name="Name"/> - <text name="Description:"> - Description : - </text> - <text_editor name="Description"/> - <text name="LandType"> - Type : - </text> - <text name="LandTypeText"> - Continent / Homestead - </text> - <text name="ContentRating"> - Catégorie : - </text> - <text name="ContentRatingText"> - Adult - </text> - <text name="Owner:"> - Propriétaire : - </text> - <text name="OwnerText"> - Leyla Linden - </text> - <button label="Profil..." label_selected="Profil..." name="Profile..."/> - <text name="Group:"> - Groupe : - </text> - <text name="GroupText"/> - <button label="Définir..." label_selected="Définir..." name="Set..."/> - <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s'ajouter au patrimoine du groupe."/> - <button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d'officier dans le groupe sélectionné."/> - <check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu'un terrain est cédé au groupe, l'ancien propriétaire fait également un don de terrain suffisant."/> - <text name="For Sale:"> - À vendre : - </text> - <text name="Not for sale."> - Pas à vendre - </text> - <text name="For Sale: Price L$[PRICE]."> - Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²). - </text> - <text name="SalePending"/> - <button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/> - <text name="For sale to"> - À vendre à : [BUYER] - </text> - <text name="Sell with landowners objects in parcel."> - Objets inclus dans la vente. - </text> - <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"/> - <text name="Claimed:"> - Acquis : - </text> - <text name="DateClaimText"> - Tue Aug 15 13:47:25 2006 - </text> - <text name="PriceLabel"> - Superficie : - </text> - <text name="PriceText"> - 4048 m² - </text> - <text name="Traffic:"> - Trafic : - </text> - <text name="DwellText"> - 0 - </text> - <button label="Acheter le terrain..." label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/> - <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="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/> - <button label="Redemander 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."/> - </panel> - <panel label="Règlement" name="land_covenant_panel"> - <panel.string name="can_resell"> - Le terrain acheté dans cette région peut être revendu. - </panel.string> - <panel.string name="can_not_resell"> - Le terrain acheté dans cette région ne peut pas être revendu. - </panel.string> - <panel.string name="can_change"> - Le terrain acheté dans cette région peut être fusionné -ou divisé. - </panel.string> - <panel.string name="can_not_change"> - Le terrain acheté dans cette région ne peut pas être fusionné -ou divisé. - </panel.string> - <text name="estate_section_lbl"> - Domaine : - </text> - <text name="estate_name_lbl"> - Nom : - </text> - <text name="estate_name_text"> - continent - </text> - <text name="estate_owner_lbl"> - Propriétaire : - </text> - <text name="estate_owner_text"> - (aucun) - </text> - <text_editor name="covenant_editor"> - Il n'y a aucun règlement pour ce domaine. - </text_editor> - <text name="covenant_timestamp_text"> - Last Modified Wed Dec 31 16:00:00 1969 - </text> - <text name="region_section_lbl"> - Région : - </text> - <text name="region_name_lbl"> - Nom : - </text> - <text name="region_name_text"> - leyla - </text> - <text name="region_landtype_lbl"> - Type : - </text> - <text name="region_landtype_text"> - Continent / Homestead - </text> - <text name="region_maturity_lbl"> - Catégorie : - </text> - <text name="region_maturity_text"> - Adult - </text> - <text name="resellable_lbl"> - Revendre : - </text> - <text name="resellable_clause"> - Le terrain dans cette région ne peut être revendu. - </text> - <text name="changeable_lbl"> - Sous-diviser : - </text> - <text name="changeable_clause"> - Le terrain dans cette région ne peut être fusionné/divisé. - </text> - </panel> - <panel label="Objets" name="land_objects_panel"> - <panel.string name="objects_available_text"> - [COUNT] sur [MAX] ([AVAILABLE] disponibles) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] sur [MAX] ([DELETED] seront supprimés) - </panel.string> - <text name="parcel_object_bonus"> - Facteur Bonus Objets : [BONUS] - </text> - <text name="Simulator primitive usage:"> - Prims utilisées sur la parcelle : - </text> - <text left="214" name="objects_available" width="230"> - [COUNT] sur [MAX] ([AVAILABLE] disponibles) - </text> - <text name="Primitives parcel supports:" width="200"> - Prims max. sur la parcelle : - </text> - <text left="214" name="object_contrib_text" width="152"> - [COUNT] - </text> - <text name="Primitives on parcel:"> - Prims sur la parcelle : - </text> - <text left="214" name="total_objects_text" width="48"> - [COUNT] - </text> - <text left="14" name="Owned by parcel owner:" width="180"> - Appartenant au propriétaire : - </text> - <text left="214" name="owner_objects_text" width="48"> - [COUNT] - </text> - <button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/> - <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Set to group:" width="180"> - Données au groupe : - </text> - <text left="214" name="group_objects_text" width="48"> - [COUNT] - </text> - <button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/> - <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Owned by others:" width="128"> - Appartenant à d'autres : - </text> - <text left="214" name="other_objects_text" width="48"> - [COUNT] - </text> - <button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/> - <button label="Renvoyer..." 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"> - Sélectionnées/où quelqu'un est assis : - </text> - <text left="214" name="selected_objects_text" width="48"> - [COUNT] - </text> - <text left="4" name="Autoreturn" width="412"> - Renvoi automatique des objets des autres résidents (min., 0 pour désactiver) : - </text> - <line_editor name="clean other time" right="-6" width="36"/> - <text name="Object Owners:"> - Propriétaires : - </text> - <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List"/> - <button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/> - <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> - </panel> - <panel label="Options" name="land_options_panel"> - <panel.string name="search_enabled_tooltip"> - Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m². -Seules les parcelles de grande taille peuvent apparaître dans la recherche. - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle. - </panel.string> - <panel.string name="mature_check_mature"> - Contenu Mature - </panel.string> - <panel.string name="mature_check_adult"> - Contenu Adult - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - Les informations ou contenu de votre parcelle sont classés Mature. - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - Les informations ou contenu de votre parcelle sont classés Adult. - </panel.string> - <panel.string name="landing_point_none"> - (aucun) - </panel.string> - <panel.string name="push_restrict_text"> - Pas de bousculades - </panel.string> - <panel.string name="push_restrict_region_text"> - Pas de bousculades (les règles de la région priment) - </panel.string> - <text name="allow_label"> - Autoriser les autres résidents à  : - </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"> - Créer des objets : - </text> - <check_box label="Tous les résidents" 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"> - Laisser entrer des objets : - </text> - <check_box label="Tous les résidents" left="285" name="all object entry check"/> - <check_box label="Groupe" left="395" name="group object entry check"/> - <text left="152" name="allow_label4"> - Exécuter des scripts : - </text> - <check_box label="Tous les résidents" left="285" name="check other scripts"/> - <check_box label="Groupe" left="395" name="check group scripts"/> - <text name="land_options_label"> - Options du terrain : - </text> - <check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n'y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/> - <check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> - <check_box bottom="-160" label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/> - <combo_box bottom="-160" left="286" name="land category with adult" width="146"> - <combo_box.item label="Toutes catégories" name="item0"/> - <combo_box.item label="Appartenant aux Lindens" name="item1"/> - <combo_box.item label="Adult" name="item2"/> - <combo_box.item label="Art et Culture" name="item3"/> - <combo_box.item label="Affaires" name="item4"/> - <combo_box.item label="Éducation" name="item5"/> - <combo_box.item label="Jeux" name="item6"/> - <combo_box.item label="Favoris" name="item7"/> - <combo_box.item label="Accueil pour les nouveaux" name="item8"/> - <combo_box.item label="Parcs et Nature" name="item9"/> - <combo_box.item label="Résidentiel" name="item10"/> - <combo_box.item label="Shopping" name="item11"/> - <combo_box.item label="Autre" name="item12"/> - </combo_box> - <combo_box bottom="-160" left="286" name="land category" width="146"> - <combo_box.item label="Toutes catégories" name="item0"/> - <combo_box.item label="Appartenant aux Lindens" name="item1"/> - <combo_box.item label="Art et Culture" name="item3"/> - <combo_box.item label="Affaires" name="item4"/> - <combo_box.item label="Éducation" name="item5"/> - <combo_box.item label="Jeux" name="item6"/> - <combo_box.item label="Favoris" name="item7"/> - <combo_box.item label="Accueil pour les nouveaux" name="item8"/> - <combo_box.item label="Parcs et Nature" name="item9"/> - <combo_box.item label="Résidentiel" name="item10"/> - <combo_box.item label="Shopping" name="item11"/> - <combo_box.item label="Autre" name="item12"/> - </combo_box> - <check_box bottom="-180" label="Contenu Mature" name="MatureCheck" tool_tip=""/> - <text bottom="-200" name="Snapshot:"> - Photo : - </text> - <texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/> - <text bottom="-323" 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="Libérer le lieu d'arrivée."/> - <text bottom="-343" name="Teleport Routing: "> - Règles de téléportation : - </text> - <combo_box bottom="-343" left="140" name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain." width="140"> - <combo_box.item label="Bloqué" name="Blocked"/> - <combo_box.item label="Lieu d'arrivée fixe" name="LandingPoint"/> - <combo_box.item label="Lieu d'arrivée libre" name="Anywhere"/> - </combo_box> - </panel> - <panel label="Médias" name="land_media_panel"> - <text name="with media:" width="85"> - Type : - </text> - <combo_box left="97" name="media type" tool_tip="Indiquez s'il s'agit de l'URL d'un film, d'une page web ou autre"/> - <text name="mime_type"/> - <text name="at URL:" width="85"> - URL du domicile : - </text> - <line_editor left="97" name="media_url"/> - <button label="Définir..." label_selected="Définir..." name="set_media_url"/> - <text name="CurrentURL:"> - URL actuelle : - </text> - <button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_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 : - </text> - <texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/> - <text name="replace_texture_help"> - Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. - -Sélectionnez l'image miniature pour choisir une texture différente. - </text> - <check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l'échelle. La qualité visuelle sera peut-être amoindrie mais vous n'aurez à faire aucune autre mise à l'échelle ou alignement."/> - <text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105"> - Taille : - </text> - <spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> - <spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> - <text name="pixels"> - pixels - </text> - <text name="Options:"> - Options : - </text> - <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="Audio" name="land_audio_panel"> - <text name="MusicURL:"> - URL de la musique : - </text> - <text name="Sound:"> - Son : - </text> - <check_box label="Limiter les gestes et sons d'objet à cette parcelle" name="check sound local"/> - <text name="Voice settings:"> - Voix : - </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"/> - </panel> - <panel label="Accès" name="land_access_panel"> - <panel.string name="estate_override"> - Au moins une de ces options est définie au niveau du domaine. - </panel.string> - <text name="Limit access to this parcel to:"> - Accès à cette parcelle - </text> - <check_box label="Autoriser l'accès public" name="public_access"/> - <text name="Only Allow"> - Bloquer l'accès aux résidents : - </text> - <check_box label="Qui n'ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/> - <check_box label="Dont l'âge n'a pas été vérifié" name="limit_age_verified" tool_tip="Interdire 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.item label="Tout le monde" name="Anyone"/> - <combo_box.item label="Groupe" name="Group"/> - </combo_box> - <spinner label="Prix en L$ :" name="PriceSpin"/> - <spinner label="Durée en heures :" name="HoursSpin"/> - <text label="Toujours autoriser" name="AllowedText"> - Résidents autorisés - </text> - <name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/> - <button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/> - <button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/> - <text label="Bannir" name="BanCheck"> - Résidents bannis - </text> - <name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/> - <button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/> - <button label="Supprimer" label_selected="Supprimer" name="remove_banned"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterland" title="À PROPOS DU TERRAIN"> + <floater.string name="Minutes"> + [MINUTES] minutes + </floater.string> + <floater.string name="Minute"> + minute + </floater.string> + <floater.string name="Seconds"> + [SECONDS] secondes + </floater.string> + <tab_container name="landtab"> + <panel label="Général" name="land_general_panel"> + <panel.string name="new users only"> + Nouveaux utilisateurs uniquement + </panel.string> + <panel.string name="anyone"> + Tout le monde + </panel.string> + <panel.string name="area_text"> + Surface + </panel.string> + <panel.string name="area_size_text"> + [AREA] m² + </panel.string> + <panel.string name="auction_id_text"> + Code de l'enchère : [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Pour modifier ce terrain, vous devez approuver votre achat. + </panel.string> + <panel.string name="group_owned_text"> + (propriété du groupe) + </panel.string> + <panel.string name="profile_text"> + Profil... + </panel.string> + <panel.string name="info_text"> + Infos... + </panel.string> + <panel.string name="public_text"> + (public) + </panel.string> + <panel.string name="none_text"> + (aucun) + </panel.string> + <panel.string name="sale_pending_text"> + (vente en cours) + </panel.string> + <panel.string name="no_selection_text"> + Aucune parcelle sélectionnée. +Allez dans le menu Monde > À propos du terrain ou sélectionnez une autre parcelle pour en afficher les détails. + </panel.string> + <text name="Name:"> + Nom : + </text> + <line_editor name="Name"/> + <text name="Description:"> + Description : + </text> + <text_editor name="Description"/> + <text name="LandType"> + Type : + </text> + <text name="LandTypeText"> + Continent / Homestead + </text> + <text name="ContentRating"> + Catégorie : + </text> + <text name="ContentRatingText"> + Adult + </text> + <text name="Owner:"> + Propriétaire : + </text> + <text name="OwnerText"> + Leyla Linden + </text> + <button label="Profil..." label_selected="Profil..." name="Profile..."/> + <text name="Group:"> + Groupe : + </text> + <text name="GroupText"/> + <button label="Définir..." label_selected="Définir..." name="Set..."/> + <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s'ajouter au patrimoine du groupe."/> + <button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d'officier dans le groupe sélectionné."/> + <check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu'un terrain est cédé au groupe, l'ancien propriétaire fait également un don de terrain suffisant."/> + <text name="For Sale:"> + À vendre : + </text> + <text name="Not for sale."> + Pas à vendre + </text> + <text name="For Sale: Price L$[PRICE]."> + Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²). + </text> + <text name="SalePending"/> + <button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/> + <text name="For sale to"> + À vendre à : [BUYER] + </text> + <text name="Sell with landowners objects in parcel."> + Objets inclus dans la vente. + </text> + <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"/> + <text name="Claimed:"> + Acquis : + </text> + <text name="DateClaimText"> + Tue Aug 15 13:47:25 2006 + </text> + <text name="PriceLabel"> + Superficie : + </text> + <text name="PriceText"> + 4048 m² + </text> + <text name="Traffic:"> + Trafic : + </text> + <text name="DwellText"> + 0 + </text> + <button label="Acheter le terrain..." label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/> + <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="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/> + <button label="Redemander 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."/> + </panel> + <panel label="Règlement" name="land_covenant_panel"> + <panel.string name="can_resell"> + Le terrain acheté dans cette région peut être revendu. + </panel.string> + <panel.string name="can_not_resell"> + Le terrain acheté dans cette région ne peut pas être revendu. + </panel.string> + <panel.string name="can_change"> + Le terrain acheté dans cette région peut être fusionné +ou divisé. + </panel.string> + <panel.string name="can_not_change"> + Le terrain acheté dans cette région ne peut pas être fusionné +ou divisé. + </panel.string> + <text name="estate_section_lbl"> + Domaine : + </text> + <text name="estate_name_lbl"> + Nom : + </text> + <text name="estate_name_text"> + continent + </text> + <text name="estate_owner_lbl"> + Propriétaire : + </text> + <text name="estate_owner_text"> + (aucun) + </text> + <text_editor name="covenant_editor"> + Il n'y a aucun règlement pour ce domaine. + </text_editor> + <text name="covenant_timestamp_text"> + Last Modified Wed Dec 31 16:00:00 1969 + </text> + <text name="region_section_lbl"> + Région : + </text> + <text name="region_name_lbl"> + Nom : + </text> + <text name="region_name_text"> + leyla + </text> + <text name="region_landtype_lbl"> + Type : + </text> + <text name="region_landtype_text"> + Continent / Homestead + </text> + <text name="region_maturity_lbl"> + Catégorie : + </text> + <text name="region_maturity_text"> + Adult + </text> + <text name="resellable_lbl"> + Revendre : + </text> + <text name="resellable_clause"> + Le terrain dans cette région ne peut être revendu. + </text> + <text name="changeable_lbl"> + Sous-diviser : + </text> + <text name="changeable_clause"> + Le terrain dans cette région ne peut être fusionné/divisé. + </text> + </panel> + <panel label="Objets" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] sur [MAX] ([AVAILABLE] disponibles) + </panel.string> + <panel.string name="objects_deleted_text"> + [COUNT] sur [MAX] ([DELETED] seront supprimés) + </panel.string> + <text name="parcel_object_bonus"> + Facteur Bonus Objets : [BONUS] + </text> + <text name="Simulator primitive usage:"> + Prims utilisées sur la parcelle : + </text> + <text left="214" name="objects_available" width="230"> + [COUNT] sur [MAX] ([AVAILABLE] disponibles) + </text> + <text name="Primitives parcel supports:" width="200"> + Prims max. sur la parcelle : + </text> + <text left="214" name="object_contrib_text" width="152"> + [COUNT] + </text> + <text name="Primitives on parcel:"> + Prims sur la parcelle : + </text> + <text left="214" name="total_objects_text" width="48"> + [COUNT] + </text> + <text left="14" name="Owned by parcel owner:" width="180"> + Appartenant au propriétaire : + </text> + <text left="214" name="owner_objects_text" width="48"> + [COUNT] + </text> + <button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/> + <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> + <text left="14" name="Set to group:" width="180"> + Données au groupe : + </text> + <text left="214" name="group_objects_text" width="48"> + [COUNT] + </text> + <button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/> + <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> + <text left="14" name="Owned by others:" width="128"> + Appartenant à d'autres : + </text> + <text left="214" name="other_objects_text" width="48"> + [COUNT] + </text> + <button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/> + <button label="Renvoyer..." 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"> + Sélectionnées/où quelqu'un est assis : + </text> + <text left="214" name="selected_objects_text" width="48"> + [COUNT] + </text> + <text left="4" name="Autoreturn" width="412"> + Renvoi automatique des objets des autres résidents (min., 0 pour désactiver) : + </text> + <line_editor name="clean other time" right="-6" width="36"/> + <text name="Object Owners:"> + Propriétaires : + </text> + <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List"/> + <button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/> + <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> + </panel> + <panel label="Options" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m². +Seules les parcelles de grande taille peuvent apparaître dans la recherche. + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle. + </panel.string> + <panel.string name="mature_check_mature"> + Contenu Mature + </panel.string> + <panel.string name="mature_check_adult"> + Contenu Adult + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + Les informations ou contenu de votre parcelle sont classés Mature. + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + Les informations ou contenu de votre parcelle sont classés Adult. + </panel.string> + <panel.string name="landing_point_none"> + (aucun) + </panel.string> + <panel.string name="push_restrict_text"> + Pas de bousculades + </panel.string> + <panel.string name="push_restrict_region_text"> + Pas de bousculades (les règles de la région priment) + </panel.string> + <text name="allow_label"> + Autoriser les autres résidents à  : + </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"> + Créer des objets : + </text> + <check_box label="Tous les résidents" 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"> + Laisser entrer des objets : + </text> + <check_box label="Tous les résidents" left="285" name="all object entry check"/> + <check_box label="Groupe" left="395" name="group object entry check"/> + <text left="152" name="allow_label4"> + Exécuter des scripts : + </text> + <check_box label="Tous les résidents" left="285" name="check other scripts"/> + <check_box label="Groupe" left="395" name="check group scripts"/> + <text name="land_options_label"> + Options du terrain : + </text> + <check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n'y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/> + <check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> + <check_box bottom="-160" label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/> + <combo_box bottom="-160" left="286" name="land category with adult" width="146"> + <combo_box.item label="Toutes catégories" name="item0"/> + <combo_box.item label="Appartenant aux Lindens" name="item1"/> + <combo_box.item label="Adult" name="item2"/> + <combo_box.item label="Art et Culture" name="item3"/> + <combo_box.item label="Affaires" name="item4"/> + <combo_box.item label="Éducation" name="item5"/> + <combo_box.item label="Jeux" name="item6"/> + <combo_box.item label="Favoris" name="item7"/> + <combo_box.item label="Accueil pour les nouveaux" name="item8"/> + <combo_box.item label="Parcs et Nature" name="item9"/> + <combo_box.item label="Résidentiel" name="item10"/> + <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Autre" name="item12"/> + </combo_box> + <combo_box bottom="-160" left="286" name="land category" width="146"> + <combo_box.item label="Toutes catégories" name="item0"/> + <combo_box.item label="Appartenant aux Lindens" name="item1"/> + <combo_box.item label="Art et Culture" name="item3"/> + <combo_box.item label="Affaires" name="item4"/> + <combo_box.item label="Éducation" name="item5"/> + <combo_box.item label="Jeux" name="item6"/> + <combo_box.item label="Favoris" name="item7"/> + <combo_box.item label="Accueil pour les nouveaux" name="item8"/> + <combo_box.item label="Parcs et Nature" name="item9"/> + <combo_box.item label="Résidentiel" name="item10"/> + <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Autre" name="item12"/> + </combo_box> + <check_box bottom="-180" label="Contenu Mature" name="MatureCheck" tool_tip=""/> + <text bottom="-200" name="Snapshot:"> + Photo : + </text> + <texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/> + <text bottom="-323" 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="Libérer le lieu d'arrivée."/> + <text bottom="-343" name="Teleport Routing: "> + Règles de téléportation : + </text> + <combo_box bottom="-343" left="140" name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain." width="140"> + <combo_box.item label="Bloqué" name="Blocked"/> + <combo_box.item label="Lieu d'arrivée fixe" name="LandingPoint"/> + <combo_box.item label="Lieu d'arrivée libre" name="Anywhere"/> + </combo_box> + </panel> + <panel label="Médias" name="land_media_panel"> + <text name="with media:" width="85"> + Type : + </text> + <combo_box left="97" name="media type" tool_tip="Indiquez s'il s'agit de l'URL d'un film, d'une page web ou autre"/> + <text name="mime_type"/> + <text name="at URL:" width="85"> + URL du domicile : + </text> + <line_editor left="97" name="media_url"/> + <button label="Définir..." label_selected="Définir..." name="set_media_url"/> + <text name="CurrentURL:"> + URL actuelle : + </text> + <button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_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 : + </text> + <texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/> + <text name="replace_texture_help"> + Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. + +Sélectionnez l'image miniature pour choisir une texture différente. + </text> + <check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l'échelle. La qualité visuelle sera peut-être amoindrie mais vous n'aurez à faire aucune autre mise à l'échelle ou alignement."/> + <text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105"> + Taille : + </text> + <spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> + <spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> + <text name="pixels"> + pixels + </text> + <text name="Options:"> + Options : + </text> + <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="Audio" name="land_audio_panel"> + <text name="MusicURL:"> + URL de la musique : + </text> + <text name="Sound:"> + Son : + </text> + <check_box label="Limiter les gestes et sons d'objet à cette parcelle" name="check sound local"/> + <text name="Voice settings:"> + Voix : + </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"/> + </panel> + <panel label="Accès" name="land_access_panel"> + <panel.string name="estate_override"> + Au moins une de ces options est définie au niveau du domaine. + </panel.string> + <text name="Limit access to this parcel to:"> + Accès à cette parcelle + </text> + <check_box label="Autoriser l'accès public" name="public_access"/> + <text name="Only Allow"> + Bloquer l'accès aux résidents : + </text> + <check_box label="Qui n'ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/> + <check_box label="Dont l'âge n'a pas été vérifié" name="limit_age_verified" tool_tip="Interdire 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.item label="Tout le monde" name="Anyone"/> + <combo_box.item label="Groupe" name="Group"/> + </combo_box> + <spinner label="Prix en L$ :" name="PriceSpin"/> + <spinner label="Durée en heures :" name="HoursSpin"/> + <text label="Toujours autoriser" name="AllowedText"> + Résidents autorisés + </text> + <name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/> + <button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/> + <button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/> + <text label="Bannir" name="BanCheck"> + Résidents bannis + </text> + <name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/> + <button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/> + <button label="Supprimer" label_selected="Supprimer" name="remove_banned"/> + </panel> + </tab_container> +</floater> 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 00ab29703ffdadf8fccca61d594e30b76ed85566..4417006fc6d502457dfb7dd0f5a5978b56dc14a0 100644 --- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml @@ -1,186 +1,186 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Animation Preview" title=""> - <floater.string name="failed_to_initialize"> - Echec de l'initialisation du mouvement - </floater.string> - <floater.string name="anim_too_long"> - Le fichier d'animation fait [LENGTH] secondes. - -La longueur maximale est de [MAX_LENGTH] secondes. - </floater.string> - <floater.string name="failed_file_read"> - Impossible de lire le fichier d'animation. - -[STATUS] - </floater.string> - <floater.string name="E_ST_OK"> - Ok - </floater.string> - <floater.string name="E_ST_EOF"> - Fichier incomplet. - </floater.string> - <floater.string name="E_ST_NO_CONSTRAINT"> - Impossible de lire la définition des contraintes. - </floater.string> - <floater.string name="E_ST_NO_FILE"> - Impossible d'ouvrir le fichier BVH. - </floater.string> - <floater.string name="E_ST_NO_HIER"> - En-tête HIERARCHY non valide. - </floater.string> - <floater.string name="E_ST_NO_JOINT"> - Impossible de trouver ROOT ou JOINT. - </floater.string> - <floater.string name="E_ST_NO_NAME"> - Impossible de trouver le nom JOINT. - </floater.string> - <floater.string name="E_ST_NO_OFFSET"> - Impossible de trouver OFFSET. - </floater.string> - <floater.string name="E_ST_NO_CHANNELS"> - Impossible se trouver les CHANNELS. - </floater.string> - <floater.string name="E_ST_NO_ROTATION"> - Impossible d'obtenir l'ordre de rotation. - </floater.string> - <floater.string name="E_ST_NO_AXIS"> - Impossible d'obtenir l'axe de rotation. - </floater.string> - <floater.string name="E_ST_NO_MOTION"> - Impossible de trouver MOTION. - </floater.string> - <floater.string name="E_ST_NO_FRAMES"> - Impossible d'obtenir le nombre de cadres. - </floater.string> - <floater.string name="E_ST_NO_FRAME_TIME"> - Impossible d'obtenir le temps du cadre. - </floater.string> - <floater.string name="E_ST_NO_POS"> - Impossible de trouver les valeurs de la position. - </floater.string> - <floater.string name="E_ST_NO_ROT"> - Impossible de trouver les valeurs de rotation. - </floater.string> - <floater.string name="E_ST_NO_XLT_FILE"> - Impossible d'ouvrir le fichier de traduction. - </floater.string> - <floater.string name="E_ST_NO_XLT_HEADER"> - Impossible de lire l'en-tête de traduction. - </floater.string> - <floater.string name="E_ST_NO_XLT_NAME"> - Impossible de lire la traduction. - </floater.string> - <floater.string name="E_ST_NO_XLT_IGNORE"> - Impossible de lire la traduction. - </floater.string> - <floater.string name="E_ST_NO_XLT_RELATIVE"> - Impossible de lire la valeur de traduction relative. - </floater.string> - <floater.string name="E_ST_NO_XLT_OUTNAME"> - Impossible de lire la traduction. - </floater.string> - <floater.string name="E_ST_NO_XLT_MATRIX"> - Impossible de lire la matrice de traduction. - </floater.string> - <floater.string name="E_ST_NO_XLT_MERGECHILD"> - Impossible de trouver le nom mergechild. - </floater.string> - <floater.string name="E_ST_NO_XLT_MERGEPARENT"> - Impossible de trouver le nom mergeparent. - </floater.string> - <floater.string name="E_ST_NO_XLT_PRIORITY"> - Impossible de définir la valeur de la priorité. - </floater.string> - <floater.string name="E_ST_NO_XLT_LOOP"> - Impossible de définir la valeur de la boucle - </floater.string> - <floater.string name="E_ST_NO_XLT_EASEIN"> - Impossible de trouver les valeurs easeln. - </floater.string> - <floater.string name="E_ST_NO_XLT_EASEOUT"> - Impossible de trouver les valeurs easeOut. - </floater.string> - <floater.string name="E_ST_NO_XLT_HAND"> - Impossible d'obtenir la valeur hand morph. - </floater.string> - <floater.string name="E_ST_NO_XLT_EMOTE"> - Impossible de lire le nom emote. - </floater.string> - <text name="name_label"> - Nom : - </text> - <text name="description_label"> - Description : - </text> - <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/> - <check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/> - <spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart." width="105"/> - <spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> - <text name="hand_label" width="110"> - Mouvement de main - </text> - <combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation" width="124"> - <combo_box.item label="Doigts écartés" name="Spread"/> - <combo_box.item label="Détendues" name="Relaxed"/> - <combo_box.item label="Pointer (les deux)" name="PointBoth"/> - <combo_box.item label="Poing" name="Fist"/> - <combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/> - <combo_box.item label="Pointer (gauche)" name="PointLeft"/> - <combo_box.item label="Poing (gauche)" name="FistLeft"/> - <combo_box.item label="Détendue (droite)" name="RelaxedRight"/> - <combo_box.item label="Pointer (droite)" name="PointRight"/> - <combo_box.item label="Poing (droite)" name="FistRight"/> - <combo_box.item label="Saluer (droite)" name="SaluteRight"/> - <combo_box.item label="Taper" name="Typing"/> - <combo_box.item label="Paix (main droite)" name="PeaceRight"/> - </combo_box> - <text name="emote_label"> - Expression - </text> - <combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation." width="124"> - <combo_box.item label="None]" 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"/> - </combo_box> - <text name="preview_label" width="110"> - Prévisualiser pendant - </text> - <combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124"> - <combo_box.item label="Debout" name="Standing"/> - <combo_box.item label="En train de marcher" name="Walking"/> - <combo_box.item label="Assis" name="Sitting"/> - <combo_box.item label="En train de voler" name="Flying"/> - </combo_box> - <spinner label="Transition -début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> - <spinner label="Transition -fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement." width="125"/> - <button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/> - <button label="" name="stop_btn" tool_tip="Arrêter le playback"/> - <slider label="" name="playback_slider"/> - <text name="bad_animation_text"> - Impossible de lire le fichier d'animation. - -Nous recommandons les fichiers BVH extraits de -Poser 4. - </text> - <button label="Annuler" name="cancel_btn"/> - <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Echec de l'initialisation du mouvement + </floater.string> + <floater.string name="anim_too_long"> + Le fichier d'animation fait [LENGTH] secondes. + +La longueur maximale est de [MAX_LENGTH] secondes. + </floater.string> + <floater.string name="failed_file_read"> + Impossible de lire le fichier d'animation. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + Ok + </floater.string> + <floater.string name="E_ST_EOF"> + Fichier incomplet. + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + Impossible de lire la définition des contraintes. + </floater.string> + <floater.string name="E_ST_NO_FILE"> + Impossible d'ouvrir le fichier BVH. + </floater.string> + <floater.string name="E_ST_NO_HIER"> + En-tête HIERARCHY non valide. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + Impossible de trouver ROOT ou JOINT. + </floater.string> + <floater.string name="E_ST_NO_NAME"> + Impossible de trouver le nom JOINT. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + Impossible de trouver OFFSET. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + Impossible se trouver les CHANNELS. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + Impossible d'obtenir l'ordre de rotation. + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + Impossible d'obtenir l'axe de rotation. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + Impossible de trouver MOTION. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + Impossible d'obtenir le nombre de cadres. + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + Impossible d'obtenir le temps du cadre. + </floater.string> + <floater.string name="E_ST_NO_POS"> + Impossible de trouver les valeurs de la position. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + Impossible de trouver les valeurs de rotation. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + Impossible d'ouvrir le fichier de traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Impossible de lire l'en-tête de traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Impossible de lire la traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Impossible de lire la traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Impossible de lire la valeur de traduction relative. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Impossible de lire la traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Impossible de lire la matrice de traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Impossible de trouver le nom mergechild. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Impossible de trouver le nom mergeparent. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + Impossible de définir la valeur de la priorité. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + Impossible de définir la valeur de la boucle + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + Impossible de trouver les valeurs easeln. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + Impossible de trouver les valeurs easeOut. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Impossible d'obtenir la valeur hand morph. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + Impossible de lire le nom emote. + </floater.string> + <text name="name_label"> + Nom : + </text> + <text name="description_label"> + Description : + </text> + <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/> + <check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/> + <spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart." width="105"/> + <spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> + <text name="hand_label" width="110"> + Mouvement de main + </text> + <combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation" width="124"> + <combo_box.item label="Doigts écartés" name="Spread"/> + <combo_box.item label="Détendues" name="Relaxed"/> + <combo_box.item label="Pointer (les deux)" name="PointBoth"/> + <combo_box.item label="Poing" name="Fist"/> + <combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/> + <combo_box.item label="Pointer (gauche)" name="PointLeft"/> + <combo_box.item label="Poing (gauche)" name="FistLeft"/> + <combo_box.item label="Détendue (droite)" name="RelaxedRight"/> + <combo_box.item label="Pointer (droite)" name="PointRight"/> + <combo_box.item label="Poing (droite)" name="FistRight"/> + <combo_box.item label="Saluer (droite)" name="SaluteRight"/> + <combo_box.item label="Taper" name="Typing"/> + <combo_box.item label="Paix (main droite)" name="PeaceRight"/> + </combo_box> + <text name="emote_label"> + Expression + </text> + <combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation." width="124"> + <combo_box.item label="None]" 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"/> + </combo_box> + <text name="preview_label" width="110"> + Prévisualiser pendant + </text> + <combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124"> + <combo_box.item label="Debout" name="Standing"/> + <combo_box.item label="En train de marcher" name="Walking"/> + <combo_box.item label="Assis" name="Sitting"/> + <combo_box.item label="En train de voler" name="Flying"/> + </combo_box> + <spinner label="Transition +début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> + <spinner label="Transition +fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement." width="125"/> + <button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/> + <button label="" name="stop_btn" tool_tip="Arrêter le playback"/> + <slider label="" name="playback_slider"/> + <text name="bad_animation_text"> + Impossible de lire le fichier d'animation. + +Nous recommandons les fichiers BVH extraits de +Poser 4. + </text> + <button label="Annuler" name="cancel_btn"/> + <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> +</floater> 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 5742b0af04b753c4e82f25690b318f412286c0dd..7ff2b6b425891e8cee6630e1fbcaecba6defee52 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml @@ -1,41 +1,41 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="CHOISIR LE RÉSIDENT"> - <tab_container name="ResidentChooserTabs"> - <panel label="Rechercher" name="SearchPanel"> - <text name="InstructSearchResidentName"> - Saisissez une partie du nom du résident : - </text> - <button label="OK" label_selected="OK" name="Find"/> - </panel> - <panel label="Cartes de visite" name="CallingCardsPanel"> - <text name="InstructSelectCallingCard"> - Sélectionnez une carte de visite : - </text> - </panel> - <panel label="Près de moi" name="NearMePanel"> - <text name="InstructSelectResident"> - Sélectionner une personne près de vous : - </text> - <button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/> - <slider bottom_delta="-36" label="Distance" name="near_me_range"/> - <text name="meters"> - mètres - </text> - <scroll_list bottom_delta="-169" height="159" name="NearMe"/> - </panel> - </tab_container> - <button label="OK" label_selected="OK" name="Select"/> - <button label="Annuler" label_selected="Annuler" name="Cancel"/> - <string name="not_found"> - '[TEXT]' introuvable - </string> - <string name="no_one_near"> - Il n'y a personne près de vous - </string> - <string name="no_results"> - Aucun résultat - </string> - <string name="searching"> - Recherche... - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="avatarpicker" title="CHOISIR LE RÉSIDENT"> + <tab_container name="ResidentChooserTabs"> + <panel label="Rechercher" name="SearchPanel"> + <text name="InstructSearchResidentName"> + Saisissez une partie du nom du résident : + </text> + <button label="OK" label_selected="OK" name="Find"/> + </panel> + <panel label="Cartes de visite" name="CallingCardsPanel"> + <text name="InstructSelectCallingCard"> + Sélectionnez une carte de visite : + </text> + </panel> + <panel label="Près de moi" name="NearMePanel"> + <text name="InstructSelectResident"> + Sélectionner une personne près de vous : + </text> + <button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/> + <slider bottom_delta="-36" label="Distance" name="near_me_range"/> + <text name="meters"> + mètres + </text> + <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + </panel> + </tab_container> + <button label="OK" label_selected="OK" name="Select"/> + <button label="Annuler" label_selected="Annuler" name="Cancel"/> + <string name="not_found"> + '[TEXT]' introuvable + </string> + <string name="no_one_near"> + Il n'y a personne près de vous + </string> + <string name="no_results"> + Aucun résultat + </string> + <string name="searching"> + Recherche... + </string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml index a74768988303f2c32a5b81b2c77aad6894e83d09..fd9cd057e997e964c67139e3d772602f40a05dde 100644 --- a/indra/newview/skins/default/xui/fr/floater_beacons.xml +++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml @@ -1,21 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="BALISES"> - <panel name="beacons_panel"> - <text name="label_show"> - Afficher : - </text> - <check_box label="Balises" name="beacons"/> - <check_box label="Surbrillances" name="highlights"/> - <text name="beacon_width_label" tool_tip="Largeur de la balise"> - Largeur : - </text> - <text name="label_objects"> - Pour ces objets : - </text> - <check_box label="Physique" name="physical"/> - <check_box label="Scripté" name="scripted"/> - <check_box label="Toucher uniquement" name="touch_only"/> - <check_box label="Sources sonores" name="sounds"/> - <check_box label="Sources des particules" name="particles"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="beacons" title="BALISES"> + <panel name="beacons_panel"> + <text name="label_show"> + Afficher : + </text> + <check_box label="Balises" name="beacons"/> + <check_box label="Surbrillances" name="highlights"/> + <text name="beacon_width_label" tool_tip="Largeur de la balise"> + Largeur : + </text> + <text name="label_objects"> + Pour ces objets : + </text> + <check_box label="Physique" name="physical"/> + <check_box label="Scripté" name="scripted"/> + <check_box label="Toucher uniquement" name="touch_only"/> + <check_box label="Sources sonores" name="sounds"/> + <check_box label="Sources des particules" name="particles"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_build_options.xml b/indra/newview/skins/default/xui/fr/floater_build_options.xml index e8e6a59dc4fa4be8215f54c51024ac2d4387bc60..997ca9d27be63d62b28a5a1f1c6026bdce175b2f 100644 --- a/indra/newview/skins/default/xui/fr/floater_build_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_build_options.xml @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="build options floater" title="OPTIONS DE LA GRILLE"> - <spinner label="Unités (mètres)" name="GridResolution"/> - <spinner label="Mesures (mètres)" name="GridDrawSize"/> - <check_box label="Fixation des sous-unités" name="GridSubUnit"/> - <check_box label="Afficher les sections transversales" name="GridCrossSection"/> - <text name="grid_opacity_label" tool_tip="Opacité de la grille"> - Opacité : - </text> - <slider label="Opacité de la grille" name="GridOpacity"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="build options floater" title="OPTIONS DE LA GRILLE"> + <spinner label="Unités (mètres)" name="GridResolution"/> + <spinner label="Mesures (mètres)" name="GridDrawSize"/> + <check_box label="Fixation des sous-unités" name="GridSubUnit"/> + <check_box label="Afficher les sections transversales" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Opacité de la grille"> + Opacité : + </text> + <slider label="Opacité de la grille" name="GridOpacity"/> +</floater> 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 212ee2504a8b8f0bb654fac8b11ce376e9b836fe..b2cef62e248f8a0868ab02cbe2abeed8c9b880c2 100644 --- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml @@ -1,53 +1,53 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Modifier les droits relatifs au contenu"> - <floater.string name="nothing_to_modify_text"> - La sélection contient des contenus non modifiables. - </floater.string> - <floater.string name="status_text"> - Permissions paramétrées sur [NAME] - </floater.string> - <floater.string name="start_text"> - Demande de changement des droits lancée... - </floater.string> - <floater.string name="done_text"> - Demande de changement des droits finie. - </floater.string> - <check_box label="Animation" name="check_animation"/> - <icon name="icon_animation" tool_tip="Animation"/> - <check_box label="Parties du corps" name="check_bodypart"/> - <icon name="icon_bodypart" tool_tip="Parties du corps"/> - <check_box label="Habits" name="check_clothing"/> - <icon name="icon_clothing" tool_tip="Habits"/> - <check_box label="Gestes" name="check_gesture"/> - <icon name="icon_gesture" tool_tip="Gestes"/> - <check_box label="Notes" name="check_notecard"/> - <icon name="icon_notecard" tool_tip="Notes"/> - <check_box label="Objets" name="check_object"/> - <icon name="icon_object" tool_tip="Objets"/> - <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="Textures" name="check_texture"/> - <button label="√ Tout" label_selected="Tout" name="check_all"/> - <button label="Effacer" label_selected="Aucun" name="check_none"/> - <text name="newperms"> - Nouvelles permissions relatives au contenu - </text> - <text name="GroupLabel"> - Groupe : - </text> - <check_box label="Partager" name="share_with_group"/> - <text name="AnyoneLabel"> - N'importe qui : - </text> - <check_box label="Copier" name="everyone_copy"/> - <text name="NextOwnerLabel"> - Le prochain propriétaire : - </text> - <check_box label="Modifier" name="next_owner_modify"/> - <check_box label="Copier" name="next_owner_copy"/> - <check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> - <button label="OK" name="apply"/> - <button label="Annuler" name="close"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterbulkperms" title="Modifier les droits relatifs au contenu"> + <floater.string name="nothing_to_modify_text"> + La sélection contient des contenus non modifiables. + </floater.string> + <floater.string name="status_text"> + Permissions paramétrées sur [NAME] + </floater.string> + <floater.string name="start_text"> + Demande de changement des droits lancée... + </floater.string> + <floater.string name="done_text"> + Demande de changement des droits finie. + </floater.string> + <check_box label="Animation" name="check_animation"/> + <icon name="icon_animation" tool_tip="Animation"/> + <check_box label="Parties du corps" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="Parties du corps"/> + <check_box label="Habits" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="Habits"/> + <check_box label="Gestes" name="check_gesture"/> + <icon name="icon_gesture" tool_tip="Gestes"/> + <check_box label="Notes" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="Notes"/> + <check_box label="Objets" name="check_object"/> + <icon name="icon_object" tool_tip="Objets"/> + <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="Textures" name="check_texture"/> + <button label="√ Tout" label_selected="Tout" name="check_all"/> + <button label="Effacer" label_selected="Aucun" name="check_none"/> + <text name="newperms"> + Nouvelles permissions relatives au contenu + </text> + <text name="GroupLabel"> + Groupe : + </text> + <check_box label="Partager" name="share_with_group"/> + <text name="AnyoneLabel"> + N'importe qui : + </text> + <check_box label="Copier" name="everyone_copy"/> + <text name="NextOwnerLabel"> + Le prochain propriétaire : + </text> + <check_box label="Modifier" name="next_owner_modify"/> + <check_box label="Copier" name="next_owner_copy"/> + <check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> + <button label="OK" name="apply"/> + <button label="Annuler" name="close"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/indra/newview/skins/default/xui/fr/floater_buy_object.xml index 86b67ad491d5d3390cf322af60aab1e183e41b09..0bfc4e90e5cb81e9772ff699e862fca1a0bbb413 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_object.xml @@ -1,26 +1,26 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="ACHETER UNE COPIE DE L'OBJET"> - <text name="contents_text"> - Contient : - </text> - <text name="buy_text"> - Acheter pour [AMOUNT] L$ à [NAME] ? - </text> - <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> - <button label="Acheter" label_selected="Acheter" name="buy_btn"/> - <string name="title_buy_text"> - Acheter - </string> - <string name="title_buy_copy_text"> - Acheter une copie - </string> - <string name="no_copy_text"> - (pas de copie) - </string> - <string name="no_modify_text"> - (pas de modification) - </string> - <string name="no_transfer_text"> - (pas de transfert) - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="contents" title="ACHETER UNE COPIE DE L'OBJET"> + <text name="contents_text"> + Contient : + </text> + <text name="buy_text"> + Acheter pour [AMOUNT] L$ à [NAME] ? + </text> + <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> + <button label="Acheter" label_selected="Acheter" name="buy_btn"/> + <string name="title_buy_text"> + Acheter + </string> + <string name="title_buy_copy_text"> + Acheter une copie + </string> + <string name="no_copy_text"> + (pas de copie) + </string> + <string name="no_modify_text"> + (pas de modification) + </string> + <string name="no_transfer_text"> + (pas de transfert) + </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 2fc01b9f171a1223879b5d95288556e637b1543f..b2a280d8549d796d8ade227f38e1d635719bcc2b 100644 --- a/indra/newview/skins/default/xui/fr/floater_camera.xml +++ b/indra/newview/skins/default/xui/fr/floater_camera.xml @@ -1,23 +1,23 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="camera_floater"> - <floater.string name="rotate_tooltip"> - Faire tourner la caméra autour du point central - </floater.string> - <floater.string name="zoom_tooltip"> - Zoomer en direction du point central - </floater.string> - <floater.string name="move_tooltip"> - Déplacer la caméra vers le haut et le bas, la gauche et la droite - </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"/> - <joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/> - <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/> - </panel> - <panel name="buttons"> - <button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/> - <button label="" name="pan_btn" tool_tip="Vue panoramique"/> - <button label="" name="avatarview_btn" tool_tip="Vue subjective"/> - <button label="" name="freecamera_btn" tool_tip="Voir l'objet"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + Faire tourner la caméra autour du point central + </floater.string> + <floater.string name="zoom_tooltip"> + Zoomer en direction du point central + </floater.string> + <floater.string name="move_tooltip"> + Déplacer la caméra vers le haut et le bas, la gauche et la droite + </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"/> + <joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/> + <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/> + </panel> + <panel name="buttons"> + <button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/> + <button label="" name="pan_btn" tool_tip="Vue panoramique"/> + <button label="" name="avatarview_btn" tool_tip="Vue subjective"/> + <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 111e4d3e5e143dfb93f860c0b7909e37dc169151..8ce657442178d1042663ad58590115b3966257d3 100644 --- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="CHOIX DE TEXTURE ET DE COULEUR"> - <text name="r_val_text"> - Rouge : - </text> - <text name="g_val_text"> - Vert : - </text> - <text name="b_val_text"> - Bleu : - </text> - <text name="h_val_text"> - Teinte : - </text> - <text name="s_val_text"> - Sat : - </text> - <text name="l_val_text"> - Lum : - </text> - <check_box label="Appliquer maintenant" left="4" name="apply_immediate" width="108"/> - <button label="" label_selected="" left_delta="138" name="color_pipette"/> - <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> - <button label="OK" label_selected="Sélectionner" name="select_btn"/> - <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> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="ColorPicker" title="CHOIX DE TEXTURE ET DE COULEUR"> + <text name="r_val_text"> + Rouge : + </text> + <text name="g_val_text"> + Vert : + </text> + <text name="b_val_text"> + Bleu : + </text> + <text name="h_val_text"> + Teinte : + </text> + <text name="s_val_text"> + Sat : + </text> + <text name="l_val_text"> + Lum : + </text> + <check_box label="Appliquer maintenant" left="4" name="apply_immediate" width="108"/> + <button label="" label_selected="" left_delta="138" name="color_pipette"/> + <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> + <button label="OK" label_selected="Sélectionner" name="select_btn"/> + <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> +</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 f670fa9965ea42c84d496f0e846110645026c97f..2bf0b9e2f39496f463247497e35037c10f29901a 100644 --- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml @@ -1,106 +1,106 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<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> - <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="Lorsqu'un résident se téléporte à l'extérieur, réinitialise son domicile à la position de sa 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."/> - <check_box label="Interdire le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/> - <check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/> - <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118"/> - <button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118"/> - <button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118"/> - <text name="estate id"> - ID du domaine : - </text> - <text name="parent id"> - ID parent : - </text> - <line_editor name="parentestate" tool_tip="Il s'agit du domaine parent de cette région"/> - <text name="Grid Pos: "> - Position sur la grille : - </text> - <line_editor left_delta="120" name="gridposx" tool_tip="Position x de cette région sur la grille" width="35"/> - <line_editor left_delta="40" name="gridposy" tool_tip="Position y de cette région sur la grille" width="35"/> - <text name="Redirect to Grid: "> - Rediriger vers la grille : - </text> - <line_editor left_delta="120" name="redirectx" width="35"/> - <line_editor left_delta="40" name="redirecty" width="35"/> - <text font="SansSerifSmall" left_delta="-120" name="billable factor text" width="120"> - Facteur de facturation : - </text> - <spinner left="320" name="billable factor" width="70"/> - <text left_delta="-120" name="land cost text"> - L$ par m² : - </text> - <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"/> - </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> - <text left_delta="75" name="region name"> - Welsh - </text> - <check_box label="Désactiver les -scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/> - <check_box label="Désactiver les -collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/> - <check_box label="Désactiver la -physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/> - <button bottom="-85" label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/> - <button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l'avatar cible pour la suppression de l'objet."/> - <text name="target_avatar_name"> - (aucune cible) - </text> - <button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target's Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/> - <button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> - <button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target's Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> - <button label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " width="300"/> - <button label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." width="300"/> - <button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences." width="300"/> - </panel> - <panel label="Requête" name="request"> - <text name="Destination:"> - Destination : - </text> - <combo_box name="destination"> - <combo_box.item label="Sélection" name="item1"/> - <combo_box.item label="Région de l'avatar" name="item2"/> - </combo_box> - <text name="Request:"> - Requête : - </text> - <combo_box name="request"> - <combo_box.item label="Objets responsables de collisions : étapes" name="item1"/> - <combo_box.item label="Nombre de scripts et schéma optionnel" name="item2"/> - <combo_box.item label="Schéma des objets" name="item3"/> - <combo_box.item label="rezzer <asset_id>" name="item4"/> - </combo_box> - <text name="Parameter:"> - Paramètre : - </text> - <button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request" width="140"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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> + <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="Lorsqu'un résident se téléporte à l'extérieur, réinitialise son domicile à la position de sa 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."/> + <check_box label="Interdire le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/> + <check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/> + <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118"/> + <button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118"/> + <button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118"/> + <text name="estate id"> + ID du domaine : + </text> + <text name="parent id"> + ID parent : + </text> + <line_editor name="parentestate" tool_tip="Il s'agit du domaine parent de cette région"/> + <text name="Grid Pos: "> + Position sur la grille : + </text> + <line_editor left_delta="120" name="gridposx" tool_tip="Position x de cette région sur la grille" width="35"/> + <line_editor left_delta="40" name="gridposy" tool_tip="Position y de cette région sur la grille" width="35"/> + <text name="Redirect to Grid: "> + Rediriger vers la grille : + </text> + <line_editor left_delta="120" name="redirectx" width="35"/> + <line_editor left_delta="40" name="redirecty" width="35"/> + <text font="SansSerifSmall" left_delta="-120" name="billable factor text" width="120"> + Facteur de facturation : + </text> + <spinner left="320" name="billable factor" width="70"/> + <text left_delta="-120" name="land cost text"> + L$ par m² : + </text> + <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"/> + </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> + <text left_delta="75" name="region name"> + Welsh + </text> + <check_box label="Désactiver les +scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/> + <check_box label="Désactiver les +collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/> + <check_box label="Désactiver la +physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/> + <button bottom="-85" label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/> + <button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l'avatar cible pour la suppression de l'objet."/> + <text name="target_avatar_name"> + (aucune cible) + </text> + <button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target's Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/> + <button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> + <button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target's Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> + <button label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " width="300"/> + <button label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." width="300"/> + <button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences." width="300"/> + </panel> + <panel label="Requête" name="request"> + <text name="Destination:"> + Destination : + </text> + <combo_box name="destination"> + <combo_box.item label="Sélection" name="item1"/> + <combo_box.item label="Région de l'avatar" name="item2"/> + </combo_box> + <text name="Request:"> + Requête : + </text> + <combo_box name="request"> + <combo_box.item label="Objets responsables de collisions : étapes" name="item1"/> + <combo_box.item label="Nombre de scripts et schéma optionnel" name="item2"/> + <combo_box.item label="Schéma des objets" name="item3"/> + <combo_box.item label="rezzer <asset_id>" name="item4"/> + </combo_box> + <text name="Parameter:"> + Paramètre : + </text> + <button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request" width="140"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml index 018c0d81cf2fee5b3b39aca7416f2a2fc2d52157..e9d5ea62f2b592b054dfc44ea9904f6a4162763b 100644 --- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml @@ -1,28 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="CONFIGURATION DU MATÉRIEL"> - <text name="Filtering:"> - Filtres : - </text> - <check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/> - <text name="Antialiasing:"> - Anti-aliasing : - </text> - <combo_box label="Anti-aliasing" name="fsaa" width="84"> - <combo_box.item label="Désactivé" 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 left="217" name="(brightness, lower is brighter)"> - (0 = défaut, valeur faible = plus lumineux) - </text> - <text name="Enable VBO:"> - Activer le VBO : - </text> - <check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu'ils sont activés."/> - <slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/> - <spinner label="Indice du brouillard :" name="fog"/> - <button label="OK" label_selected="OK" name="OK"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Hardware Settings Floater" title="CONFIGURATION DU MATÉRIEL"> + <text name="Filtering:"> + Filtres : + </text> + <check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/> + <text name="Antialiasing:"> + Anti-aliasing : + </text> + <combo_box label="Anti-aliasing" name="fsaa" width="84"> + <combo_box.item label="Désactivé" 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 left="217" name="(brightness, lower is brighter)"> + (0 = défaut, valeur faible = plus lumineux) + </text> + <text name="Enable VBO:"> + Activer le VBO : + </text> + <check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu'ils sont activés."/> + <slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/> + <spinner label="Indice du brouillard :" name="fog"/> + <button label="OK" label_selected="OK" name="OK"/> +</floater> 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 57b60a28bf5debb7104a4a7e4bdfc98e15f9ccda..a28e0bd7d5fa071cb70579587395e08dee515ced 100644 --- a/indra/newview/skins/default/xui/fr/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_image_preview.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Image Preview" title=""> - <text name="name_label"> - Nom : - </text> - <text name="description_label"> - Description : - </text> - <text name="preview_label"> - 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"/> - </combo_box> - <text name="bad_image_text"> - Impossible de lire l'image. - -Sauvegardez en Targa 24 bit (.tga). - </text> - <check_box label="Utiliser une compression sans perte" name="lossless_check"/> - <button label="Annuler" name="cancel_btn"/> - <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Image Preview" title=""> + <text name="name_label"> + Nom : + </text> + <text name="description_label"> + Description : + </text> + <text name="preview_label"> + 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"/> + </combo_box> + <text name="bad_image_text"> + Impossible de lire l'image. + +Sauvegardez en Targa 24 bit (.tga). + </text> + <check_box label="Utiliser une compression sans perte" name="lossless_check"/> + <button label="Annuler" name="cancel_btn"/> + <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> +</floater> 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 2e982305bf2a7df556066b1920e25345dfa40045..44d420d8655d6bf900fdc52558fa3edd6e69c07e 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 @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="PROPRIÉTÉS DE L'OBJET DE L'INVENTAIRE"> - <floater.string name="unknown"> - (inconnu) - </floater.string> - <floater.string name="public"> - (public) - </floater.string> - <floater.string name="you_can"> - Vous pouvez : - </floater.string> - <floater.string name="owner_can"> - Le propriétaire peut : - </floater.string> - <text name="LabelItemNameTitle"> - Nom : - </text> - <text name="LabelItemDescTitle"> - Description : - </text> - <text name="LabelCreatorTitle"> - Créateur : - </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> - <button label="Profil..." label_selected="" name="BtnCreator"/> - <text name="LabelOwnerTitle"> - Propriétaire : - </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> - <button label="Profil..." label_selected="" name="BtnOwner"/> - <text name="LabelAcquiredTitle"> - Acquis : - </text> - <text name="LabelAcquiredDate"> - Wed May 24 12:50:46 2006 - </text> - <text name="OwnerLabel"> - Vous : - </text> - <check_box label="Éditer" name="CheckOwnerModify"/> - <check_box label="Copier" name="CheckOwnerCopy"/> - <check_box label="Revendre" name="CheckOwnerTransfer"/> - <text name="AnyoneLabel"> - N'importe qui : - </text> - <check_box label="Copier" name="CheckEveryoneCopy"/> - <text name="GroupLabel"> - Groupe : - </text> - <check_box label="Partager" name="CheckShareWithGroup"/> - <text name="NextOwnerLabel" width="192"> - Le prochain propriétaire : - </text> - <check_box label="Éditer" name="CheckNextOwnerModify"/> - <check_box label="Copier" name="CheckNextOwnerCopy"/> - <check_box label="Revendre" name="CheckNextOwnerTransfer"/> - <check_box label="À vendre" name="CheckPurchase"/> - <combo_box name="combobox sale copy"> - <combo_box.item label="Copier" name="Copy"/> - <combo_box.item label="Original" name="Original"/> - </combo_box> - <spinner label="Prix : L$" name="Edit Cost"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="item properties" title="PROPRIÉTÉS DE L'OBJET DE L'INVENTAIRE"> + <floater.string name="unknown"> + (inconnu) + </floater.string> + <floater.string name="public"> + (public) + </floater.string> + <floater.string name="you_can"> + Vous pouvez : + </floater.string> + <floater.string name="owner_can"> + Le propriétaire peut : + </floater.string> + <text name="LabelItemNameTitle"> + Nom : + </text> + <text name="LabelItemDescTitle"> + Description : + </text> + <text name="LabelCreatorTitle"> + Créateur : + </text> + <text name="LabelCreatorName"> + Nicole Linden + </text> + <button label="Profil..." label_selected="" name="BtnCreator"/> + <text name="LabelOwnerTitle"> + Propriétaire : + </text> + <text name="LabelOwnerName"> + Thrax Linden + </text> + <button label="Profil..." label_selected="" name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + Acquis : + </text> + <text name="LabelAcquiredDate"> + Wed May 24 12:50:46 2006 + </text> + <text name="OwnerLabel"> + Vous : + </text> + <check_box label="Éditer" name="CheckOwnerModify"/> + <check_box label="Copier" name="CheckOwnerCopy"/> + <check_box label="Revendre" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + N'importe qui : + </text> + <check_box label="Copier" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Groupe : + </text> + <check_box label="Partager" name="CheckShareWithGroup"/> + <text name="NextOwnerLabel" width="192"> + Le prochain propriétaire : + </text> + <check_box label="Éditer" name="CheckNextOwnerModify"/> + <check_box label="Copier" name="CheckNextOwnerCopy"/> + <check_box label="Revendre" name="CheckNextOwnerTransfer"/> + <check_box label="À vendre" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Copier" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Prix : L$" name="Edit Cost"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml index 87fe2a8352efa01fcec99ab5c826cac7eaf79054..1b3127c35d52d283763aab4626c559f069fa028c 100644 --- a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="MES TERRAINS"> - <scroll_list name="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="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/> - <button label="Carte" label_selected="Carte" name="Show on Map" tool_tip="Affichez ce terrain sur la carte du monde."/> - <text name="contrib_label"> - Vos contributions : - </text> - <scroll_list name="grant list"> - <column label="Groupe" name="group"/> - <column label="Surface" name="area"/> - </scroll_list> - <text name="allowed_label"> - Surface de terrain autorisée avec votre compte : - </text> - <text name="allowed_text"> - [AREA] m² - </text> - <text name="current_label"> - Surface occupée actuellement : - </text> - <text name="current_text"> - [AREA] m² - </text> - <text name="available_label"> - Disponible à l'achat : - </text> - <text name="available_text"> - [AREA] m² - </text> - <string name="area_string"> - [AREA] m² - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="land holdings floater" title="MES TERRAINS"> + <scroll_list name="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="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/> + <button label="Carte" label_selected="Carte" name="Show on Map" tool_tip="Affichez ce terrain sur la carte du monde."/> + <text name="contrib_label"> + Vos contributions : + </text> + <scroll_list name="grant list"> + <column label="Groupe" name="group"/> + <column label="Surface" name="area"/> + </scroll_list> + <text name="allowed_label"> + Surface de terrain autorisée avec votre compte : + </text> + <text name="allowed_text"> + [AREA] m² + </text> + <text name="current_label"> + Surface occupée actuellement : + </text> + <text name="current_text"> + [AREA] m² + </text> + <text name="available_label"> + Disponible à l'achat : + </text> + <text name="available_text"> + [AREA] m² + </text> + <string name="area_string"> + [AREA] m² + </string> +</floater> 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 4879327acee992e811d641578f16b4322481fc51..2231d503b28fed3224a611b6efb71db9bdeefbea 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 scipt 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. - </floater.string> - <floater.string name="script_running"> - Exécution en cours - </floater.string> - <floater.string name="Title"> - 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"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT"> + <floater.string name="not_allowed"> + Ce scipt 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. + </floater.string> + <floater.string name="script_running"> + Exécution en cours + </floater.string> + <floater.string name="Title"> + 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"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml index de5b707ee4928eddb2583c917b0a16ffff52a007..aeef4b0e915bb081455a332167ef0f79c749d6fb 100644 --- a/indra/newview/skins/default/xui/fr/floater_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_map.xml @@ -1,54 +1,54 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> - <floater.string name="mini_map_north"> - N - </floater.string> - <floater.string name="mini_map_east"> - E - </floater.string> - <floater.string name="mini_map_west"> - O - </floater.string> - <floater.string name="mini_map_south"> - S - </floater.string> - <floater.string name="mini_map_southeast"> - SE - </floater.string> - <floater.string name="mini_map_northeast"> - NE - </floater.string> - <floater.string name="mini_map_southwest"> - SO - </floater.string> - <floater.string name="mini_map_northwest"> - NO - </floater.string> - <floater.string name="ToolTipMsg"> - [AGENT][REGION](Double-cliquez pour ouvrir la carte) - </floater.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="E" name="floater_map_east" text="E"> - E - </text> - <text label="O" name="floater_map_west" text="O"> - O - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SE" name="floater_map_southeast" text="SE"> - SE - </text> - <text label="NE" name="floater_map_northeast" text="NE"> - NE - </text> - <text label="SO" name="floater_map_southwest" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northwest" text="NO"> - NO - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Map"> + <floater.string name="mini_map_north"> + N + </floater.string> + <floater.string name="mini_map_east"> + E + </floater.string> + <floater.string name="mini_map_west"> + O + </floater.string> + <floater.string name="mini_map_south"> + S + </floater.string> + <floater.string name="mini_map_southeast"> + SE + </floater.string> + <floater.string name="mini_map_northeast"> + NE + </floater.string> + <floater.string name="mini_map_southwest"> + SO + </floater.string> + <floater.string name="mini_map_northwest"> + NO + </floater.string> + <floater.string name="ToolTipMsg"> + [AGENT][REGION](Double-cliquez pour ouvrir la carte) + </floater.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="E" name="floater_map_east" text="E"> + E + </text> + <text label="O" name="floater_map_west" text="O"> + O + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SE" name="floater_map_southeast" text="SE"> + SE + </text> + <text label="NE" name="floater_map_northeast" text="NE"> + NE + </text> + <text label="SO" name="floater_map_southwest" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northwest" text="NO"> + NO + </text> +</floater> 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 377b80f847da1279e28db5333e29dc9a1978b153..986deaabc97337af65927c5e5f67122bdc1aec57 100644 --- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml @@ -1,31 +1,31 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="NAVIGATEUR"> - <floater.string name="home_page_url"> - http://www.secondlife.com - </floater.string> - <floater.string name="support_page_url"> - http://support.secondlife.com - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="nav_controls"> - <button label="Précédente" name="back" width="75"/> - <button label="Suivante" left_delta="75" name="forward" width="70"/> - <button label="Rafraîchir" left_delta="75" name="reload"/> - <combo_box left_delta="75" name="address" width="510"/> - <button label="OK" left_delta="515" name="go"/> - </layout_panel> - <layout_panel name="time_controls"> - <button label="en arrière" name="rewind"/> - <button label="stop" name="stop"/> - <button label="en avant" name="seek"/> - </layout_panel> - <layout_panel name="parcel_owner_controls"> - <button label="Envoyer l'URL sur la parcelle" name="assign"/> - </layout_panel> - <layout_panel name="external_controls"> - <button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/> - <check_box label="Toujours ouvrir dans mon navigateur web" left_delta="201" name="open_always"/> - <button label="Fermer" name="close"/> - </layout_panel> - </layout_stack> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="NAVIGATEUR"> + <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> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Précédente" name="back" width="75"/> + <button label="Suivante" left_delta="75" name="forward" width="70"/> + <button label="Rafraîchir" left_delta="75" name="reload"/> + <combo_box left_delta="75" name="address" width="510"/> + <button label="OK" left_delta="515" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="en arrière" name="rewind"/> + <button label="stop" name="stop"/> + <button label="en avant" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Envoyer l'URL sur la parcelle" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/> + <check_box label="Toujours ouvrir dans mon navigateur web" left_delta="201" name="open_always"/> + <button label="Fermer" name="close"/> + </layout_panel> + </layout_stack> +</floater> 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 aadf16ab8ae9077d0225586e7849b5c6e9ee5387..eb0f0e64ce2a3cf9af1ce21c5c09a61bec716bfd 100644 --- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="Simuler une fuite de mémoire"> - <spinner label="Vitesse de la fuite (octets) :" name="leak_speed"/> - <spinner label="Max mémoire perdue (Mo) :" name="max_leak"/> - <text name="total_leaked_label"> - Mémoire perdue actuelle : [SIZE] Ko - </text> - <text name="note_label_1"> - [NOTE1] - </text> - <text name="note_label_2"> - [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"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="MemLeak" title="Simuler une fuite de mémoire"> + <spinner label="Vitesse de la fuite (octets) :" name="leak_speed"/> + <spinner label="Max mémoire perdue (Mo) :" name="max_leak"/> + <text name="total_leaked_label"> + Mémoire perdue actuelle : [SIZE] Ko + </text> + <text name="note_label_1"> + [NOTE1] + </text> + <text name="note_label_2"> + [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"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml index 7e7dc53c6c8ee2d1f72c8eb9bb702454c8a07a30..528fa309eb4bf62a660eac903d906c8179fed91a 100644 --- a/indra/newview/skins/default/xui/fr/floater_moveview.xml +++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml @@ -1,35 +1,35 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> - <string name="walk_forward_tooltip"> - Vous déplacer vers l'avant (appuyer sur la flèche vers le haut ou W) - </string> - <string name="walk_back_tooltip"> - Marcher en arrière (appuyer sur la flèche vers le bas ou S) - </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="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> - <panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/> - <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="Vous envoler, appuyer sur E"/> - <button label="" label_selected="" name="move down btn" tool_tip="Atterrir, appuyer sur C"/> - <joystick_turn name="forward btn" tool_tip="Vous déplacer vers l'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> - <panel name="panel_modes"> - <button label="" name="mode_walk_btn" tool_tip="Mode marche"/> - <button label="" name="mode_run_btn" tool_tip="Mode courir"/> - <button label="" name="mode_fly_btn" tool_tip="Mode voler"/> - <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="move_floater"> + <string name="walk_forward_tooltip"> + Vous déplacer vers l'avant (appuyer sur la flèche vers le haut ou W) + </string> + <string name="walk_back_tooltip"> + Marcher en arrière (appuyer sur la flèche vers le bas ou S) + </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="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> + <panel name="panel_actions"> + <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/> + <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="Vous envoler, appuyer sur E"/> + <button label="" label_selected="" name="move down btn" tool_tip="Atterrir, appuyer sur C"/> + <joystick_turn name="forward btn" tool_tip="Vous déplacer vers l'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> + <panel name="panel_modes"> + <button label="" name="mode_walk_btn" tool_tip="Mode marche"/> + <button label="" name="mode_run_btn" tool_tip="Mode courir"/> + <button label="" name="mode_fly_btn" tool_tip="Mode voler"/> + <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml index 5432cb27d0abe41c675ecb3b52f9affce607b20e..50d7049bba22e6433544609f7ea902ac01968ae0 100644 --- a/indra/newview/skins/default/xui/fr/floater_pay.xml +++ b/indra/newview/skins/default/xui/fr/floater_pay.xml @@ -1,20 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <text left="5" name="payee_label"> - Payer : - </text> - <icon name="icon_person" tool_tip="Résident"/> - <text 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"/> - <text left="4" name="amount text"> - Ou choisissez un montant : - </text> - <line_editor left="60" name="amount" width="55"/> - <button label="Payer" label_selected="Payer" name="pay btn"/> - <button label="Annuler" label_selected="Annuler" name="cancel btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <text left="5" name="payee_label"> + Payer : + </text> + <icon name="icon_person" tool_tip="Résident"/> + <text 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"/> + <text left="4" name="amount text"> + Ou choisissez un montant : + </text> + <line_editor left="60" name="amount" width="55"/> + <button label="Payer" label_selected="Payer" name="pay btn"/> + <button label="Annuler" label_selected="Annuler" name="cancel btn"/> +</floater> 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 04511f5ba02a2a8bb0b38ce46ded7e6473a54d9f..a8cac0b566b11ddb493a038ad0d3eb1a857b1182 100644 --- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml @@ -1,30 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <string name="payee_group" width="95"> - Payer le groupe : - </string> - <string halign="left" name="payee_resident" width="100"> - Payer le résident : - </string> - <icon name="icon_person" tool_tip="Résident"/> - <text left="105" name="payee_name"> - [FIRST] [LAST] - </text> - <text left="25" name="object_name_label"> - Via un objet : - </text> - <icon name="icon_object" tool_tip="Objets"/> - <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"/> - <text halign="left" left="5" name="amount text"> - Ou choisissez un montant : - </text> - <line_editor left="65" name="amount" width="50"/> - <button label="Payer" label_selected="Payer" name="pay btn"/> - <button label="Annuler" label_selected="Annuler" name="cancel btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <string name="payee_group" width="95"> + Payer le groupe : + </string> + <string halign="left" name="payee_resident" width="100"> + Payer le résident : + </string> + <icon name="icon_person" tool_tip="Résident"/> + <text left="105" name="payee_name"> + [FIRST] [LAST] + </text> + <text left="25" name="object_name_label"> + Via un objet : + </text> + <icon name="icon_object" tool_tip="Objets"/> + <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"/> + <text halign="left" left="5" name="amount text"> + Ou choisissez un montant : + </text> + <line_editor left="65" name="amount" width="50"/> + <button label="Payer" label_selected="Payer" name="pay btn"/> + <button label="Annuler" label_selected="Annuler" name="cancel btn"/> +</floater> 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 b7d3eb0a799a0207b109139832960bac1ce46bbc..4811760bbfdb62dd194910f12fc4b29b1928c2b3 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview_anim"> - <floater.string name="Title"> - Animation : [NAME] - </floater.string> - <text name="desc txt"> - Description : - </text> - <button label="Jouer dans le Monde" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Jouer cette animation et partagez-la avec d'autres." width="131"/> - <button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Jouer cette animation et soyez le seul à la voir." width="125"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_anim"> + <floater.string name="Title"> + Animation : [NAME] + </floater.string> + <text name="desc txt"> + Description : + </text> + <button label="Jouer dans le Monde" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Jouer cette animation et partagez-la avec d'autres." width="131"/> + <button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Jouer cette animation et soyez le seul à la voir." width="125"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml index a50a4057f8d6a8c77882602ebf22bd77c500b752..f7a70db96e95e67498261bab9540a9857df6d327 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="INFORMATIONS SUR LA PETITE ANNONCE"> - <floater.string name="Title"> - Petite annonce : [NAME] - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="classified_preview" title="INFORMATIONS SUR LA PETITE ANNONCE"> + <floater.string name="Title"> + Petite annonce : [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_event.xml b/indra/newview/skins/default/xui/fr/floater_preview_event.xml index b901751eecf271f145440e6be747b06801fccdb7..30e6a218cb5e226e738209fec9e1d096dde74107 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_event.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="INFORMATIONS SUR L'ÉVÉNEMENT"> - <floater.string name="Title"> - Événement : [NAME] - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="INFORMATIONS SUR L'ÉVÉNEMENT"> + <floater.string name="Title"> + Événement : [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml index e6a4514460b1a4c817ad1e4e158269815c607a51..4bdd52f14a28ca564fdc523ea16c61df245a7e35 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="Raccourci du geste"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Raccourci du geste"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml index e6a4514460b1a4c817ad1e4e158269815c607a51..4bdd52f14a28ca564fdc523ea16c61df245a7e35 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="Raccourci du geste"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Raccourci du geste"/> 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 1039760623e15d50e6f94660524ec0d7cdf53213..d5d984238a3f705dafa8326560cf857b79bb4bd8 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml @@ -1,22 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="REMARQUE :"> - <floater.string name="no_object"> - Impossible de trouver l'objet contenant cette note. - </floater.string> - <floater.string name="not_allowed"> - Vous n'avez pas le droit de voir cette note. - </floater.string> - <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> - <text_editor name="Notecard Editor"> - Chargement... - </text_editor> - <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview notecard" title="REMARQUE :"> + <floater.string name="no_object"> + Impossible de trouver l'objet contenant cette note. + </floater.string> + <floater.string name="not_allowed"> + Vous n'avez pas le droit de voir cette note. + </floater.string> + <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> + <text_editor name="Notecard Editor"> + Chargement... + </text_editor> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +</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 d1729ac8dfe20d3a90e1c755436dff97d4df09b2..9d9b067a8dfed2d866a2ef2d1fc0dbe3569fb543 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/fr/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"> - Son : [NAME] - </floater.string> - <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="Jouer ce son et partagez-le avec d'autres." width="131"/> - <button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Jouer ce son et soyez le seul à l'entendre." width="125"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_sound"> + <floater.string name="Title"> + Son : [NAME] + </floater.string> + <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="Jouer ce son et partagez-le avec d'autres." width="131"/> + <button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Jouer ce son et soyez le seul à 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 beebebfd4da7df89bc75a9f59b07a009e9badf02..a2653143a6a9134d44fc072fa753d63db879477f 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml @@ -1,17 +1,17 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview_texture"> - <floater.string name="Title"> - Texture : [NAME] - </floater.string> - <floater.string name="Copy"> - Copier dans l'inventaire - </floater.string> - <text name="desc txt"> - Description : - </text> - <button label="Enregistrer" name="Keep"/> - <button label="Supprimer" name="Discard"/> - <text name="dimensions"> - [WIDTH]px x [HEIGHT]px - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_texture"> + <floater.string name="Title"> + Texture : [NAME] + </floater.string> + <floater.string name="Copy"> + Copier dans l'inventaire + </floater.string> + <text name="desc txt"> + Description : + </text> + <button label="Enregistrer" name="Keep"/> + <button label="Supprimer" name="Discard"/> + <text name="dimensions"> + [WIDTH]px x [HEIGHT]px + </text> +</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 6335e41babb55d2374f7304d8b60be147fdb8ccc..77d2b37ebaf582bc0a295ec9544128bb7a8bca01 100644 --- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml @@ -1,104 +1,104 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION"> - <floater.string name="Screenshot"> - Capture d'écran - </floater.string> - <check_box label="Utiliser cette capture d'écran" name="screen_check"/> - <text name="reporter_title" width="60"> - Déposant : - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut - </text> - <text name="sim_title"> - Région : - </text> - <text name="sim_field"> - Nom de la région - </text> - <text name="pos_title"> - Position : - </text> - <text name="pos_field"> - {128.1, 128.1, 15.4} - </text> - <text name="select_object_label"> - Cliquez sur le bouton puis l'objet responsable : - </text> - <button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d'objet vous permet d'identifier un objet comme sujet du rapport."/> - <text name="object_name_label"> - Objet : - </text> - <text left_delta="70" name="object_name" width="105"> - Consetetur Sadipscing - </text> - <text name="owner_name_label" width="66"> - Propriétaire : - </text> - <text left_delta="70" name="owner_name" width="105"> - Hendrerit Vulputate - </text> - <combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport"> - <combo_box.item label="Sélectionnez une catégorie" name="Select_category"/> - <combo_box.item label="Âge > « Age play »" name="Age__Age_play"/> - <combo_box.item label="Âge > Résident adulte sur Second Life pour adolescents" name="Age__Adult_resident_on_Teen_Second_Life"/> - <combo_box.item label="Âge > Resident mineur en dehors de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> - <combo_box.item label="Assaut > Bac à sable utilisé pour des combats/zone non sécurisée" name="Assault__Combat_sandbox___unsafe_area"/> - <combo_box.item label="Assaut > Zone sécurisée" name="Assault__Safe_area"/> - <combo_box.item label="Assaut > Bac à sable pour tests d'armes à feu" name="Assault__Weapons_testing_sandbox"/> - <combo_box.item label="Commerce > Incapacité à fournir un produit ou service" name="Commerce__Failure_to_deliver_product_or_service"/> - <combo_box.item label="Divulgation > Informations sur la vie réelle" name="Disclosure__Real_world_information"/> - <combo_box.item label="Divulgation > Écoute d'un chat à distance" name="Disclosure__Remotely_monitoring chat"/> - <combo_box.item label="Divulgation > Informations sur Second Life/chat/IM" name="Disclosure__Second_Life_information_chat_IMs"/> - <combo_box.item label="Trouble de la paix > Utilisation inadéquate des ressources de la région" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> - <combo_box.item label="Trouble de la paix > Nombre d'objets scriptés excessif" name="Disturbing_the_peace__Excessive_scripted_objects"/> - <combo_box.item label="Trouble de la paix > Abandon d'objets" name="Disturbing_the_peace__Object_littering"/> - <combo_box.item label="Trouble de la paix > Spam à répétition" name="Disturbing_the_peace__Repetitive_spam"/> - <combo_box.item label="Trouble de la paix > Spam à caractère commercial" name="Disturbing_the_peace__Unwanted_advert_spam"/> - <combo_box.item label="Fraude > L$" name="Fraud__L$"/> - <combo_box.item label="Fraude > Terrain" name="Fraud__Land"/> - <combo_box.item label="Fraude > Vente pyramidale ou lettre-chaîne" name="Fraud__Pyramid_scheme_or_chain_letter"/> - <combo_box.item label="Fraude > US$" name="Fraud__US$"/> - <combo_box.item label="Harcèlement > Spam visuel" name="Harassment__Advert_farms___visual_spam"/> - <combo_box.item label="Harcèlement > Diffamation envers des individus ou des groupes" name="Harassment__Defaming_individuals_or_groups"/> - <combo_box.item label="Harcèlement > Immobilisation" name="Harassment__Impeding_movement"/> - <combo_box.item label="Harcèlement > Harcèlement sexuel" name="Harassment__Sexual_harassment"/> - <combo_box.item label="Harcèlement > Incitation à enfreindre les Conditions d'utilisation" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> - <combo_box.item label="Harcèlement > Abus verbal" name="Harassment__Verbal_abuse"/> - <combo_box.item label="Indécence > Contenu ou comportement offensifs" name="Indecency__Broadly_offensive_content_or_conduct"/> - <combo_box.item label="Indécence > Nom d'avatar inapproprié" name="Indecency__Inappropriate_avatar_name"/> - <combo_box.item label="Indécence > Contenu ou conduite inappropriés dans une région PG" name="Indecency__Mature_content_in_PG_region"/> - <combo_box.item label="Indécence > Contenu ou conduite inappropriés dans une région Mature" name="Indecency__Inappropriate_content_in_Mature_region"/> - <combo_box.item label="Violation de droits de propriété intellectuelle > Suppression de contenu" name="Intellectual_property_infringement_Content_Removal"/> - <combo_box.item label="Violation de droits de propriété intellectuelle > CopyBot ou exploitation abusive des droits" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> - <combo_box.item label="Intolérance" name="Intolerance"/> - <combo_box.item label="Terrain > Utilisation abusive des ressources du bac à sable" name="Land__Abuse_of_sandbox_resources"/> - <combo_box.item label="Terrain > Empiètement > Objets/textures" name="Land__Encroachment__Objects_textures"/> - <combo_box.item label="Terrain > Empiètement > Particules" name="Land__Encroachment__Particles"/> - <combo_box.item label="Terrain > Empiètement > Arbres/plantes" name="Land__Encroachment__Trees_plants"/> - <combo_box.item label="Paris/jeux d'argent" name="Wagering_gambling"/> - <combo_box.item label="Autre" name="Other"/> - </combo_box> - <text name="abuser_name_title"> - Nom du contrevenant : - </text> - <button label="Choisir" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/> - <text name="abuser_name_title2"> - Indiquez où l'infraction a eu lieu : - </text> - <text name="sum_title"> - Récapitulatif : - </text> - <text name="dscr_title"> - Détails : - </text> - <text name="bug_aviso"> - Soyez aussi spécifique que possible - </text> - <text bottom_delta="-16" name="incomplete_title"> - Remarque : les rapports incomplets ne feront pas l'objet d'une -enquête. - </text> - <button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/> - <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION"> + <floater.string name="Screenshot"> + Capture d'écran + </floater.string> + <check_box label="Utiliser cette capture d'écran" name="screen_check"/> + <text name="reporter_title" width="60"> + Déposant : + </text> + <text name="reporter_field"> + Loremipsum Dolorsitamut + </text> + <text name="sim_title"> + Région : + </text> + <text name="sim_field"> + Nom de la région + </text> + <text name="pos_title"> + Position : + </text> + <text name="pos_field"> + {128.1, 128.1, 15.4} + </text> + <text name="select_object_label"> + Cliquez sur le bouton puis l'objet responsable : + </text> + <button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d'objet vous permet d'identifier un objet comme sujet du rapport."/> + <text name="object_name_label"> + Objet : + </text> + <text left_delta="70" name="object_name" width="105"> + Consetetur Sadipscing + </text> + <text name="owner_name_label" width="66"> + Propriétaire : + </text> + <text left_delta="70" name="owner_name" width="105"> + Hendrerit Vulputate + </text> + <combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport"> + <combo_box.item label="Sélectionnez une catégorie" name="Select_category"/> + <combo_box.item label="Âge > « Age play »" name="Age__Age_play"/> + <combo_box.item label="Âge > Résident adulte sur Second Life pour adolescents" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="Âge > Resident mineur en dehors de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Assaut > Bac à sable utilisé pour des combats/zone non sécurisée" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Assaut > Zone sécurisée" name="Assault__Safe_area"/> + <combo_box.item label="Assaut > Bac à sable pour tests d'armes à feu" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="Commerce > Incapacité à fournir un produit ou service" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="Divulgation > Informations sur la vie réelle" name="Disclosure__Real_world_information"/> + <combo_box.item label="Divulgation > Écoute d'un chat à distance" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Divulgation > Informations sur Second Life/chat/IM" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Trouble de la paix > Utilisation inadéquate des ressources de la région" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Trouble de la paix > Nombre d'objets scriptés excessif" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Trouble de la paix > Abandon d'objets" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="Trouble de la paix > Spam à répétition" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="Trouble de la paix > Spam à caractère commercial" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="Fraude > L$" name="Fraud__L$"/> + <combo_box.item label="Fraude > Terrain" name="Fraud__Land"/> + <combo_box.item label="Fraude > Vente pyramidale ou lettre-chaîne" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="Fraude > US$" name="Fraud__US$"/> + <combo_box.item label="Harcèlement > Spam visuel" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="Harcèlement > Diffamation envers des individus ou des groupes" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="Harcèlement > Immobilisation" name="Harassment__Impeding_movement"/> + <combo_box.item label="Harcèlement > Harcèlement sexuel" name="Harassment__Sexual_harassment"/> + <combo_box.item label="Harcèlement > Incitation à enfreindre les Conditions d'utilisation" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="Harcèlement > Abus verbal" name="Harassment__Verbal_abuse"/> + <combo_box.item label="Indécence > Contenu ou comportement offensifs" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Indécence > Nom d'avatar inapproprié" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Indécence > Contenu ou conduite inappropriés dans une région PG" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Indécence > Contenu ou conduite inappropriés dans une région Mature" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Violation de droits de propriété intellectuelle > Suppression de contenu" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Violation de droits de propriété intellectuelle > CopyBot ou exploitation abusive des droits" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Intolérance" name="Intolerance"/> + <combo_box.item label="Terrain > Utilisation abusive des ressources du bac à sable" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="Terrain > Empiètement > Objets/textures" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="Terrain > Empiètement > Particules" name="Land__Encroachment__Particles"/> + <combo_box.item label="Terrain > Empiètement > Arbres/plantes" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="Paris/jeux d'argent" name="Wagering_gambling"/> + <combo_box.item label="Autre" name="Other"/> + </combo_box> + <text name="abuser_name_title"> + Nom du contrevenant : + </text> + <button label="Choisir" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/> + <text name="abuser_name_title2"> + Indiquez où l'infraction a eu lieu : + </text> + <text name="sum_title"> + Récapitulatif : + </text> + <text name="dscr_title"> + Détails : + </text> + <text name="bug_aviso"> + Soyez aussi spécifique que possible + </text> + <text bottom_delta="-16" name="incomplete_title"> + Remarque : les rapports incomplets ne feront pas l'objet d'une +enquête. + </text> + <button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/> + <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml index fc805e879b8f9d1abe82601c3a784f0f8cf19a0f..ef021ce713170e7ed1357aa5e8d9beed45acc2e7 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script" short_title="[All scripts]" title="[All scripts]"/> +<?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/fr/floater_script_preview.xml b/indra/newview/skins/default/xui/fr/floater_script_preview.xml index dbd3558c1901c3f785e6b87745f2c225b71c6475..d699011f325f396d25fecc619355abbb06cf2668 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_preview.xml @@ -1,9 +1,9 @@ -<?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] - </floater.string> - <text name="desc txt"> - Description : - </text> -</floater> +<?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] + </floater.string> + <text name="desc txt"> + Description : + </text> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_script_queue.xml b/indra/newview/skins/default/xui/fr/floater_script_queue.xml index dbbe2539dc7e336b9b6a76b4254aa76cfed2f4c2..7d4afdf8181e5cddf9a97cf9b564be694e075a4d 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_queue.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="RÉINITIALISER PROGRESSION"> - <floater.string name="Starting"> - Début du [START] sur [COUNT] objets. - </floater.string> - <floater.string name="Done"> - Fini. - </floater.string> - <floater.string name="Resetting"> - Réinitialisation - </floater.string> - <floater.string name="Running"> - Exécution en cours - </floater.string> - <floater.string name="NotRunning"> - Arrêt - </floater.string> - <button label="Fermer" label_selected="Fermer" name="close"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="queue" title="RÉINITIALISER PROGRESSION"> + <floater.string name="Starting"> + Début du [START] sur [COUNT] objets. + </floater.string> + <floater.string name="Done"> + Fini. + </floater.string> + <floater.string name="Resetting"> + Réinitialisation + </floater.string> + <floater.string name="Running"> + Exécution en cours + </floater.string> + <floater.string name="NotRunning"> + Arrêt + </floater.string> + <button label="Fermer" label_selected="Fermer" name="close"/> +</floater> 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 2ded68309c578903e9308ae2242d7335639d1580..86c6a52f8c22f4d7c917cc2a8b9e15bdd16a440c 100644 --- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml @@ -1,66 +1,66 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="VENDRE TERRAIN"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - Parcelle : - </text> - <text name="info_parcel"> - PARCEL NAME - </text> - <text name="info_size_label"> - Taille : - </text> - <text name="info_size"> - [AREA] m² - </text> - <text bottom_delta="-60" name="info_action"> - Pour vendre cette -parcelle : - </text> - <icon bottom_delta="-86" name="step_price"/> - <text name="price_label"> - Votre prix de vente : - </text> - <text name="price_text"> - Fixez un prix convenable. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - ([PER_METER] L$ par mètre carré) - </text> - <text name="sell_to_label"> - Vos acheteurs : - </text> - <text name="sell_to_text"> - Vendez votre terrain à n'importe qui ou uniquement à un acheteur -spécifique. - </text> - <combo_box bottom_delta="-32" name="sell_to"> - <combo_box.item label="Sélectionnez --" name="--selectone--"/> - <combo_box.item label="N'importe qui" name="Anyone"/> - <combo_box.item label="Personne spécifique :" name="Specificuser:"/> - </combo_box> - <button label="Sélectionner..." name="sell_to_select_agent" width="100"/> - <text name="sell_objects_label"> - Vendez-vous des objets avec ce terrain ? - </text> - <text name="sell_objects_text"> - Les objets transférables se trouvant sur la parcelle changeront -de propriétaire. - </text> - <radio_group bottom_delta="-54" name="sell_objects" right="430"> - <radio_item label="Non, rester le propriétaire des objets" name="no"/> - <radio_item label="Oui, vendre les objets avec le terrain" name="yes"/> - </radio_group> - <button label="Afficher les objets" name="show_objects" right="420" width="120"/> - <text bottom_delta="-30" name="nag_message_label"> - Rappel : toute vente est définitive. - </text> - <button label="Mettre le terrain en vente" name="sell_btn" width="165"/> - <button label="Annuler" name="cancel_btn"/> - </panel> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sell land" title="VENDRE TERRAIN"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + Parcelle : + </text> + <text name="info_parcel"> + PARCEL NAME + </text> + <text name="info_size_label"> + Taille : + </text> + <text name="info_size"> + [AREA] m² + </text> + <text bottom_delta="-60" name="info_action"> + Pour vendre cette +parcelle : + </text> + <icon bottom_delta="-86" name="step_price"/> + <text name="price_label"> + Votre prix de vente : + </text> + <text name="price_text"> + Fixez un prix convenable. + </text> + <text name="price_ld"> + L$ + </text> + <text name="price_per_m"> + ([PER_METER] L$ par mètre carré) + </text> + <text name="sell_to_label"> + Vos acheteurs : + </text> + <text name="sell_to_text"> + Vendez votre terrain à n'importe qui ou uniquement à un acheteur +spécifique. + </text> + <combo_box bottom_delta="-32" name="sell_to"> + <combo_box.item label="Sélectionnez --" name="--selectone--"/> + <combo_box.item label="N'importe qui" name="Anyone"/> + <combo_box.item label="Personne spécifique :" name="Specificuser:"/> + </combo_box> + <button label="Sélectionner..." name="sell_to_select_agent" width="100"/> + <text name="sell_objects_label"> + Vendez-vous des objets avec ce terrain ? + </text> + <text name="sell_objects_text"> + Les objets transférables se trouvant sur la parcelle changeront +de propriétaire. + </text> + <radio_group bottom_delta="-54" name="sell_objects" right="430"> + <radio_item label="Non, rester le propriétaire des objets" name="no"/> + <radio_item label="Oui, vendre les objets avec le terrain" name="yes"/> + </radio_group> + <button label="Afficher les objets" name="show_objects" right="420" width="120"/> + <text bottom_delta="-30" name="nag_message_label"> + Rappel : toute vente est définitive. + </text> + <button label="Mettre le terrain en vente" name="sell_btn" width="165"/> + <button label="Annuler" name="cancel_btn"/> + </panel> + </scroll_container> +</floater> 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 3550d8c86f6cfee1873bb97eb865a9da7cf887dc..ee076119aa8d8d3960d1e0a1839cda894d957c8f 100644 --- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="PARAMÉTRAGES DU MODE DEBUG"> - <combo_box name="boolean_combo"> - <combo_box.item label="TRUE" name="TRUE"/> - <combo_box.item label="FALSE" name="FALSE"/> - </combo_box> - <color_swatch label="Couleur" 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"/> - <spinner label="x" name="val_spinner_4"/> - <button label="Paramètres par défaut" name="default_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="settings_debug" title="PARAMÉTRAGES DU MODE DEBUG"> + <combo_box name="boolean_combo"> + <combo_box.item label="TRUE" name="TRUE"/> + <combo_box.item label="FALSE" name="FALSE"/> + </combo_box> + <color_swatch label="Couleur" 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"/> + <spinner label="x" name="val_spinner_4"/> + <button label="Paramètres par défaut" name="default_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml index 5d5e3213ca2d01a5152b0cabbd178408abd14d78..26443e634b0a024cfddf87d6c4801f5a7e99e97e 100644 --- a/indra/newview/skins/default/xui/fr/floater_stats.xml +++ b/indra/newview/skins/default/xui/fr/floater_stats.xml @@ -1,71 +1,71 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Statistics" title="Statistiques"> - <scroll_container name="statistics_scroll"> - <container_view name="statistics_view"> - <stat_view label="Basic" name="basic"> - <stat_bar label="FPS" name="fps"/> - <stat_bar label="Bandwidth" name="bandwidth"/> - <stat_bar label="Packet Loss" name="packet_loss"/> - <stat_bar label="Ping Sim" name="ping"/> - </stat_view> - <stat_view label="Advanced" 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="Network" 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="Objets" 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> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="Statistiques"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="Basic" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="Bandwidth" name="bandwidth"/> + <stat_bar label="Packet Loss" name="packet_loss"/> + <stat_bar label="Ping Sim" name="ping"/> + </stat_view> + <stat_view label="Advanced" 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="Network" 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="Objets" 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/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 5ded9a1de4e2509266d6021c98c5f445dd848cbd..327063440174b17bc617730cde863c0766f8dbb7 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -1,479 +1,479 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="Outils de construction" title=""> - <floater.string name="status_rotate"> - Pour faire tourner l'objet, faîtes glisser les bandes de couleur. - </floater.string> - <floater.string name="status_scale"> - Pour étirer le côté sélectionné, cliquez et faites glisser. - </floater.string> - <floater.string name="status_move"> - Glissez pour déplacer, Maj-glissez pour copier. - </floater.string> - <floater.string name="status_modifyland"> - Cliquez et maintenez pour modifier le terrain. - </floater.string> - <floater.string name="status_camera"> - Cliquez et faîtes glisser pour bouger la caméra - </floater.string> - <floater.string name="status_grab"> - Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter. - </floater.string> - <floater.string name="status_place"> - Cliquez dans le monde pour construire. - </floater.string> - <floater.string name="status_selectland"> - Cliquez et faites glisser pour sélectionner le terrain. - </floater.string> - <floater.string name="grid_screen_text"> - Écran - </floater.string> - <floater.string name="grid_local_text"> - Local - </floater.string> - <floater.string name="grid_world_text"> - Monde - </floater.string> - <floater.string name="grid_reference_text"> - Référence - </floater.string> - <floater.string name="grid_attachment_text"> - 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"/> - <button label="" label_selected="" name="button edit" tool_tip="Modifier"/> - <button label="" label_selected="" name="button create" tool_tip="Créer"/> - <button label="" label_selected="" name="button land" tool_tip="Terrain"/> - <text name="text status"> - Glissez pour déplacer, Maj-glissez pour copier. - </text> - <radio_group name="focus_radio_group"> - <radio_item label="Zoom" name="radio zoom"/> - <radio_item label="Orbite (Ctrl)" name="radio orbit"/> - <radio_item label="Panoramique (Ctrl-Maj)" name="radio pan"/> - </radio_group> - <radio_group name="move_radio_group"> - <radio_item label="Déplacer" name="radio move"/> - <radio_item label="Orbite (Ctrl)" name="radio lift"/> - <radio_item label="Faire tourner (Ctrl-Maj)" name="radio spin"/> - </radio_group> - <radio_group name="edit_radio_group"> - <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_group> - <check_box label="Modification liée" name="checkbox edit linked parts"/> - <check_box label="Étirer les deux côtés" name="checkbox uniform"/> - <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"> - <combo_box.item label="Axe du monde" name="World"/> - <combo_box.item label="Axe local" name="Local"/> - <combo_box.item label="Axe de référence" name="Reference"/> - </combo_box> - <button label="Options..." label_selected="Options..." name="Options..." tool_tip="Définir les options de la grille"/> - <button label="" label_selected="" name="ToolCube" tool_tip="Cube"/> - <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/> - <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> - <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/> - <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/> - <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/> - <button label="" label_selected="" name="ToolCone" tool_tip="Cône"/> - <button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/> - <button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/> - <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/> - <button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/> - <button label="" label_selected="" name="ToolTube" tool_tip="Tube"/> - <button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/> - <button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/> - <button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/> - <check_box label="Maintenir l'outil sélectionné" name="checkbox sticky"/> - <check_box label="Copier la sélection" name="checkbox copy selection"/> - <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="Aplatir" name="radio flatten"/> - <radio_item label="Élever" name="radio raise"/> - <radio_item label="Abaisser" name="radio lower"/> - <radio_item label="Lisser" name="radio smooth"/> - <radio_item label="Bosseler" name="radio noise"/> - <radio_item label="Annuler modification" name="radio revert"/> - </radio_group> - <text name="Bulldozer:"> - Bulldozer : - </text> - <text name="Dozer Size:"> - Taille - </text> - <text name="Strength:"> - Force - </text> - <button label="Appliquer" label_selected="Appliquer" left="176" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/> - <text name="obj_count"> - Objets : [COUNT] - </text> - <text name="prim_count"> - Prims : [COUNT] - </text> - <tab_container name="Object Info Tabs"> - <panel label="Général" name="General"> - <panel.string name="text deed continued"> - Céder - </panel.string> - <panel.string name="text deed"> - Transférer - </panel.string> - <panel.string name="text modify info 1"> - Vous pouvez modifier cet objet - </panel.string> - <panel.string name="text modify info 2"> - Vous pouvez modifier ces objets - </panel.string> - <panel.string name="text modify info 3"> - Vous ne pouvez pas modifier cet objet - </panel.string> - <panel.string name="text modify info 4"> - Vous ne pouvez pas modifier ces objets - </panel.string> - <panel.string name="text modify warning"> - Sélectionnez l'objet en entier - </panel.string> - <panel.string name="Cost Default"> - Prix : L$ - </panel.string> - <panel.string name="Cost Total"> - Prix total : L$ - </panel.string> - <panel.string name="Cost Per Unit"> - Prix par : L$ - </panel.string> - <panel.string name="Cost Mixed"> - Prix mixte - </panel.string> - <panel.string name="Sale Mixed"> - Vente mixte - </panel.string> - <text name="Name:"> - Nom : - </text> - <text name="Description:"> - Description : - </text> - <text name="Creator:"> - Créateur : - </text> - <text name="Creator Name"> - Thrax Linden - </text> - <text name="Owner:"> - Propriétaire : - </text> - <text name="Owner Name"> - Thrax Linden - </text> - <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"/> - <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."/> - <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 : - </text> - <combo_box name="clickaction" width="178"> - <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/> - <combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/> - <combo_box.item label="Acheter l'objet" name="Buyobject"/> - <combo_box.item label="Payer l'objet" name="Payobject"/> - <combo_box.item label="Ouvrir" name="Open"/> - </combo_box> - <check_box label="À vendre :" name="checkbox for sale"/> - <combo_box name="sale type"> - <combo_box.item label="Copie" name="Copy"/> - <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 la recherche" name="search_check" tool_tip="Afficher l'objet dans les résultats de recherche"/> - <panel name="perms_build"> - <text name="perm_modify"> - Vous pouvez modifier cet objet - </text> - <text name="Anyone can:"> - N'importe qui : - </text> - <check_box label="Copier" name="checkbox allow everyone copy"/> - <text name="Next owner can:"> - Le prochain propriétaire : - </text> - <check_box label="Modifier" name="checkbox next owner can modify"/> - <check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/> - <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> - <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="Objet" name="Object"> - <check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l'objet d'être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/> - <check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l'objet d'être poussé et affecté par la gravité"/> - <check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L'objet est supprimé 1 mn après sa création."/> - <check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l'objet de ne pas entrer en collision avec d'autres objets ou avatars."/> - <text name="label position"> - Position (mètres) - </text> - <spinner label="X" name="Pos X"/> - <spinner label="Y" name="Pos Y"/> - <spinner label="Z" name="Pos Z"/> - <text name="label size"> - Taille (mètres) - </text> - <spinner label="X" name="Scale X"/> - <spinner label="Y" name="Scale Y"/> - <spinner label="Z" name="Scale Z"/> - <text name="label rotation"> - Rotation (degrés) - </text> - <spinner label="X" name="Rot X"/> - <spinner label="Y" name="Rot Y"/> - <spinner label="Z" name="Rot Z"/> - <combo_box name="comboBaseType"> - <combo_box.item label="Boîte" name="Box"/> - <combo_box.item label="Cylindre" name="Cylinder"/> - <combo_box.item label="Prisme" name="Prism"/> - <combo_box.item label="Sphère" name="Sphere"/> - <combo_box.item label="Tore" name="Torus"/> - <combo_box.item label="Tube" name="Tube"/> - <combo_box.item label="Anneau" name="Ring"/> - <combo_box.item label="Sculptie" name="Sculpted"/> - </combo_box> - <combo_box name="material"> - <combo_box.item label="Pierre" name="Stone"/> - <combo_box.item label="Métal" name="Metal"/> - <combo_box.item label="Verre" name="Glass"/> - <combo_box.item label="Bois" name="Wood"/> - <combo_box.item label="Chair" name="Flesh"/> - <combo_box.item label="Plastique" name="Plastic"/> - <combo_box.item label="Caoutchouc" name="Rubber"/> - </combo_box> - <text name="text cut"> - Découpe du tracé (début/fin) - </text> - <spinner label="D" name="cut begin"/> - <spinner label="F" name="cut end"/> - <text name="text hollow"> - Creux - </text> - <text name="text skew"> - Biais - </text> - <text name="Hollow Shape"> - Forme du creux - </text> - <combo_box name="hole"> - <combo_box.item label="Défaut" name="Default"/> - <combo_box.item label="Cercle" name="Circle"/> - <combo_box.item label="Carré" name="Square"/> - <combo_box.item label="Triangle" name="Triangle"/> - </combo_box> - <text name="text twist"> - Vrille (début/fin) - </text> - <spinner label="D" name="Twist Begin"/> - <spinner label="F" name="Twist End"/> - <text name="scale_taper"> - Biseautage - </text> - <text name="scale_hole"> - Taille du trou - </text> - <spinner label="X" name="Taper Scale X"/> - <spinner label="Y" name="Taper Scale Y"/> - <text name="text topshear"> - Inclinaison - </text> - <spinner label="X" name="Shear X"/> - <spinner label="Y" name="Shear Y"/> - <text name="advanced_cut"> - Découpe du profilé (début/fin) - </text> - <text name="advanced_dimple"> - Creux (début/fin) - </text> - <text name="advanced_slice"> - Tranche (début/fin) - </text> - <spinner label="D" name="Path Limit Begin"/> - <spinner label="F" name="Path Limit End"/> - <text name="text taper2"> - Biseautage - </text> - <spinner label="X" name="Taper X"/> - <spinner label="Y" name="Taper Y"/> - <text name="text radius delta"> - Rayon - </text> - <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="Retourne le sculptie le long de l'axe des X."/> - <check_box label="A l'envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d'un sculptie et le fait apparaître à l'envers."/> - <text name="label sculpt type"> - Type de raccord - </text> - <combo_box name="sculpt type control"> - <combo_box.item label="(aucun)" name="None"/> - <combo_box.item label="Sphère" name="Sphere"/> - <combo_box.item label="Tore" name="Torus"/> - <combo_box.item label="Plan" name="Plane"/> - <combo_box.item label="Cylindre" name="Cylinder"/> - </combo_box> - </panel> - <panel label="Attributs" name="Features"> - <text name="select_single"> - Sélectionnez un prim pour modifier les attributs. - </text> - <text name="edit_object"> - Modifier les attributs de l'objet : - </text> - <check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l'objet de la souplesse sur l'axe des Z (côté client uniquement)."/> - <spinner label="Souplesse" name="FlexNumSections"/> - <spinner label="Gravité" name="FlexGravity"/> - <spinner label="Élasticité" name="FlexFriction"/> - <spinner label="Vent" name="FlexWind"/> - <spinner label="Tension" name="FlexTension"/> - <spinner label="Force X" name="FlexForceX"/> - <spinner label="Force Y" name="FlexForceY"/> - <spinner label="Force Z" name="FlexForceZ"/> - <check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d'émettre de la lumière"/> - <color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> - <spinner label="Intensité" name="Light Intensity"/> - <spinner label="Portée" name="Light Radius"/> - <spinner label="Atténuation" name="Light Falloff"/> - </panel> - <panel label="Texture" name="Texture"> - <panel.string name="string repeats per meter"> - Répétitions au mètre - </panel.string> - <panel.string name="string repeats per face"> - Répétitions par face - </panel.string> - <texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/> - <text name="color trans" width="88"> - Transparence - </text> - <text name="glow label"> - Rayonnement - </text> - <check_box label="Lumineux" name="checkbox fullbright"/> - <text name="tex gen"> - Application - </text> - <combo_box name="combobox texgen"> - <combo_box.item label="Défaut" name="Default"/> - <combo_box.item label="Planar" name="Planar"/> - </combo_box> - <text name="label shininess"> - Brillance - </text> - <combo_box name="combobox shininess"> - <combo_box.item label="Aucune" name="None"/> - <combo_box.item label="Faible" name="Low"/> - <combo_box.item label="Moyenne" name="Medium"/> - <combo_box.item label="Élevée" name="High"/> - </combo_box> - <text name="label bumpiness"> - Relief - </text> - <combo_box name="combobox bumpiness"> - <combo_box.item label="Aucun" name="None"/> - <combo_box.item label="Luminosité" name="Brightness"/> - <combo_box.item label="Obscurité" name="Darkness"/> - <combo_box.item label="Aggloméré" name="woodgrain"/> - <combo_box.item label="Écorce" name="bark"/> - <combo_box.item label="Briques" name="bricks"/> - <combo_box.item label="Damier" name="checker"/> - <combo_box.item label="Béton" name="concrete"/> - <combo_box.item label="Carrelage" name="crustytile"/> - <combo_box.item label="Pierre de taille" name="cutstone"/> - <combo_box.item label="Disques" name="discs"/> - <combo_box.item label="Gravier" name="gravel"/> - <combo_box.item label="Boîte de Petri" name="petridish"/> - <combo_box.item label="Lattes" name="siding"/> - <combo_box.item label="Carreaux" name="stonetile"/> - <combo_box.item label="Stuc" name="stucco"/> - <combo_box.item label="Ventouses" name="suction"/> - <combo_box.item label="Tissage" name="weave"/> - </combo_box> - <text name="tex scale"> - Répétitions par face - </text> - <spinner label="Horizontal (U)" name="TexScaleU"/> - <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="Repeats / Meter" left="122" name="rptctrl" width="58"/> - <button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/> - <text name="tex offset"> - Décalage de la texture - </text> - <spinner label="Horizontal (U)" name="TexOffsetU"/> - <spinner label="Vertical (V)" name="TexOffsetV"/> - </panel> - <panel label="Contenu" name="Contents"> - <button label="Nouveau script" label_selected="Nouveau script" name="button new script"/> - <button label="Droits" name="button permissions"/> - </panel> - </tab_container> - <panel name="land info panel"> - <text name="label_parcel_info"> - Informations sur la parcelle - </text> - <text name="label_area_price"> - Prix : [PRICE] L$ pour [AREA] m². - </text> - <text name="label_area"> - Surface : [AREA] m² - </text> - <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="Colorie les parcelles en fonction 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 - </text> - <button label="Diviser" label_selected="Diviser" name="button subdivide land" width="142"/> - <button label="Fusionner" label_selected="Fusionner" name="button join land" width="142"/> - <text name="label_parcel_trans"> - Transactions - </text> - <button label="Acheter le terrain" label_selected="Acheter le terrain" name="button buy land" width="142"/> - <button label="Abandonner le terrain" label_selected="Abandonner le terrain" name="button abandon land" width="142"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="toolbox floater" short_title="Outils de construction" title=""> + <floater.string name="status_rotate"> + Pour faire tourner l'objet, faîtes glisser les bandes de couleur. + </floater.string> + <floater.string name="status_scale"> + Pour étirer le côté sélectionné, cliquez et faites glisser. + </floater.string> + <floater.string name="status_move"> + Glissez pour déplacer, Maj-glissez pour copier. + </floater.string> + <floater.string name="status_modifyland"> + Cliquez et maintenez pour modifier le terrain. + </floater.string> + <floater.string name="status_camera"> + Cliquez et faîtes glisser pour bouger la caméra + </floater.string> + <floater.string name="status_grab"> + Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter. + </floater.string> + <floater.string name="status_place"> + Cliquez dans le monde pour construire. + </floater.string> + <floater.string name="status_selectland"> + Cliquez et faites glisser pour sélectionner le terrain. + </floater.string> + <floater.string name="grid_screen_text"> + Écran + </floater.string> + <floater.string name="grid_local_text"> + Local + </floater.string> + <floater.string name="grid_world_text"> + Monde + </floater.string> + <floater.string name="grid_reference_text"> + Référence + </floater.string> + <floater.string name="grid_attachment_text"> + 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"/> + <button label="" label_selected="" name="button edit" tool_tip="Modifier"/> + <button label="" label_selected="" name="button create" tool_tip="Créer"/> + <button label="" label_selected="" name="button land" tool_tip="Terrain"/> + <text name="text status"> + Glissez pour déplacer, Maj-glissez pour copier. + </text> + <radio_group name="focus_radio_group"> + <radio_item label="Zoom" name="radio zoom"/> + <radio_item label="Orbite (Ctrl)" name="radio orbit"/> + <radio_item label="Panoramique (Ctrl-Maj)" name="radio pan"/> + </radio_group> + <radio_group name="move_radio_group"> + <radio_item label="Déplacer" name="radio move"/> + <radio_item label="Orbite (Ctrl)" name="radio lift"/> + <radio_item label="Faire tourner (Ctrl-Maj)" name="radio spin"/> + </radio_group> + <radio_group name="edit_radio_group"> + <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_group> + <check_box label="Modification liée" name="checkbox edit linked parts"/> + <check_box label="Étirer les deux côtés" name="checkbox uniform"/> + <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"> + <combo_box.item label="Axe du monde" name="World"/> + <combo_box.item label="Axe local" name="Local"/> + <combo_box.item label="Axe de référence" name="Reference"/> + </combo_box> + <button label="Options..." label_selected="Options..." name="Options..." tool_tip="Définir les options de la grille"/> + <button label="" label_selected="" name="ToolCube" tool_tip="Cube"/> + <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/> + <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> + <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/> + <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/> + <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/> + <button label="" label_selected="" name="ToolCone" tool_tip="Cône"/> + <button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/> + <button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/> + <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/> + <button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/> + <button label="" label_selected="" name="ToolTube" tool_tip="Tube"/> + <button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/> + <button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/> + <button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/> + <check_box label="Maintenir l'outil sélectionné" name="checkbox sticky"/> + <check_box label="Copier la sélection" name="checkbox copy selection"/> + <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="Aplatir" name="radio flatten"/> + <radio_item label="Élever" name="radio raise"/> + <radio_item label="Abaisser" name="radio lower"/> + <radio_item label="Lisser" name="radio smooth"/> + <radio_item label="Bosseler" name="radio noise"/> + <radio_item label="Annuler modification" name="radio revert"/> + </radio_group> + <text name="Bulldozer:"> + Bulldozer : + </text> + <text name="Dozer Size:"> + Taille + </text> + <text name="Strength:"> + Force + </text> + <button label="Appliquer" label_selected="Appliquer" left="176" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/> + <text name="obj_count"> + Objets : [COUNT] + </text> + <text name="prim_count"> + Prims : [COUNT] + </text> + <tab_container name="Object Info Tabs"> + <panel label="Général" name="General"> + <panel.string name="text deed continued"> + Céder + </panel.string> + <panel.string name="text deed"> + Transférer + </panel.string> + <panel.string name="text modify info 1"> + Vous pouvez modifier cet objet + </panel.string> + <panel.string name="text modify info 2"> + Vous pouvez modifier ces objets + </panel.string> + <panel.string name="text modify info 3"> + Vous ne pouvez pas modifier cet objet + </panel.string> + <panel.string name="text modify info 4"> + Vous ne pouvez pas modifier ces objets + </panel.string> + <panel.string name="text modify warning"> + Sélectionnez l'objet en entier + </panel.string> + <panel.string name="Cost Default"> + Prix : L$ + </panel.string> + <panel.string name="Cost Total"> + Prix total : L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Prix par : L$ + </panel.string> + <panel.string name="Cost Mixed"> + Prix mixte + </panel.string> + <panel.string name="Sale Mixed"> + Vente mixte + </panel.string> + <text name="Name:"> + Nom : + </text> + <text name="Description:"> + Description : + </text> + <text name="Creator:"> + Créateur : + </text> + <text name="Creator Name"> + Thrax Linden + </text> + <text name="Owner:"> + Propriétaire : + </text> + <text name="Owner Name"> + Thrax Linden + </text> + <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"/> + <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."/> + <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 : + </text> + <combo_box name="clickaction" width="178"> + <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/> + <combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/> + <combo_box.item label="Acheter l'objet" name="Buyobject"/> + <combo_box.item label="Payer l'objet" name="Payobject"/> + <combo_box.item label="Ouvrir" name="Open"/> + </combo_box> + <check_box label="À vendre :" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Copie" name="Copy"/> + <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 la recherche" name="search_check" tool_tip="Afficher l'objet dans les résultats de recherche"/> + <panel name="perms_build"> + <text name="perm_modify"> + Vous pouvez modifier cet objet + </text> + <text name="Anyone can:"> + N'importe qui : + </text> + <check_box label="Copier" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + Le prochain propriétaire : + </text> + <check_box label="Modifier" name="checkbox next owner can modify"/> + <check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/> + <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> + <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="Objet" name="Object"> + <check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l'objet d'être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/> + <check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l'objet d'être poussé et affecté par la gravité"/> + <check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L'objet est supprimé 1 mn après sa création."/> + <check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l'objet de ne pas entrer en collision avec d'autres objets ou avatars."/> + <text name="label position"> + Position (mètres) + </text> + <spinner label="X" name="Pos X"/> + <spinner label="Y" name="Pos Y"/> + <spinner label="Z" name="Pos Z"/> + <text name="label size"> + Taille (mètres) + </text> + <spinner label="X" name="Scale X"/> + <spinner label="Y" name="Scale Y"/> + <spinner label="Z" name="Scale Z"/> + <text name="label rotation"> + Rotation (degrés) + </text> + <spinner label="X" name="Rot X"/> + <spinner label="Y" name="Rot Y"/> + <spinner label="Z" name="Rot Z"/> + <combo_box name="comboBaseType"> + <combo_box.item label="Boîte" name="Box"/> + <combo_box.item label="Cylindre" name="Cylinder"/> + <combo_box.item label="Prisme" name="Prism"/> + <combo_box.item label="Sphère" name="Sphere"/> + <combo_box.item label="Tore" name="Torus"/> + <combo_box.item label="Tube" name="Tube"/> + <combo_box.item label="Anneau" name="Ring"/> + <combo_box.item label="Sculptie" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="Pierre" name="Stone"/> + <combo_box.item label="Métal" name="Metal"/> + <combo_box.item label="Verre" name="Glass"/> + <combo_box.item label="Bois" name="Wood"/> + <combo_box.item label="Chair" name="Flesh"/> + <combo_box.item label="Plastique" name="Plastic"/> + <combo_box.item label="Caoutchouc" name="Rubber"/> + </combo_box> + <text name="text cut"> + Découpe du tracé (début/fin) + </text> + <spinner label="D" name="cut begin"/> + <spinner label="F" name="cut end"/> + <text name="text hollow"> + Creux + </text> + <text name="text skew"> + Biais + </text> + <text name="Hollow Shape"> + Forme du creux + </text> + <combo_box name="hole"> + <combo_box.item label="Défaut" name="Default"/> + <combo_box.item label="Cercle" name="Circle"/> + <combo_box.item label="Carré" name="Square"/> + <combo_box.item label="Triangle" name="Triangle"/> + </combo_box> + <text name="text twist"> + Vrille (début/fin) + </text> + <spinner label="D" name="Twist Begin"/> + <spinner label="F" name="Twist End"/> + <text name="scale_taper"> + Biseautage + </text> + <text name="scale_hole"> + Taille du trou + </text> + <spinner label="X" name="Taper Scale X"/> + <spinner label="Y" name="Taper Scale Y"/> + <text name="text topshear"> + Inclinaison + </text> + <spinner label="X" name="Shear X"/> + <spinner label="Y" name="Shear Y"/> + <text name="advanced_cut"> + Découpe du profilé (début/fin) + </text> + <text name="advanced_dimple"> + Creux (début/fin) + </text> + <text name="advanced_slice"> + Tranche (début/fin) + </text> + <spinner label="D" name="Path Limit Begin"/> + <spinner label="F" name="Path Limit End"/> + <text name="text taper2"> + Biseautage + </text> + <spinner label="X" name="Taper X"/> + <spinner label="Y" name="Taper Y"/> + <text name="text radius delta"> + Rayon + </text> + <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="Retourne le sculptie le long de l'axe des X."/> + <check_box label="A l'envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d'un sculptie et le fait apparaître à l'envers."/> + <text name="label sculpt type"> + Type de raccord + </text> + <combo_box name="sculpt type control"> + <combo_box.item label="(aucun)" name="None"/> + <combo_box.item label="Sphère" name="Sphere"/> + <combo_box.item label="Tore" name="Torus"/> + <combo_box.item label="Plan" name="Plane"/> + <combo_box.item label="Cylindre" name="Cylinder"/> + </combo_box> + </panel> + <panel label="Attributs" name="Features"> + <text name="select_single"> + Sélectionnez un prim pour modifier les attributs. + </text> + <text name="edit_object"> + Modifier les attributs de l'objet : + </text> + <check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l'objet de la souplesse sur l'axe des Z (côté client uniquement)."/> + <spinner label="Souplesse" name="FlexNumSections"/> + <spinner label="Gravité" name="FlexGravity"/> + <spinner label="Élasticité" name="FlexFriction"/> + <spinner label="Vent" name="FlexWind"/> + <spinner label="Tension" name="FlexTension"/> + <spinner label="Force X" name="FlexForceX"/> + <spinner label="Force Y" name="FlexForceY"/> + <spinner label="Force Z" name="FlexForceZ"/> + <check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d'émettre de la lumière"/> + <color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <spinner label="Intensité" name="Light Intensity"/> + <spinner label="Portée" name="Light Radius"/> + <spinner label="Atténuation" name="Light Falloff"/> + </panel> + <panel label="Texture" name="Texture"> + <panel.string name="string repeats per meter"> + Répétitions au mètre + </panel.string> + <panel.string name="string repeats per face"> + Répétitions par face + </panel.string> + <texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/> + <color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/> + <text name="color trans" width="88"> + Transparence + </text> + <text name="glow label"> + Rayonnement + </text> + <check_box label="Lumineux" name="checkbox fullbright"/> + <text name="tex gen"> + Application + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Défaut" name="Default"/> + <combo_box.item label="Planar" name="Planar"/> + </combo_box> + <text name="label shininess"> + Brillance + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Aucune" name="None"/> + <combo_box.item label="Faible" name="Low"/> + <combo_box.item label="Moyenne" name="Medium"/> + <combo_box.item label="Élevée" name="High"/> + </combo_box> + <text name="label bumpiness"> + Relief + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Aucun" name="None"/> + <combo_box.item label="Luminosité" name="Brightness"/> + <combo_box.item label="Obscurité" name="Darkness"/> + <combo_box.item label="Aggloméré" name="woodgrain"/> + <combo_box.item label="Écorce" name="bark"/> + <combo_box.item label="Briques" name="bricks"/> + <combo_box.item label="Damier" name="checker"/> + <combo_box.item label="Béton" name="concrete"/> + <combo_box.item label="Carrelage" name="crustytile"/> + <combo_box.item label="Pierre de taille" name="cutstone"/> + <combo_box.item label="Disques" name="discs"/> + <combo_box.item label="Gravier" name="gravel"/> + <combo_box.item label="Boîte de Petri" name="petridish"/> + <combo_box.item label="Lattes" name="siding"/> + <combo_box.item label="Carreaux" name="stonetile"/> + <combo_box.item label="Stuc" name="stucco"/> + <combo_box.item label="Ventouses" name="suction"/> + <combo_box.item label="Tissage" name="weave"/> + </combo_box> + <text name="tex scale"> + Répétitions par face + </text> + <spinner label="Horizontal (U)" name="TexScaleU"/> + <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="Repeats / Meter" left="122" name="rptctrl" width="58"/> + <button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/> + <text name="tex offset"> + Décalage de la texture + </text> + <spinner label="Horizontal (U)" name="TexOffsetU"/> + <spinner label="Vertical (V)" name="TexOffsetV"/> + </panel> + <panel label="Contenu" name="Contents"> + <button label="Nouveau script" label_selected="Nouveau script" name="button new script"/> + <button label="Droits" name="button permissions"/> + </panel> + </tab_container> + <panel name="land info panel"> + <text name="label_parcel_info"> + Informations sur la parcelle + </text> + <text name="label_area_price"> + Prix : [PRICE] L$ pour [AREA] m². + </text> + <text name="label_area"> + Surface : [AREA] m² + </text> + <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="Colorie les parcelles en fonction 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 + </text> + <button label="Diviser" label_selected="Diviser" name="button subdivide land" width="142"/> + <button label="Fusionner" label_selected="Fusionner" name="button join land" width="142"/> + <text name="label_parcel_trans"> + Transactions + </text> + <button label="Acheter le terrain" label_selected="Acheter le terrain" name="button buy land" width="142"/> + <button label="Abandonner le terrain" label_selected="Abandonner le terrain" name="button abandon land" width="142"/> + </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 993f2bd5e432aebc098f0fe742ee3a4a9d9b5dab..7ee3ce957ac40a0330038eb3c8db11c452026fce 100644 --- a/indra/newview/skins/default/xui/fr/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml @@ -1,16 +1,16 @@ -<?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"> - [ACCTTYPE], [PAYMENTINFO] -Profil : [SL_PROFILE] - </string> - <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> - <button label="Devenir amis" name="add_friend_btn"/> -</floater> +<?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"> + [ACCTTYPE], [PAYMENTINFO] +Profil : [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> + <button label="Devenir amis" name="add_friend_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml index ba2559a9a114648aa52f55ddf52331d0e306d6a6..8f3dfae86eca500401070f8cf0b55f77ab3089ba 100644 --- a/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Avatar Icon Menu"> - <menu_item_call label="Voir le profil..." name="Show Profile"/> - <menu_item_call label="Envoyer IM..." name="Send IM"/> - <menu_item_call label="Devenir amis..." name="Add Friend"/> - <menu_item_call label="Supprimer cet ami..." name="Remove Friend"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Voir le profil..." name="Show Profile"/> + <menu_item_call label="Envoyer IM..." name="Send IM"/> + <menu_item_call label="Devenir amis..." name="Add Friend"/> + <menu_item_call label="Supprimer cet ami..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_favorites.xml b/indra/newview/skins/default/xui/fr/menu_favorites.xml index 663df9449ace5880794298f63fd26bad4097443d..5f1545fde7ff350dd5ed696c25b6dbb0d0bfee2f 100644 --- a/indra/newview/skins/default/xui/fr/menu_favorites.xml +++ b/indra/newview/skins/default/xui/fr/menu_favorites.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="Téléporter" name="Teleport To Landmark"/> - <menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/> - <menu_item_call label="Copier la SLurl" name="Copy slurl"/> - <menu_item_call label="Voir sur la carte" name="Show On Map"/> - <menu_item_call label="Copier" name="Landmark Copy"/> - <menu_item_call label="Coller" name="Landmark Paste"/> - <menu_item_call label="Supprimer" name="Delete"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Téléporter" name="Teleport To Landmark"/> + <menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/> + <menu_item_call label="Copier la SLurl" name="Copy slurl"/> + <menu_item_call label="Voir sur la carte" name="Show On Map"/> + <menu_item_call label="Copier" name="Landmark Copy"/> + <menu_item_call label="Coller" name="Landmark Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> +</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 e4ad89751f5f02999ac02e7167a74ae5bea720fc..f5882261b08222102278416b88c6710da5fc2e62 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="Nouveau groupe..." name="item_new"/> -</menu> +<?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="Nouveau groupe..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml index c3c931ad5c3f29dbfe56f4ac8f14ccfcaf6b2a62..4e2cb044989aaf271547bdda8599b0c12831d340 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml @@ -1,76 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="Acheter" name="Task Buy"/> - <menu_item_call label="Ouvrir" name="Task Open"/> - <menu_item_call label="Jouer" name="Task Play"/> - <menu_item_call label="Propriétés" name="Task Properties"/> - <menu_item_call label="Renommer" name="Task Rename"/> - <menu_item_call label="Supprimer" name="Task Remove"/> - <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_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="Nouveau tricot" name="New Undershirt"/> - <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/> - </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 label="Changer de type" name="Change Type"> - <menu_item_call label="Défaut" name="Default"/> - <menu_item_call label="Gants" name="Gloves"/> - <menu_item_call label="Veste" name="Jacket"/> - <menu_item_call label="Pantalon" name="Pants"/> - <menu_item_call label="Silhouette" name="Shape"/> - <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> - <menu_item_call label="Téléporter" name="Landmark Open"/> - <menu_item_call label="Ouvrir" name="Animation Open"/> - <menu_item_call label="Ouvrir" name="Sound Open"/> - <menu_item_call label="Purger l'objet" name="Purge Item"/> - <menu_item_call label="Restaurer l'objet" name="Restore Item"/> - <menu_item_call label="Ouvrir" name="Open"/> - <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"/> - <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="Enlever les objets" name="Take Off Items"/> - <menu_item_call label="Ajouter à l'ensemble" name="Add To Outfit"/> - <menu_item_call label="Remplacer l'ensemble" name="Replace Outfit"/> - <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="Jouer dans le Monde" 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..."/> - <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/> - <menu_item_call label="Activer" name="Activate"/> - <menu_item_call label="Désactiver" name="Deactivate"/> - <menu_item_call label="Détacher de vous" name="Detach From Yourself"/> - <menu_item_call label="Porter" name="Object Wear"/> - <menu label="Attacher à " name="Attach To"/> - <menu label="Attacher au HUD " name="Attach To HUD"/> - <menu_item_call label="Éditer" name="Wearable Edit"/> - <menu_item_call label="Porter" name="Wearable Wear"/> - <menu_item_call label="Enlever" name="Take Off"/> - <menu_item_call label="--aucune option--" name="--no options--"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Acheter" name="Task Buy"/> + <menu_item_call label="Ouvrir" name="Task Open"/> + <menu_item_call label="Jouer" name="Task Play"/> + <menu_item_call label="Propriétés" name="Task Properties"/> + <menu_item_call label="Renommer" name="Task Rename"/> + <menu_item_call label="Supprimer" name="Task Remove"/> + <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_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="Nouveau tricot" name="New Undershirt"/> + <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/> + </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 label="Changer de type" name="Change Type"> + <menu_item_call label="Défaut" name="Default"/> + <menu_item_call label="Gants" name="Gloves"/> + <menu_item_call label="Veste" name="Jacket"/> + <menu_item_call label="Pantalon" name="Pants"/> + <menu_item_call label="Silhouette" name="Shape"/> + <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> + <menu_item_call label="Téléporter" name="Landmark Open"/> + <menu_item_call label="Ouvrir" name="Animation Open"/> + <menu_item_call label="Ouvrir" name="Sound Open"/> + <menu_item_call label="Purger l'objet" name="Purge Item"/> + <menu_item_call label="Restaurer l'objet" name="Restore Item"/> + <menu_item_call label="Ouvrir" name="Open"/> + <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"/> + <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="Enlever les objets" name="Take Off Items"/> + <menu_item_call label="Ajouter à l'ensemble" name="Add To Outfit"/> + <menu_item_call label="Remplacer l'ensemble" name="Replace Outfit"/> + <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="Jouer dans le Monde" 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..."/> + <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/> + <menu_item_call label="Activer" name="Activate"/> + <menu_item_call label="Désactiver" name="Deactivate"/> + <menu_item_call label="Détacher de vous" name="Detach From Yourself"/> + <menu_item_call label="Porter" name="Object Wear"/> + <menu label="Attacher à " name="Attach To"/> + <menu label="Attacher au HUD " name="Attach To HUD"/> + <menu_item_call label="Éditer" name="Wearable Edit"/> + <menu_item_call label="Porter" name="Wearable Wear"/> + <menu_item_call label="Enlever" name="Take Off"/> + <menu_item_call label="--aucune option--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_landmark.xml b/indra/newview/skins/default/xui/fr/menu_landmark.xml index d887fb0f399e234310940952bcbc086a4feb06a4..dfa794960e4d264d777b9d522a7eefd357e80348 100644 --- a/indra/newview/skins/default/xui/fr/menu_landmark.xml +++ b/indra/newview/skins/default/xui/fr/menu_landmark.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<toggleable_menu name="landmark_overflow_menu"> - <menu_item_call label="Copier la SLurl" name="copy"/> - <menu_item_call label="Supprimer" name="delete"/> - <menu_item_call label="Créer un Favori" name="pick"/> -</toggleable_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Copier la SLurl" name="copy"/> + <menu_item_call label="Supprimer" name="delete"/> + <menu_item_call label="Créer un Favori" name="pick"/> +</toggleable_menu> 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 5ab5f56ec59b5d1b46deae975bdc8a51c0dc07cb..219eb4ad4cd2d596ab1d61b022bcf44f67647e47 100644 --- a/indra/newview/skins/default/xui/fr/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/fr/menu_mini_map.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<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"/> - <menu_item_call label="Arrêter de suivre" name="Stop Tracking"/> - <menu_item_call label="Carte du monde" name="World Map"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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"/> + <menu_item_call label="Arrêter de suivre" name="Stop Tracking"/> + <menu_item_call label="Carte du monde" name="World Map"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_navbar.xml b/indra/newview/skins/default/xui/fr/menu_navbar.xml index ce48f8e61710f571f5298cc2f66988e8bb4ffd76..1b11dcbb0cf3d6131d634b6735af828c7139182b 100644 --- a/indra/newview/skins/default/xui/fr/menu_navbar.xml +++ b/indra/newview/skins/default/xui/fr/menu_navbar.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Navbar Menu"> - <menu_item_check label="Voir les coordonnées" name="Show Coordinates"/> - <menu_item_call label="Repère" name="Landmark"/> - <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="Tout sélectionner" name="Select All"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Voir les coordonnées" name="Show Coordinates"/> + <menu_item_call label="Repère" name="Landmark"/> + <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="Tout sélectionner" name="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_picks.xml b/indra/newview/skins/default/xui/fr/menu_picks.xml index 6fcb85705402c9239da6f1381184157693517ce1..adb1cec8f5663f9a640d0afeaa76bba41454ea6f 100644 --- a/indra/newview/skins/default/xui/fr/menu_picks.xml +++ b/indra/newview/skins/default/xui/fr/menu_picks.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Picks"> - <menu_item_call label="Infos" name="pick_info"/> - <menu_item_call label="Éditer" name="pick_edit"/> - <menu_item_call label="Téléporter" name="pick_teleport"/> - <menu_item_call label="Carte" name="pick_map"/> - <menu_item_call label="Supprimer" name="pick_delete"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Infos" name="pick_info"/> + <menu_item_call label="Éditer" name="pick_edit"/> + <menu_item_call label="Téléporter" name="pick_teleport"/> + <menu_item_call label="Carte" name="pick_map"/> + <menu_item_call label="Supprimer" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_place.xml b/indra/newview/skins/default/xui/fr/menu_place.xml index 85d8d3398265f1787785b1653d9e61d369a3105f..9928e302a019472cd075d6fbeb325526a025699d 100644 --- a/indra/newview/skins/default/xui/fr/menu_place.xml +++ b/indra/newview/skins/default/xui/fr/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="Enregistrer comme repère" name="landmark"/> - <menu_item_call label="Créer un Favori" name="pick"/> - <menu_item_call label="Acheter un pass" name="pass"/> - <menu_item_call label="Éditer" name="edit"/> -</toggleable_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Enregistrer comme repère" name="landmark"/> + <menu_item_call label="Créer un Favori" name="pick"/> + <menu_item_call label="Acheter un pass" name="pass"/> + <menu_item_call label="Éditer" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_slurl.xml b/indra/newview/skins/default/xui/fr/menu_slurl.xml index 055be714cf3963ce2976bce009fe5c1121fb9f4e..ddfa5c0849c435c77139be7852942d804388de2d 100644 --- a/indra/newview/skins/default/xui/fr/menu_slurl.xml +++ b/indra/newview/skins/default/xui/fr/menu_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="À propos de l'URL" name="about_url"/> - <menu_item_call label="Téléporter vers l'URL" name="teleport_to_url"/> - <menu_item_call label="Carte" name="show_on_map"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="À propos de l'URL" name="about_url"/> + <menu_item_call label="Téléporter vers l'URL" name="teleport_to_url"/> + <menu_item_call label="Carte" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_agent.xml b/indra/newview/skins/default/xui/fr/menu_url_agent.xml index 76a573cfd5770a709a877ab4e616e827aa5f5146..816070cf3a2fa52de564240f1446ccab4ea05197 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/fr/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="Voir le profil du résident" name="show_agent"/> - <menu_item_call label="Copier le nom dans le presse-papier" name="url_copy_label"/> - <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Voir le profil du résident" name="show_agent"/> + <menu_item_call label="Copier le nom dans le presse-papier" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_group.xml b/indra/newview/skins/default/xui/fr/menu_url_group.xml index 4615ad0939b81d6a01efeb05bbc0c2a90da921cf..f16a91cf7b92094721f384c155556470e5108404 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_group.xml +++ b/indra/newview/skins/default/xui/fr/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="Voir le profil du groupe" name="show_group"/> - <menu_item_call label="Copier le groupe dans le presse-papier" name="url_copy_label"/> - <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Voir le profil du groupe" name="show_group"/> + <menu_item_call label="Copier le groupe dans le presse-papier" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_http.xml b/indra/newview/skins/default/xui/fr/menu_url_http.xml index 27bcb91f7e9038643368bbfc0d60634c47d18be8..15db7900b32d628e82871ac36d81113e89a80137 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_http.xml +++ b/indra/newview/skins/default/xui/fr/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="Ouvrir la page Web" name="url_open"/> - <menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/> - <menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/> - <menu_item_call label="Copier l'URL dans le presse-papier" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ouvrir la page Web" name="url_open"/> + <menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/> + <menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/> + <menu_item_call label="Copier l'URL dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml index 50bd5b4f747dc1fa8c1f1b305c2945b9c27f0c57..69449538d876dff87eeace756fd113ab9ee8a0d1 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="Afficher les informations sur l'objet" name="show_object"/> - <menu_item_call label="Me téléporter à l'endroit de l'objet" name="teleport_to_object"/> - <menu_item_call label="Copier le nom de l'objet dans le presse-papier" name="url_copy_label"/> - <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur l'objet" name="show_object"/> + <menu_item_call label="Me téléporter à l'endroit de l'objet" name="teleport_to_object"/> + <menu_item_call label="Copier le nom de l'objet dans le presse-papier" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_parcel.xml b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml index 1f30203a434e9381b728bfc6cee9a554c9be9b0f..7d77b35036f1fbc063427b0a79444234c62a27b1 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/> - <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_slurl.xml b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml index 143da035330cff0415f7c9d6d7040f572b439f59..70564a67688d55cc34c97455de4690b11ad282c7 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/> - <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/> - <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/> + <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_teleport.xml b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml index a32ce65ec155a21b33b6a2ac5c6f1d9cdb165175..4aaaf34408aae0f794ba6d2c480a25271130c0f7 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="Me téléporter à cet endroit." name="teleport"/> - <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Me téléporter à cet endroit." name="teleport"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index ea28b82d7e0c72bbf0c575730ab19cd690611fe8..532714531b1937b7c7d077030cc213c7cd514891 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> + <menu name="Me"> + <menu_item_call label="Préférences" 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=fr" /> + </menu_item_call> + </menu> <menu label="Fichier" name="File"> <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> <menu label="Importer" name="upload"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 8832550add5d3418b47d86313702fa519ef4857a..558b04d68e3c65b16e02f7f03ec46a73047a0657 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -1,2547 +1,2544 @@ -<?xml version="1.0" encoding="utf-8"?> -<notifications> - <global name="skipnexttime"> - Ne plus afficher - </global> - <global name="alwayschoose"> - Toujours choisir cette option - </global> - <global name="implicitclosebutton"> - Fermer - </global> - <template name="okbutton"> - <form> - <button name="OK" text="$yestext"/> - </form> - </template> - <template name="okignore"/> - <template name="okcancelbuttons"> - <form> - <button name="Cancel" text="$notext"/> - </form> - </template> - <template name="okcancelignore"/> - <template name="okhelpbuttons"> - <form> - <button name="Help" text="$helptext"/> - </form> - </template> - <template name="yesnocancelbuttons"> - <form> - <button name="Yes" text="$yestext"/> - <button name="No" text="$notext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="Message d'alerte inconnu" name="MissingAlert"> - Votre version de [APP_NAME] ne peut afficher ce message d'erreur. Veuillez vous assurer que vous avez bien la toute dernière version du client. - -Détails de l'erreur : L'alerte, appelée '[_NAME]' est introuvable dans notifications.xml. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FloaterNotFound"> - Erreur floater : impossible de trouver les contrôles suivants : - -[CONTROLS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TutorialNotFound"> - Aucun didacticiel n'est disponible actuellement. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GenericAlert"> - [MESSAGE] - </notification> - <notification name="GenericAlertYesCancel"> - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="BadInstallation"> - Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version su client. http://get.secondlife.com - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LoginFailedNoNetwork"> - Connexion à [SECOND_LIFE_GRID] impossible. -'[DIAGNOSTIC]' -Veuillez vérifier votre connexion Internet. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MessageTemplateNotFound"> - Le modèle de message [PATH] est introuvable. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="WearableSave"> - Enregistrer les changements dans la partie du corps/les habits actuels ? - <usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> - </notification> - <notification name="CompileQueueSaveText"> - Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. - </notification> - <notification name="CompileQueueSaveBytecode"> - Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. - </notification> - <notification name="WriteAnimationFail"> - Une erreur est survenue lors de l'écriture des données d'animation. Veuillez réessayer ultérieurement. - </notification> - <notification name="UploadAuctionSnapshotFail"> - Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON] - </notification> - <notification name="UnableToViewContentsMoreThanOne"> - Impossible d'afficher les contenus de plus d'un objet à la fois. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification name="SaveClothingBodyChanges"> - 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="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] ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="GrantModifyRightsMultiple"> - Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer 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 aux résidents selectionnés ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="RevokeModifyRights"> - Souhaitez-vous retirer les droits d'édition à [FIRST_NAME] [LAST_NAME] ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="RevokeModifyRightsMultiple"> - Souhaitez-vous retirer les droits d'édition aux résidents selectionnés ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="UnableToCreateGroup"> - Impossible de créer le groupe. -[MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PanelGroupApply"> - [NEEDS_APPLY_MESSAGE] -[WANT_APPLY_MESSAGE] - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ignorer les modifications" yestext="Enregistrer les modifications"/> - </notification> - <notification name="MustSpecifyGroupNoticeSubject"> - Pour envoyer une notice au groupe, vous devez indiquer un sujet. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AddGroupOwnerWarning"> - Vous êtes sur le point d'ajouter des membres du groupe dans le rôle de [ROLE_NAME]. -Les membres ne peuvent pas être destitués de ce rôle. -Ils doivent donner eux-mêmes leur démission. -Êtes-vous certain de vouloir continuer ? - <usetemplate ignoretext="Confirmer avant d'ajouter un nouveau propriétaire" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="AssignDangerousActionWarning"> - Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». - *Avertissement* - Tout membre disposant de ce pouvoir peut s'affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d'attribuer ce pouvoir. - -Ajouter ce pouvoir à « [ROLE_NAME] » ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="AssignDangerousAbilityWarning"> - Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». - - *Avertissement* - Tout membre dans un rôle avec ce pouvoir peut s'attribuer à lui-même, ainsi qu'à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. - -Ajouter ce pouvoir à « [ROLE_NAME] » ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="JoinGroupCanAfford"> - Rejoindre ce groupe coûte [COST] L$. -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. - </notification> - <notification name="CreateGroupCost"> - La création de ce groupe coûte 100 L$. -Les groupes doivent comporter plus d'un membre, sinon ils sont supprimés. -Veuillez inviter des membres d'ici 48 heures. - <usetemplate canceltext="Annuler" name="okcancelbuttons" notext="Annuler" yestext="Créer un groupe pour 100 L$"/> - </notification> - <notification name="LandBuyPass"> - Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SalePriceRestriction"> - Pour rendre l'annonce disponible à tous, le prix de vente doit être supérieur à 0 L$. -Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique. - </notification> - <notification name="ConfirmLandSaleChange"> - Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. -Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmLandSaleToAnyoneChange"> - Attention : en cliquant sur Vendre à n'importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région. - -Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. -Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsDeededToGroup"> - Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l'inventaire du propriétaire précédent ? - -*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedByUser"> - Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ? - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedBySelf"> - Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ? - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedBySelf"> - Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l'inventaire de leur propriétaire ? -Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. - -*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByUser"> - Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l'inventaire de leur propriétaire ? -Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. - -*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnAllTopObjects"> - Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l'inventaire de leur propriétaire ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DisableAllTopObjects"> - Êtes-vous certain de vouloir désactiver tous les objets dans cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByGroup"> - Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ? - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="UnableToDisableOutsideScripts"> - Impossible de désactiver les scripts. -Les dégâts sont autorisés dans toute la région. -Pour que les armes fonctionnent, les scripts doivent être autorisés. - </notification> - <notification name="MustBeInParcel"> - Pour définir le point d'atterrissage, vous devez vous trouver à l'intérieur de la parcelle. - </notification> - <notification name="PromptRecipientEmail"> - Veuillez saisir une adresse e-mail valide pour le(s) destinataire(s). - </notification> - <notification name="PromptSelfEmail"> - Veuillez saisir votre adresse e-mail. - </notification> - <notification name="PromptMissingSubjMsg"> - Envoyer la photo avec le sujet ou le message par défaut ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ErrorProcessingSnapshot"> - Erreur dans le traitement des données de la photo - </notification> - <notification name="ErrorEncodingSnapshot"> - Erreur d'encodage de la photo. - </notification> - <notification name="ErrorUploadingPostcard"> - Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON] - </notification> - <notification name="ErrorUploadingReportScreenshot"> - Une erreur est survenue lors du chargement de la capture d'écran destinée au rapport, suite au problème suivant : [REASON] - </notification> - <notification name="MustAgreeToLogIn"> - Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d'utilisation. - </notification> - <notification name="CouldNotPutOnOutfit"> - Impossible de mettre cet ensemble. -Ce dossier ne contient pas d'habits, de parties du corps ni de pièces jointes. - </notification> - <notification name="CannotWearTrash"> - Vous ne pouvez pas porter d'habits ni de parties du corps se trouvant dans la corbeille. - </notification> - <notification name="CannotWearInfoNotComplete"> - 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. -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 ? - <url name="url"> - http://join.secondlife.com/ - </url> - <usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/> - </notification> - <notification name="AddClassified"> - Les petites annonces sont publiées à l'onglet Petites annonces de la section Recherche pendant une semaine. -Rédigez votre annonce, puis cliquez sur Publier pour l'ajouter à la liste des annonces. -Au moment de cliquer sur Publier, vous serez invité à payer des frais. -Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés. - <usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DeleteClassified"> - Supprimer l'annonce [NAME] ? -Une fois payés, les frais ne sont pas remboursables. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ClassifiedSave"> - Enregistrer les changements dans l'annonce [NAME] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> - </notification> - <notification name="DeleteAvatarPick"> - Supprimer le favori [PICK] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="PromptGoToEventsPage"> - Aller à la page web de [SECOND_LIFE] réservée aux événements ? - <url name="url"> - http://secondlife.com/events/ - </url> - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SelectProposalToView"> - Veuillez sélectionner une proposition. - </notification> - <notification name="SelectHistoryItemToView"> - Veuillez sélectionner un historique. - </notification> - <notification name="ResetShowNextTimeDialogs"> - Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - Voulez-vous désactiver tous les pop-ups qui peuvent être évités ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CacheWillClear"> - Le cache sera vidé après le redémarrage de [APP_NAME]. - </notification> - <notification name="CacheWillBeMoved"> - Le cache sera déplacé après le redémarrage de [APP_NAME]. -Remarque : cela videra le cache. - </notification> - <notification name="ChangeConnectionPort"> - Les paramètres du port prendront effet après le redémarrage de [APP_NAME]. - </notification> - <notification name="ChangeSkin"> - Le nouveau thème apparaîtra après le redémarrage de [APP_NAME]. - </notification> - <notification name="GoToAuctionPage"> - Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ? - <url name="url"> - http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] - </url> - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SaveChanges"> - Enregistrer les changements ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> - </notification> - <notification name="GestureSaveFailedTooManySteps"> - L'enregistrement du geste a échoué. -Il y a trop d'étapes dans ce geste. -Essayez d'en supprimer quelques-unes. - </notification> - <notification name="GestureSaveFailedTryAgain"> - L'enregistrement du geste a échoué. Veuillez réessayer dans une minute. - </notification> - <notification name="GestureSaveFailedObjectNotFound"> - Le geste n'a pas pu être enregistré car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="GestureSaveFailedReason"> - Une erreur est survenue lors de l'enregistrement du geste, suite au problème suivant : [REASON]. Essayez d'enregistrer votre geste ultérieurement. - </notification> - <notification name="SaveNotecardFailObjectNotFound"> - La note n'a pas pu être enregistrée car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="SaveNotecardFailReason"> - Une erreur est survenue lors de l'enregistrement de la note, suite au problème suivant : [REASON]. Essayez d'enregistrer votre note ultérieurement. - </notification> - <notification name="ScriptCannotUndo"> - Impossible d'annuler tous les changements dans votre version du script. -Souhaitez-vous charger la dernière version enregistrée sur le serveur ? -(**Attention** Cette opération est irréversible.) - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SaveScriptFailReason"> - Une erreur est survenue lors de l'enregistrement du script, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. - </notification> - <notification name="SaveScriptFailObjectNotFound"> - Impossible d'enregistrer le script car l'objet qui le contient est introuvable. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="SaveBytecodeFailReason"> - Une erreur est survenue lors de l'enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. - </notification> - <notification name="StartRegionEmpty"> - Vous n'avez pas défini de région de départ. -Veuillez saisir le nom de la région dans la case Lieu de départ, ou choisissez Dernier emplacement ou Domicile comme Lieu de départ. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CouldNotStartStopScript"> - Impossible de lancer ou d'arrêter le script car l'objet qui le contient est introuvable. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="CannotDownloadFile"> - Impossible de télécharger le fichier - </notification> - <notification name="CannotWriteFile"> - 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 section [SUPPORT_SITE] n'offre aucune aide pour les problèmes de configuration système. - -MINSPECS -Voulez-vous visiter [_URL] pour plus d'informations ? - <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 nous ne connaissons pas actuellement. -Cela est souvent le cas avec le nouveau materiel 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. -(Préférences > Graphiques). - <form name="form"> - <ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/> - </form> - </notification> - <notification name="DisplaySettingsNoShaders"> - [APP_NAME] a planté lors de l'initialisation des drivers graphiques. -La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes. -Certaines fonctionnalités graphiques seront donc désactivées. -Nous vous recommandons de mettre à jour les drivers de votre carte graphique. -La qualité des graphiques peut être augmentée à la section Préférences > Graphiques - </notification> - <notification name="RegionNoTerraforming"> - Le terraformage est interdit dans la région [REGION]. - </notification> - <notification name="CannotCopyWarning"> - Vous n'êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="CannotGiveItem"> - Impossible de donner l'objet de l'inventaire. - </notification> - <notification name="TransactionCancelled"> - Transaction annulée. - </notification> - <notification name="TooManyItems"> - Impossible de donner plus de 42 objets au cours d'un seul transfert d'inventaire. - </notification> - <notification name="NoItems"> - Vous n'êtes pas autorisé à transférer les objets sélectionnés. - </notification> - <notification name="CannotCopyCountItems"> - Vous n'êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire. -Souhaitez-vous vraiment donner ces objets ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="CannotGiveCategory"> - Vous n'êtes pas autorisé à transférer le dossier sélectionné. - </notification> - <notification name="FreezeAvatar"> - Geler 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"/> - </notification> - <notification name="FreezeAvatarFullname"> - Geler [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"/> - </notification> - <notification name="EjectAvatarFullname"> - Expulser [AVATAR_NAME] de votre terrain ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Expulser et bannir" yestext="Expulser"/> - </notification> - <notification name="EjectAvatarNoBan"> - Expulser cet avatar de votre terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> - </notification> - <notification name="EjectAvatarFullnameNoBan"> - Expulser [AVATAR_NAME] de votre terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> - </notification> - <notification name="AcquireErrorTooManyObjects"> - Erreur d'acquisition : trop d'objets sélectionnés. - </notification> - <notification name="AcquireErrorObjectSpan"> - Erreur d'acquisition : les objets sont répartis dans plus d'une région. -Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région. - </notification> - <notification name="PromptGoToCurrencyPage"> - [EXTRA] - -Aller sur [_URL] pour obtenir des informations sur l'achat de L$ ? - <url name="url"> - http://secondlife.com/app/currency/ - </url> - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="UnableToLinkObjects"> - Impossible de lier ces [COUNT] objets. -Vous pouvez lier un maximum de [MAX] objets. - </notification> - <notification name="CannotLinkIncompleteSet"> - Vous ne pouvez lier que des ensembles d'objets complets et vous devez choisir un minimum de deux objets. - </notification> - <notification name="CannotLinkModify"> - Impossible de lier car vous n'avez pas le droit de modifier tous les objets. - -Assurez-vous que vous êtes le propriétaire de tous les objets et qu'aucun d'eux n'est verrouillé. - </notification> - <notification name="CannotLinkDifferentOwners"> - Impossible de lier car les objets n'ont pas tous le même propriétaire. - -Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés. - </notification> - <notification name="NoFileExtension"> - Pas d'extension pour le fichier suivant : '[FILE]' - -Assurez-vous que le fichier a l'extension correcte. - </notification> - <notification name="InvalidFileExtension"> - Extension de fichier [EXTENSION] invalide -[VALIDS] attendu - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotUploadSoundFile"> - Impossible de lire le fichier son chargé : -[FILE] - </notification> - <notification name="SoundFileNotRIFF"> - Il semble que le fichier ne soit pas un fichier RIFF WAVE : -[FILE] - </notification> - <notification name="SoundFileNotPCM"> - Il semble que le fichier ne soit pas un fichier audio PCM WAVE : -[FILE] - </notification> - <notification name="SoundFileInvalidChannelCount"> - Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) : -[FILE] - </notification> - <notification name="SoundFileInvalidSampleRate"> - Le fichier ne semble pas être pris en charge (doit être 44,1 k) : -[FILE] - </notification> - <notification name="SoundFileInvalidWordSize"> - Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) : -[FILE] - </notification> - <notification name="SoundFileInvalidHeader"> - Impossible de trouver les données dans l'en-tête WAV : -[FILE] - </notification> - <notification name="SoundFileInvalidTooLong"> - Le fichier audio est trop long (10 secondes maximum) : -[FILE] - </notification> - <notification name="ProblemWithFile"> - Problème avec le fichier [FILE] : - -[ERROR] - </notification> - <notification name="CannotOpenTemporarySoundFile"> - Impossible d'ouvrir le fichier son compressé temporaire : [FILE] - </notification> - <notification name="UnknownVorbisEncodeFailure"> - Échec d'encodage Vorbis inconnu sur : [FILE] - </notification> - <notification name="CannotEncodeFile"> - Impossible d'encoder le fichier : [FILE] - </notification> - <notification name="CorruptResourceFile"> - Fichier ressource corrompu : [FILE] - </notification> - <notification name="UnknownResourceFileVersion"> - Version de fichier ressource Linden inconnu : [FILE] - </notification> - <notification name="UnableToCreateOutputFile"> - Impossible de créer le fichier de sortie : [FILE] - </notification> - <notification name="DoNotSupportBulkAnimationUpload"> - Actuellement, APP_NAME] ne prend pas en charge le chargement de lots de fichiers d'animation. - </notification> - <notification name="CannotUploadReason"> - Impossible de charger [FILE] suite au problème suivant : [REASON] -Veuillez réessayer ultérieurement. - </notification> - <notification name="LandmarkCreated"> - Vous avez ajouté "[LANDMARK_NAME]" à votre dossier [FOLDER_NAME]. - </notification> - <notification name="CannotCreateLandmarkNotOwner"> - Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l'autorise pas. - </notification> - <notification name="CannotRecompileSelectObjectsNoScripts"> - Impossible d'effectuer les recompilations. -Sélectionnez un objet avec un script. - </notification> - <notification name="CannotRecompileSelectObjectsNoPermission"> - Impossible d'effectuer les recompilations. - -Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. - </notification> - <notification name="CannotResetSelectObjectsNoScripts"> - Impossible d'effectuer la réinitialisation. - -Veuillez sélectionner des objets avec des scripts. - </notification> - <notification name="CannotResetSelectObjectsNoPermission"> - Impossible d'effectuer la réinitialisation. - -Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. - </notification> - <notification name="CannotSetRunningSelectObjectsNoScripts"> - Impossible de définir les scripts sur « exécution ». - -Veuillez sélectionner des objets avec des scripts. - </notification> - <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - Impossible de définir les scripts sur « non-exécution ». - -Veuillez sélectionner des objets avec des scripts. - </notification> - <notification name="NoFrontmostFloater"> - Aucun floater frontmost à sauvegarder. - </notification> - <notification name="SeachFilteredOnShortWords"> - Votre requête a été modifiée et les mots trops courts ont été supprimés. - -Recherche effectuée : [FINALQUERY] - </notification> - <notification name="SeachFilteredOnShortWordsEmpty"> - Vos termes de recherche étaient trop courts et aucune recherche n'a été effectuée. - </notification> - <notification name="CouldNotTeleportReason"> - Impossible de téléporter. -[REASON] - </notification> - <notification 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. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. - </notification> - <notification name="invalid_region_handoff"> - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. - </notification> - <notification name="blocked_tport"> - Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. -Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. - </notification> - <notification name="nolandmark_tport"> - Désolé, le système n'a pas réussi à localiser la destination de votre repère. - </notification> - <notification name="timeout_tport"> - Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. -Veuillez réessayer dans un moment. - </notification> - <notification name="noaccess_tport"> - Désolé, vous n'avez pas accès à cette destination. - </notification> - <notification name="missing_attach_tport"> - Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. - </notification> - <notification name="too_many_uploads_tport"> - Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. - </notification> - <notification name="expired_tport"> - Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </notification> - <notification name="expired_region_handoff"> - Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </notification> - <notification name="no_host"> - Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. - </notification> - <notification name="no_inventory_host"> - L'inventaire est temporairement indisponible. - </notification> - <notification name="CannotSetLandOwnerNothingSelected"> - Impossible de définir le propriétaire foncier : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotSetLandOwnerMultipleRegions"> - Impossible de définir un propriétaire car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer. - </notification> - <notification name="ForceOwnerAuctionWarning"> - Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Souhaitez-vous définir un propriétaire ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CannotContentifyNothingSelected"> - Problème : -Aucune parcelle sélectionnée. - </notification> - <notification name="CannotContentifyNoRegion"> - Problème : -Aucune région sélectionnée. - </notification> - <notification name="CannotReleaseLandNothingSelected"> - Impossible d'abandonner le terrain : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotReleaseLandNoRegion"> - Impossible d'abandonner le terrain : -la région est introuvable. - </notification> - <notification name="CannotBuyLandNothingSelected"> - Impossible d'acheter le terrain : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotBuyLandNoRegion"> - Impossible d'acheter le terrain : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotCloseFloaterBuyLand"> - Vous ne pouvez pas fermer la fenêtre Acheter le terrain avant que [APP_NAME] n'estime le montant de cette transaction. - </notification> - <notification name="CannotDeedLandNothingSelected"> - Cession du terrain impossible : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotDeedLandNoGroup"> - Cession du terrain impossible : -aucun groupe sélectionné. - </notification> - <notification name="CannotDeedLandNoRegion"> - Cession du terrain impossible : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotDeedLandMultipleSelected"> - Cession du terrain impossible : -plusieurs parcelles sélectionnées. - -Essayez de ne sélectionner qu'une seule parcelle. - </notification> - <notification name="ParcelCanPlayMedia"> - Cette parcelle propose des flux média. -Pour jouer des flux média, il faut avoir une connexion internet rapide. - -Jouer les flux média lorsqu'ils sont disponibles ? -(Vous pourrez modifier cette option ultérieurement sous Préférences > Audio et vidéo.) - <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. - -Merci de réessayer. - </notification> - <notification name="CannotDeedLandNoTransfer"> - Cession du terrain impossible : -la cession de terrain est interdite dans la région [REGION]. - </notification> - <notification name="CannotReleaseLandWatingForServer"> - Impossible d'abandonner le terrain : -mise à jour des informations sur la parcelle sur le point d'être envoyée par le serveur. - -Veuillez réessayer dans quelques secondes. - </notification> - <notification name="CannotReleaseLandSelected"> - Impossible d'abandonner le terrain : -vous n'êtes pas le propriétaire des parcelles sélectionnées. - -Veuillez sélectionner une seule parcelle. - </notification> - <notification name="CannotReleaseLandDontOwn"> - Impossible d'abandonner le terrain : -vous n'avez pas le droit de libérer cette parcelle. -Les parcelles qui vous appartiennent sont en vert. - </notification> - <notification name="CannotReleaseLandRegionNotFound"> - Impossible d'abandonner le terrain : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotReleaseLandNoTransfer"> - Impossible d'abandonner le terrain : -le transfert de terrain est interdit dans la région [REGION]. - </notification> - <notification name="CannotReleaseLandPartialSelection"> - Impossible d'abandonner le terrain : -vous devez sélectionner une parcelle entière pour la libérer. - -Sélectionnez toute la parcelle ou divisez-la d'abord. - </notification> - <notification name="ReleaseLandWarning"> - Vous vous apprêtez à libérer [AREA] m² de terrain. -Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$. - -Libérer ce terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNothingSelected"> - Division du terrain impossible : - -aucune parcelle sélectionnée. - </notification> - <notification name="CannotDivideLandPartialSelection"> - Division du terrain impossible : - -Toute la parcelle est sélectionnée. -Sélectionnez une partie de la parcelle uniquement. - </notification> - <notification name="LandDivideWarning"> - Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut. - -Diviser le terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNoRegion"> - Division du terrain impossible : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotJoinLandNoRegion"> - Impossible de fusionner le terrain : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotJoinLandNothingSelected"> - Impossible de fusionner le terrain : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotJoinLandEntireParcelSelected"> - Impossible de fusionner le terrain : -vous avez sélectionné une seule parcelle. - -Sélectionnez le terrain sur les deux parcelles. - </notification> - <notification name="CannotJoinLandSelection"> - Impossible de fusionner le terrain : -vous devez sélectionner au moins deux parcelles. - -Sélectionnez le terrain sur les deux parcelles. - </notification> - <notification name="JoinLandWarning"> - En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné. -Vous devrez réinitialiser le nom et les options de la nouvelle parcelle. - -Fusionner le terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmNotecardSave"> - Cette note doit être sauvegardée avant que l'objet ne puisse être copié ou visualisé. Enregistrer la note ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmItemCopy"> - Copier cet objet dans votre inventaire ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Copier"/> - </notification> - <notification name="ResolutionSwitchFail"> - Échec du changement de résolution (à [RESX], de [RESY]) - </notification> - <notification name="ErrorUndefinedGrasses"> - Erreur : herbes non identifiées : [SPECIES] - </notification> - <notification name="ErrorUndefinedTrees"> - Erreur : arbres non identifiés : [SPECIES] - </notification> - <notification name="CannotSaveWearableOutOfSpace"> - Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d'abord libérer de la mémoire sur votre ordinateur. - </notification> - <notification name="CannotSaveToAssetStore"> - Impossible de sauvegarder le fichier [NAME] dans la base de données centrale. -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] : - [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"> - Impossible d'acheter du terrain pour le groupe : -Vous n'avez pas le droit d'acheter de terrain pour votre groupe. - </notification> - <notification label="Devenir amis" name="AddFriend"> - Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. - -Proposer à [NAME] de devenir votre ami(e) ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Devenir amis" name="AddFriendWithMessage"> - Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. - -Proposer à [NAME] de devenir votre ami(e) ? - <form name="form"> - <input name="message"> - Voulez-vous être mon ami(e) ? - </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"/> - </notification> - <notification name="RemoveMultipleFromFriends"> - Voulez-vous supprimer plusieurs résidents de votre liste d'amis ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedPublicObjectsByUser"> - Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedObjectsByUser"> - Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GodDeleteAllObjectsByUser"> - Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BlankClassifiedName"> - Vous devez choisir un nom pour votre petite annonce. - </notification> - <notification name="MinClassifiedPrice"> - Le coût de l'annonce doit être de [MIN_PRICE] L$ minimum. - -Veuillez saisir un montant plus élevé. - </notification> - <notification name="ConfirmObjectDeleteLock"> - Au moins un des objets que vous avez sélectionnés est verrouillé. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopy"> - Au moins un des objets que vous avez sélectionnés n'est pas copiable. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoOwn"> - Au moins un des objets que vous avez sélectionnés ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopy"> - Au moins un des objets est verrouillé. -Au moins un des objets n'est pas copiable. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoOwn"> - Au moins un des objets est verrouillé. -Au moins un des objets ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Au moins un des objets n'est pas copiable. -Au moins un des objets ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - Au moins un des objets est verrouillé. -Au moins un des objets n'est pas copiable. -Au moins un des objets ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLock"> - Au moins un des objets est verrouillé. - -Êtes-vous certain de vouloir prendre ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeNoOwn"> - Vous n'êtes pas le propriétaire de tous les objets que vous prenez. -Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. - -Êtes-vous certain de vouloir prendre ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLockNoOwn"> - Au moins un des objets est verrouillé. -Vous n'êtes pas le propriétaire de tous les objets que vous prenez. -Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. -Par contre, vous pouvez prendre les objets sélectionnés. - -Êtes-vous certain de vouloir prendre ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CantBuyLandAcrossMultipleRegions"> - Impossible d'acheter le terrain car la sélection couvre plusieurs régions. - -Veuillez sélectionner une zone plus petite et réessayer. - </notification> - <notification name="DeedLandToGroup"> - Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. -Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. - -Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DeedLandToGroupWithContribution"> - Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. -La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME]. -Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. - -Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DisplaySetToSafe"> - Les paramètres d'affichage sont au niveau le plus sûr, comme vous l'aviez indiqué. - </notification> - <notification name="DisplaySetToRecommended"> - Vos paramètres d'affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système. - </notification> - <notification name="ErrorMessage"> - [ERROR_MESSAGE] - </notification> - <notification name="AvatarMovedDesired"> - La destination que vous avez choisie n'est pas disponible actuellement. -Vous avez été téléporté vers une région voisine. - </notification> - <notification name="AvatarMovedLast"> - Votre dernière destination n'est pas disponible actuellement. -Vous avez été téléporté vers une région voisine. - </notification> - <notification name="AvatarMovedHome"> - La destination que vous avez choisie n'est pas disponible actuellement. -Vous avez été téléporté vers une région voisine. -Nous vous conseillons de définir votre domicile ailleurs. - </notification> - <notification name="ClothingLoading"> - Vos vêtements sont en cours de téléchargement. -Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voient correctement. - <form name="form"> - <ignore name="ignore" text="Vos habits prennent du temps à télécharger"/> - </form> - </notification> - <notification name="FirstRun"> - L'installation de [APP_NAME] est terminée. - -S'il s'agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter. -Retourner sur www.secondlife.com pour créer un nouveau compte ? - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/> - </notification> - <notification name="LoginPacketNeverReceived"> - Nous avons des difficultés à vous connecter. Il y a peut-être un problème avec votre connexion Internet ou la [SECOND_LIFE_GRID]. - -Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d'aller chez vous. - <url name="url"> - http://secondlife.com/support/ - </url> - <form name="form"> - <button name="OK" text="OK"/> - <button name="Help" text="Aide"/> - <button name="Teleport" text="Téléporter"/> - </form> - </notification> - <notification name="WelcomeChooseSex"> - Votre personnage va apparaître dans un moment. - -Pour marcher, utilisez les flèches de direction. -Appuyez sur F1 pour obtenir de l'aide ou en savoir plus sur [SECOND_LIFE]. -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="NotEnoughCurrency"> - [NAME] [PRICE] L$ Vous n'avez pas suffisamment de L$ pour faire cela. - </notification> - <notification name="GrantedModifyRights"> - [FIRST_NAME] [LAST_NAME] vous avez donné la permission de modifier ses objets. - </notification> - <notification name="RevokedModifyRights"> - Vous n'avez plus le droit de modifier les objets de [FIRST_NAME] [LAST_NAME]. - </notification> - <notification name="FlushMapVisibilityCaches"> - Cela videra le cache cartographique de cette région. -Cela n'est vraiment utile que pour faire du débugage. -(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.) - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyOneObjectOnly"> - Impossible d'acheter plus d'un objet à la fois. Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification name="OnlyCopyContentsOfSingleItem"> - Impossible de copier les contenus de plus d'un objet à la fois. -Veuillez ne sélectionner qu'un seul objet. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="KickUsersFromRegion"> - Téléporter tous les résidents de cette région chez eux ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="EstateObjectReturn"> - Etes-vous certain de vouloir renvoyer les objets appartenant à [USER_NAME] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="InvalidTerrainBitDepth"> - Impossible de definir les textures de la région : -La texture du terrain [TEXTURE_NUM] a une profondeur invalide ([TEXTURE_BIT_DEPTH]). - -Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. - </notification> - <notification name="InvalidTerrainSize"> - Impossible de definir les textures de la région : -La texture du terrain [TEXTURE_NUM] est trop volumineuse ([TEXTURE_SIZE_X] X [TEXTURE_SIZE_Y]). - -Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. - </notification> - <notification name="RawUploadStarted"> - Le chargement a commencé. Cela va prendre une à deux minutes, -suivant votre vitesse de connexion. - </notification> - <notification name="ConfirmBakeTerrain"> - Etes-vous sûr(e) de vouloir figer le relief actuel, en faire le point central des limites d'élévation/abaissement de relief et la valeur par défaut du bouton Annuler modification ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="MaxAllowedAgentOnRegion"> - Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents. - </notification> - <notification name="MaxBannedAgentsOnRegion"> - Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents. - </notification> - <notification name="MaxAgentOnRegionBatch"> - Echec lors de la tentative d'ajout de [NUM_ADDED] agents : -Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. - </notification> - <notification name="MaxAllowedGroupsOnRegion"> - Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Figer"/> - </notification> - <notification name="MaxManagersOnRegion"> - Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine. - </notification> - <notification name="OwnerCanNotBeDenied"> - Impossible d'ajouter le propriétaire du domaine à la liste des résidents bannis. - </notification> - <notification name="CanNotChangeAppearanceUntilLoaded"> - Impossible de changer d'apparence jusqu'à ce que les habits et la silhouette soient chargés. - </notification> - <notification name="ClassifiedMustBeAlphanumeric"> - Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n'est pas autorisée. - </notification> - <notification name="CantSetBuyObject"> - Cet objet n'est pas à vendre. -Veuillez choisir un objet à vendre et réessayer. - </notification> - <notification name="FinishedRawDownload"> - Chargement du fichier de terrain raw effectué vers : -[DOWNLOAD_PATH]. - </notification> - <notification name="DownloadWindowsMandatory"> - Une nouvelle version de [APP_NAME] est disponible. -[MESSAGE] -Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. - <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> - </notification> - <notification name="DownloadWindows"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadWindowsReleaseForDownload"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadLinuxMandatory"> - Une nouvelle version de [APP_NAME] est disponible. -[MESSAGE] -Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. - <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> - </notification> - <notification name="DownloadLinux"> - Une mise à jour de [SECOND_LIFE] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadLinuxReleaseForDownload"> - Une mise à jour de [SECOND_LIFE] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadMacMandatory"> - Une nouvelle version de [APP_NAME] est disponible. -[MESSAGE] -Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. - -Télécharger vers le dossier Applications ? - <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> - </notification> - <notification name="DownloadMac"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - -Télécharger vers le dossier Applications ? - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadMacReleaseForDownload"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - -Télécharger vers le dossier Applications ? - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DeedObjectToGroup"> - Si vous cédez cet objet, le groupe : -* recevra les L$ versés pour l'objet ; - <usetemplate ignoretext="Confimer avant que je ne cède un objet à un groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/> - </notification> - <notification name="WebLaunchExternalTarget"> - Voulez-vous ouvrir votre navigateur web système pour afficher ce contenu ? - <usetemplate ignoretext="Ouvrir mon navigateur pour consulter une page web" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchJoinNow"> - Aller sur secondlife.com pour gérer votre compte ? - <usetemplate ignoretext="Lancer mon navigateur pour gérer mon compte" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchSecurityIssues"> - Pour apprendre à signaler un problème de sécurité, consultez le Wiki de [SECOND_LIFE]. - <usetemplate ignoretext="Lancer mon navigateur pour apprendre comment signaler un problème de sécurité" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchQAWiki"> - Consultez le Wiki sur l'Assurance Qualité de [SECOND_LIFE]. - <usetemplate ignoretext="Lancer mon navigateur web pour consulter la page Wiki sur l'Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchPublicIssue"> - Pour signaler des bugs et autres problèmes, utilisez le JIRA de [SECOND_LIFE]. - <usetemplate ignoretext="Lancer mon navigateur pour utiliser le Public Issue Tracker (JIRA)" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> - </notification> - <notification name="WebLaunchSupportWiki"> - Visitez le blog officiel des Lindens pour les dernières nouvelles et informations. - <usetemplate ignoretext="Lancer mon navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> - </notification> - <notification name="WebLaunchLSLGuide"> - Voulez-vous ouvrir le guide pour l'écriture de scripts ? - <usetemplate ignoretext="Lancer mon navigateur web pour consulter le guide pour l'écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLWiki"> - Voulez-vous ouvrir le portail LSL pour l'écriture de scripts ? - <usetemplate ignoretext="Lancer mon navigateur web pour consulter le portail LSL" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> - </notification> - <notification name="ReturnToOwner"> - Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire. - -*Avertissement* Les objets non transférables seront supprimés ! - <usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GroupLeaveConfirmMember"> - Vous êtes actuellement membre du groupe [GROUP]. -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"/> - </notification> - <notification name="MuteLinden"> - Désolé, vous ne pouvez pas ignorer un Linden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotStartAuctionAlreadyForSale"> - Vous ne pouvez pas démarrer des enchères sur une parcelle déjà en vente. Si vous êtes certain de vouloir démarrer des enchères, mettez fin à la vente. - </notification> - <notification label="Échec de la fonction Ignorer les objets par nom" name="MuteByNameFailed"> - Vous ignorez déjà ce résident. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RemoveItemWarn"> - Si vous supprimez des contenus, vous risquez d'endommager l'objet. Souhaitez-vous supprimer cet objet ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CantOfferCallingCard"> - Impossible d'offrir une carte de visite actuellement. Veuillez réessayer dans un moment. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CantOfferFriendship"> - Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="BusyModeSet"> - Le mode Occupé est sélectionné. -Les chats et les messages instantanés ne s'afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d'inventaire iront dans la corbeille. - <usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/> - </notification> - <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="KickUser"> - Éjecter cet utilisateur avec quel message ? - <form name="form"> - <input name="message"> - Un administrateur vous a déconnecté. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="KickAllUsers"> - Éjecter tous les résidents actuellement en ligne avec quel message ? - <form name="form"> - <input name="message"> - Un administrateur vous a déconnecté. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="FreezeUser"> - Geler cet utilisateur 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). - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="UnFreezeUser"> - Dégeler cet utilisateur avec quel message ? - <form name="form"> - <input name="message"> - Vous n'êtes plus gelé. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="OfferTeleport"> - Proposez une téléportation avec le message suivant ? - <form name="form"> - <input name="message"> - On se rejoint à [REGION] ? - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="OfferTeleportFromGod"> - Demander au résident de venir vous rejoindre ? - <form name="form"> - <input name="message"> - On se rejoint à [REGION] ? - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="TeleportFromLandmark"> - Êtes-vous certain de vouloir être téléporté ? - <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"> - Téléporter vers [PICK] ? - <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans mes Préférences" 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"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <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. - -Continuer ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Modifier l'accès à un domaine Linden" name="ChangeLindenAccess"> - Vous vous apprêtez à modifier la liste d'accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.). - -Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l'intérieur/extérieur de la grille. -Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedAgentAdd"> - Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedAgentRemove"> - Supprimer de la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedGroupAdd"> - Ajouter à la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedGroupRemove"> - Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateBannedAgentAdd"> - Refuser l'accès à ce domaine uniquement ou à [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateBannedAgentRemove"> - Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateManagerAdd"> - Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateManagerRemove"> - Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Confirmer" name="EstateKickUser"> - Éjecter [EVIL_USER] de ce domaine ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="EstateChangeCovenant"> - Êtes-vous certain de vouloir modifier le règlement du domaine ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked"> - Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. - -Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked_KB"> - Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. - -Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? - <url name="url"> - http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) - </url> - <usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="RegionEntryAccessBlocked_Notify"> - 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. - -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 Édition > Préférences... > Général. - <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="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. - -Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandClaimAccessBlocked_KB"> - Votre catégorie d'accès ne vous permet pas de réclamer cette région. - -Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? - <url name="url"> - http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) - </url> - <usetemplate ignoretext="Je ne peux pas réclamer cette région car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="LandClaimAccessBlocked_Notify"> - Votre catégorie d'accès ne vous autorise pas à réclamer cette région. - </notification> - <notification name="LandClaimAccessBlocked_Change"> - Votre catégorie d'accès ne vous permet pas de réclamer 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 Édition > Préférences... > Général. - <usetemplate ignoretext="La catégorie de contenu que j'ai choisie m'empêche de réclamer un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> - </notification> - <notification name="LandBuyAccessBlocked"> - Votre catégorie d'accès ne vous permet pas d'acheter cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. - -Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandBuyAccessBlocked_KB"> - Votre catégorie d'accès ne vous permet pas d'acheter cette région. - -Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? - <url name="url"> - http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) - </url> - <usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="LandBuyAccessBlocked_Notify"> - Votre catégorie d'accès ne vous permet pas d'acheter cette région. - </notification> - <notification name="LandBuyAccessBlocked_Change"> - Votre catégorie d'accès ne vous autorise pas à acheter 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 Édition > Préférences... > Général. - <usetemplate ignoretext="La catégorie de contenu que j'ai choisie m'empêche d'acheter un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> - </notification> - <notification name="TooManyPrimsSelected"> - "Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer." - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemImportingEstateCovenant"> - Problème lors de l'importation du règlement du domaine. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemAddingEstateManager"> - Problèmes lors de l'ajout d'un nouveau gérant de domaine. Il est possible qu'au moins un des domaines ait une liste de gérants complète. - </notification> - <notification name="ProblemAddingEstateGeneric"> - Problème lors de l'ajout à la liste de ce domaine. Il est possible qu'au moins un des domaines ait une liste complète. - </notification> - <notification name="UnableToLoadNotecardAsset"> - Impossible de charger les données de la note actuellement. - </notification> - <notification name="NotAllowedToViewNotecard"> - Permissions pour afficher la note insuffisantes. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MissingNotecardAssetID"> - Les références de la note ne se trouvent pas dans la base de données. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PublishClassified"> - Rappel : les frais pour passer des petites annonces ne sont pas remboursables. - -Publier cette petite annonce maintenant pour [AMOUNT] L$ ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SetClassifiedMature"> - Cette petite annonce contient-elle du contenu Mature ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="SetGroupMature"> - Ce groupe contient-il du contenu Mature ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification label="Confirmer le redémarrage" name="ConfirmRestart"> - Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Envoyer un message à la région" name="MessageRegion"> - Saisissez une message qui sera envoyé à tous les résidents présents dans cette région. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification label="Catégorie de la région modifiée" name="RegionMaturityChange"> - La catégorie d'accès de cette région a été mise à jour. -Ce changement n'apparaîtra pas immédiatement sur la carte. - </notification> - <notification label="Versions de voix non compatibles" name="VoiceVersionMismatch"> - Cette version de [APP_NAME] n'est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour [APP_NAME] pour que le chat vocal fonctionne correctement. - </notification> - <notification label="Impossible d'acheter des objets" name="BuyObjectOneOwner"> - Impossible d'acheter simultanément des objets de propriétaires différents. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOnly"> - Impossible d'acheter les contenus de plus d'un objet à la fois. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOwner"> - Impossible d'acheter simultanément des objets de propriétaires différents. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification name="BuyOriginal"> - Acheter l'objet original pour [PRICE] L$ à [PRICE] ? -Vous deviendrez le propriétaire de cet objet. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyOriginalNoOwner"> - Acheter l'objet original pour [PRICE] L$ ? -Vous deviendrez le propriétaire de cet objet. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyCopy"> - Acheter une copie pour [PRICE] L$ à [OWNER] ? -L'objet sera copié dans votre inventaire. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyCopyNoOwner"> - Acheter une copie pour [PRICE] L$ ? -L'objet sera copié dans votre inventaire. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyContents"> - Acheter des contenus pour [PRICE] L$ à [OWNER] ? -Ils seront copiés dans votre inventaire. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyContentsNoOwner"> - Acheter des contenus pour [PRICE] L$ ? -Ils seront copiés dans votre inventaire. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmPurchase"> - Suite à cette transaction, vous allez : -[ACTION] - -Êtes-vous certain de vouloir effectuer cette transaction ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmPurchasePassword"> - Suite à cette transaction, vous allez : -[ACTION] - -Êtes-vous certain de vouloir effectuer cette transaction ? -Veuillez saisir à nouveau votre mot de passe et cliquer sur OK. - <form name="form"> - <button name="ConfirmPurchase" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="SetPickLocation"> - Remarque : -vous avez mis à jour l'emplacement de ce favori mais les autres détails resteront inchangés. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromObject"> - Vous avez sélectionné des objets non copiables. -Ces objets seront déplacés dans votre inventaire et non pas copiés. - -Déplacer les objets de l'inventaire ? - <usetemplate ignoretext="M'avertir avant que je ne déplace des objets pour lesquels la copie est interdite" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromScriptedObject"> - Vous avez sélectionné des objets de l'inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés. -L'objet les contenant est scripté, déplacer ces objets peut causer des problèmes au niveau du script. - -Déplacer les objets de l'inventaire ? - <usetemplate ignoretext="M'avertir avant que je ne déplace des objets pour lesquels la copie est interdite et qui pourraient casser des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ClickActionNotPayable"> - Avertissement : l'action du clic Payer l'objet a été définie mais ne fonctionnera que si un script est ajouté avec l'event money(). - <form name="form"> - <ignore name="ignore" text="Je définis l'action du clic Payer l'objet lorsque je construis un objet sans le script money()"/> - </form> - </notification> - <notification name="OpenObjectCannotCopy"> - Vous n'êtes autorisé à copier aucun élément dans cet objet. - </notification> - <notification name="WebLaunchAccountHistory"> - Aller sur secondlife.com pour consulter l'historique de votre compte ? - <usetemplate ignoretext="Lancer mon navigateur pour consulter l'historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> - </notification> - <notification name="ConfirmQuit"> - Êtes-vous certain de vouloir quitter ? - <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 Conditions d'utilisation et aux Règles de la communauté. Voir : - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php - -Lorsqu'elles sont signalées, toutes les infractions aux Conditions d'utilisation et aux Règles de la communauté font l'objet d'une enquête et sont résolues. Pour accéder aux détails de la résolution d'un incident, allez sur : - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - Important : ce rapport ira au propriétaire de la région dans laquelle vous êtes et non à Linden Lab. - -Pour aider les résidents et les visiteurs, le propriétaire de la région dans laquelle vous êtes a choisi de recevoir et de s'occuper de tous les rapports envoyés à partir de cette région. Linden Lab n'enquêtera pas sur les rapports que vous envoyez à partir de cet endroit. - -Le propriétaire de la région traitera les rapports en fonction des règles de cette région, comme indiqué dans le réglement du domaine. -(Les réglements sont visibles à partir du menu Monde > À propos du terrain.) - -La résolution de ce rapport ne s'applique qu'à cette région ; L'accès aux autres endroits de [SECOND_LIFE] ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l'accès à l'ensemble de [SECOND_LIFE]. - </notification> - <notification name="HelpReportAbuseSelectCategory"> - Veuillez choisir une catégorie pour ce rapport d'infraction. -Le choix d'une catégorie nous permet de traiter les rapports d'infraction plus rapidement. - </notification> - <notification name="HelpReportAbuseAbuserNameEmpty"> - Veuillez saisir le nom du contrevenant. -Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseAbuserLocationEmpty"> - Veuillez indiquer l'endroit où l'infraction a eu lieu. -Les informations précises et exactes nous permettent de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseSummaryEmpty"> - Veuillez saisir un récapitulatif de l'infraction. -Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseDetailsEmpty"> - Veuillez saisir une description détaillée de l'infraction. -Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l'incident que vous signalez. -Les descriptions précises nous permettent de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseContainsCopyright"> - Cher résident, - -Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction : - -(1) Remplissez un rapport d'infraction. Vous pouvez soumettre un rapport d'infraction si vous pensez qu'un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l'encontre du résident non respectueux des Conditions d'utilisation ou des règles de la communauté. Sachez toutefois que l'équipe chargée des infractions ne supprimera pas de contenu à l'intérieur de [SECOND_LIFE]. - -(2) Demandez à ce que du contenu à l'intérieur de [SECOND_LIFE] soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d'infraction valide, tel que fourni dans notre Règlement contre les violations des droit d'auteurs (DMCA), à http://secondlife.com/corporate/dmca.php. - -Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport. Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits. - -Merci, - -Linden Lab - </notification> - <notification name="FailedRequirementsCheck"> - Les composantes requises suivantes ne se trouvent pas dans [FLOATER]: -[COMPONENTS] - </notification> - <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"> - <ignore name="ignore" save_option="true" text="Remplacer une pièce-jointe existante par l'objet sélectionné"/> - <button ignore="Remplacer automatiquement" name="Yes" text="OK"/> - <button ignore="Ne jamais remplacer" name="No" text="Annuler"/> - </form> - </notification> - <notification label="Réponse si occupé(e)" name="BusyModePay"> - Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement. - -Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ? - <form name="form"> - <ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/> - <button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/> - <button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/> - </form> - </notification> - <notification name="ConfirmEmptyTrash"> - Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente ? - <usetemplate ignoretext="Confimer avant de vider la corbeille" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmClearBrowserCache"> - Êtes-vous certain de vouloir supprimer l'historique de vos visites et recherches ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="ConfirmClearCookies"> - Êtes-vous certain de vouloir supprimer vos cookies ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="ConfirmClearMediaUrlList"> - Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="ConfirmEmptyLostAndFound"> - Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ? - <usetemplate ignoretext="Confimer avant de vider le dossier Objets trouvés" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="CopySLURL"> - La SLurl suivante a été copiée dans votre presse-papier : - [SLURL] - -Liez-la à partir d'une page web pour permettre aux autres résidents d'accéder facilement à cet endroit ou bien collez-la dans la barre d'adresse de votre navigateur. - <form name="form"> - <ignore name="ignore" text="La SLurl est copiée dans mon presse-papier"/> - </form> - </notification> - <notification name="WLSavePresetAlert"> - Voulez-vous écraser l'option précédemment enregistrée ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="WLDeletePresetAlert"> - Voulez-vous supprimer [SKY] ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="WLNoEditDefault"> - Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. - </notification> - <notification name="WLMissingSky"> - Une dossier semble manquer au Cycle du jour : [SKY]. - </notification> - <notification name="PPSaveEffectAlert"> - Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="NewSkyPreset"> - Nommez le nouveau ciel. - <form name="form"> - <input name="message"> - Nouveau préréglage - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="ExistsSkyPresetAlert"> - Ce préréglage existe déjà  ! - </notification> - <notification name="NewWaterPreset"> - Nommez ce nouveau préréglage d'eau. - <form name="form"> - <input name="message"> - Nouveau préréglage - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="ExistsWaterPresetAlert"> - Ce préréglage existe déjà  ! - </notification> - <notification name="WaterNoEditDefault"> - Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. - </notification> - <notification name="ChatterBoxSessionStartError"> - Impossible de démarrer une nouvelle session de chat avec [RECIPIENT]. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ChatterBoxSessionEventError"> - [EVENT] -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ForceCloseChatterBoxSession"> - Vous devez terminer votre session de chat avec [NAME]. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="Cannot_Purchase_an_Attachment"> - Vous ne pouvez pas acheter un objet s'il fait partie d'une pièce-jointe. - </notification> - <notification label="À propos des requêtes pour les autorisations de débit" name="DebitPermissionDetails"> - Accepter cette requête donne au script l'autorisation de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette autorisation, le propriétaire de l'objet doit supprimer l'objet ou bien réinitialiser les scripts dans l'objet. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AutoWearNewClothing"> - Voulez-vous automatiquement porter l'habit que vous allez créer ? - <usetemplate ignoretext="Porter automatiquement tout en modifiant mon apparence" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="NotAgeVerified"> - Pour pouvoir pénétrer dans cette zone, vous devez avoir procédé à la vérification de votre âge. Souhaitez-vous aller sur [SECOND_LIFE] et procéder à la vérification de votre âge ? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/verification.php?lang=fr - </url> - <usetemplate ignoretext="Je n'ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="Cannot enter parcel: no payment info on file"> - Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement. Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/index.php?lang=fr - </url> - <usetemplate ignoretext="Mes informations de paiement ne sont pas enregistrées" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="MissingString"> - The string [STRING_NAME] is missing from strings.xml - </notification> - <notification name="SystemMessageTip"> - [MESSAGE] - </notification> - <notification name="Cancelled"> - Annulé - </notification> - <notification name="CancelledSit"> - Action annulée - </notification> - <notification name="CancelledAttach"> - Attachement annulé - </notification> - <notification name="ReplacedMissingWearable"> - Habits et parties du corps manquants remplacés par les éléments par défaut. - </notification> - <notification name="GroupNotice"> - Sujet : [SUBJECT], Message : [MESSAGE] - </notification> - <notification name="FriendOnline"> - [FIRST] [LAST] est connecté(e) - </notification> - <notification name="FriendOffline"> - [FIRST] [LAST] est déconnecté(e) - </notification> - <notification name="AddSelfFriend"> - Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même. - </notification> - <notification name="UploadingAuctionSnapshot"> - Importation de photos SL et Web en cours... -(prend environ 5 minutes.) - </notification> - <notification name="UploadPayment"> - Le chargement a coûté [AMOUNT] L$. - </notification> - <notification name="UploadWebSnapshotDone"> - Photo Web importée - </notification> - <notification name="UploadSnapshotDone"> - Photo SL importée - </notification> - <notification name="TerrainDownloaded"> - Fichier terrain.raw téléchargé - </notification> - <notification name="GestureMissing"> - Geste [NAME] absent de la base de données. - </notification> - <notification name="UnableToLoadGesture"> - Impossible de charger le geste [NAME]. -Merci de réessayer. - </notification> - <notification name="LandmarkMissing"> - Repère absent de la base de données. - </notification> - <notification name="UnableToLoadLandmark"> - Impossible de charger le repère. Merci de réessayer. - </notification> - <notification name="CapsKeyOn"> - La touche Verr.maj est activée. -Cela risque d'impacter votre mot de passe. - </notification> - <notification name="NotecardMissing"> - Note absente de la base de données. - </notification> - <notification name="NotecardNoPermissions"> - Vous n'avez pas le droit de consulter cette note. - </notification> - <notification name="RezItemNoPermissions"> - Permissions insuffisantes pour rezzer l'objet. - </notification> - <notification name="UnableToLoadNotecard"> - Impossible de lire les données de la note actuellement. - </notification> - <notification name="ScriptMissing"> - Script absent de la base de données. - </notification> - <notification name="ScriptNoPermissions"> - Permissions insuffisantes pour voir le script. - </notification> - <notification name="UnableToLoadScript"> - Impossible de charger le script. Merci de réessayer. - </notification> - <notification name="IncompleteInventory"> - Tous les éléments que vous souhaitez transférer ne sont pas encore disponibles sur le serveur. -Merci d'essayer à nouveau dans une minute. - </notification> - <notification name="CannotModifyProtectedCategories"> - Vous ne pouvez pas modifier de catégories protégées. - </notification> - <notification name="CannotRemoveProtectedCategories"> - Vous ne pouvez pas supprimer de catégories protégées. - </notification> - <notification name="OfferedCard"> - Vous avez offert votre carte de visite à [FIRST] [LAST] - </notification> - <notification name="UnableToBuyWhileDownloading"> - Achat impossible durant le chargement de l'objet. -Merci de réessayer. - </notification> - <notification name="UnableToLinkWhileDownloading"> - Impossible de lier durant le chargement de l'objet. -Merci de réessayer. - </notification> - <notification name="CannotBuyObjectsFromDifferentOwners"> - Vous ne pouvez pas acheter simultanément des objets de propriétaires différents. -Veuillez sélectionner un seul objet. - </notification> - <notification name="ObjectNotForSale"> - Cet objet n'est pas à vendre. - </notification> - <notification name="EnteringGodMode"> - Activation du mode divin : niveau [LEVEL] - </notification> - <notification name="LeavingGodMode"> - Désactivation du mode divin : niveau [LEVEL] - </notification> - <notification name="CopyFailed"> - Vous n'avez pas le droit de copier ceci. - </notification> - <notification name="InventoryAccepted"> - [NAME] a accepté votre envoi. - </notification> - <notification name="InventoryDeclined"> - [NAME] a refusé votre envoi. - </notification> - <notification name="ObjectMessage"> - [NAME]: [MESSAGE] - </notification> - <notification name="CallingCardAccepted"> - Votre carte de visite a été acceptée. - </notification> - <notification name="CallingCardDeclined"> - Votre carte de visite a été refusée. - </notification> - <notification name="TeleportToLandmark"> - A présent que vous êtes sur le continent, vous pouvez voyager par téléportation (vers [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Repères (Landmarks). -Choisissez un repère, double-cliquez dessus et cliquez sur Téléporter. - </notification> - <notification name="TeleportToPerson"> - A présent que vous êtes sur le continent, vous pouvez contacter des résidents (tel [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Cartes de visite (Calling Cards). -Choisissez en une, double-cliquez dessus et cliquez sur Message Instantané. - </notification> - <notification name="CantSelectLandFromMultipleRegions"> - Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur. -Veuillez sélectionner un terrain plus petit. - </notification> - <notification name="SearchWordBanned"> - Certains termes de votre recherche ont été exclus car ils ne correspondaient pas aux standards fixés dans les Règles communautaires. - </notification> - <notification name="NoContentToSearch"> - Veuillez sélectionner au moins un type de contenu à rechercher (PG, Mature ou Adulte) - </notification> - <notification name="GroupVote"> - [NAME] a proposé un vote pour : -[MESSAGE] - <form name="form"> - <button name="VoteNow" text="Voter"/> - <button name="Later" text="Plus tard"/> - </form> - </notification> - <notification name="SystemMessage"> - [MESSAGE] - </notification> - <notification name="EventNotification"> - Avis d'événement : - -[NAME] -[DATE] - <form name="form"> - <button name="Teleport" text="Téléporter"/> - <button name="Description" text="Description"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="TransferObjectsHighlighted"> - Tous les objets de cette parcelle qui seront transférés à l'acheteur sont maintenant mis en surbrillance. - -* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance. - <form name="form"> - <button name="Done" text="Transfert effectué"/> - </form> - </notification> - <notification name="DeactivatedGesturesTrigger"> - Gestes désactivés ayant le même mot-clé : -[NAMES] - </notification> - <notification name="NoQuickTime"> - Le logiciel Apple QuickTime ne semble pas installé sur votre système. -Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de QuickTime (http://www.apple.com/fr/quicktime/download) et installez le lecteur QuickTime. - </notification> - <notification name="NoPlugin"> - Aucun Media Plugin n'a été trouvé pour prendre en charge "[MIME_TYPE]". Les médias de ce type ne sont pas disponibles. - </notification> - <notification name="MediaPluginFailed"> - Le Media Plugin suivant a échoué : - [PLUGIN] - -Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeur. - <form name="form"> - <ignore name="ignore" text="L'éxécution d'un Media Plugin a échoué"/> - </form> - </notification> - <notification name="OwnedObjectsReturned"> - Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire. - </notification> - <notification name="OtherObjectsReturned"> - Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire. - </notification> - <notification name="OtherObjectsReturned2"> - Les objets sur la parcelle appartenant à « [NAME] » ont étés renvoyés à leur propriétaire. - </notification> - <notification name="GroupObjectsReturned"> - Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe [GROUPNAME] ont été renvoyés dans l'inventaire de leur propriétaire. -Les objets donnés transférables ont étés renvoyés à leur propriétaire. -Les objets non transférables donnés au groupe ont étés supprimés. - </notification> - <notification name="UnOwnedObjectsReturned"> - Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires. - </notification> - <notification name="NotSafe"> - Les dégâts sont autorisés sur ce terrain. -Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile. - </notification> - <notification name="NoFly"> - Le vol est interdit dans cette zone. -Vous ne pouvez pas voler ici. - </notification> - <notification name="PushRestricted"> - Les bousculades sont interdites dans cette zone. -Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain. - </notification> - <notification name="NoVoice"> - Le chat vocal est interdit dans cette zone. Vous n'entendrez personne parler. - </notification> - <notification name="NoBuild"> - La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d'objets ici. - </notification> - <notification name="ScriptsStopped"> - Un administrateur a temporairement stoppé les scripts dans cette région. - </notification> - <notification name="ScriptsNotRunning"> - Aucun script ne fonctionne dans cette région. - </notification> - <notification name="NoOutsideScripts"> - Les scripts externes sont désactivés sur ce terrain. - -Aucun script ne marche ici à part ceux du propriétaire du terrain. - </notification> - <notification name="ClaimPublicLand"> - Vous ne pouvez réclamer qu'un terrain public dans la région où vous vous trouvez actuellement. - </notification> - <notification name="RegionTPAccessBlocked"> - Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Vous devez sans doute procéder à la vérification de votre âge ou installer une version plus récente du client. - -Pour savoir comment accéder aux zones ayant un tel niveau d'accès, veuillez consulter les pages d'aide. - </notification> - <notification name="URBannedFromRegion"> - Vous avez été banni de cette région. - </notification> - <notification name="NoTeenGridAccess"> - Votre compte ne peut pas se connecter à cette région du Teen grid. - </notification> - <notification name="ImproperPaymentStatus"> - Vous n'avez pas le statut de paiement approprié pour pénétrer dans cette région. - </notification> - <notification name="MustGetAgeParcel"> - Pour pouvoir pénétrer sur cette parcelle, vous devez avoir procédé à la vérification de votre âge. - </notification> - <notification name="NoDestRegion"> - Région de destination introuvable. - </notification> - <notification name="NotAllowedInDest"> - Vous n'êtes pas autorisé dans cette région. - </notification> - <notification name="RegionParcelBan"> - Impossible de traverser une parcelle bannie. Veuillez trouver une autre solution. - </notification> - <notification name="TelehubRedirect"> - Vous avez été redirigé vers un téléhub. - </notification> - <notification name="CouldntTPCloser"> - Il n'a pas été possible de vous téléporter vers une destination plus proche. - </notification> - <notification name="TPCancelled"> - Téléportation annulée. - </notification> - <notification name="FullRegionTryAgain"> - La région dans laquelle vous essayez de pénétrer est pleine actuellement. -Veuillez réessayer dans quelques minutes. - </notification> - <notification name="GeneralFailure"> - Panne générale. - </notification> - <notification name="RoutedWrongRegion"> - Dirigé vers la mauvaise région. Merci de réessayer. - </notification> - <notification name="NoValidAgentID"> - ID agent non valide. - </notification> - <notification name="NoValidSession"> - ID de session non valide. - </notification> - <notification name="NoValidCircuit"> - Aucun code de circuit valide. - </notification> - <notification name="NoValidTimestamp"> - Timestamp non valide. - </notification> - <notification name="NoPendingConnection"> - Impossible de créer la connexion en attente. - </notification> - <notification name="InternalUsherError"> - Erreur interne lors de la tentative de connexion. - </notification> - <notification name="NoGoodTPDestination"> - Impossible de trouver un lieu de téléportation valide dans cette région. - </notification> - <notification name="InternalErrorRegionResolver"> - Une erreur interne est survenue lors de la résolution des coodonnées de la région. - </notification> - <notification name="NoValidLanding"> - Impossible de trouver un point d'atterrissage valide. - </notification> - <notification name="NoValidParcel"> - Aucune parcelle valide n'a été trouvée. - </notification> - <notification name="ObjectGiveItem"> - Un objet appelé [OBJECTFROMNAME] appartenant à [FIRST] [LAST] vous a donné : [OBJECTTYPE] appelé(e) [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Garder"/> - <button name="Discard" text="Jeter"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - L'objet [OBJECTFROMNAME] appartenant à un utilisateur inconnu vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Garder"/> - <button name="Discard" text="Jeter"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="UserGiveItem"> - [NAME] vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Garder"/> - <button name="Discard" text="Jeter"/> - </form> - </notification> - <notification name="GodMessage"> - [NAME] -[MESSAGE] - </notification> - <notification name="JoinGroup"> - [MESSAGE] - <form name="form"> - <button name="Join" text="Rejoindre"/> - <button name="Decline" text="Refuser"/> - <button name="Info" text="Infos"/> - </form> - </notification> - <notification name="TeleportOffered"> - [NAME] vous propose de le/la rejoindre par téléportation : - -[MESSAGE] - <form name="form"> - <button name="Teleport" text="Téléporter"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="GotoURL"> - [MESSAGE] -[URL] - <form name="form"> - <button name="Later" text="Plus tard"/> - <button name="GoNow..." text="Y aller maintenant..."/> - </form> - </notification> - <notification name="OfferFriendship"> - [NAME] vous demande de devenir son ami(e). - -[MESSAGE] - -(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.) - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - </form> - </notification> - <notification name="OfferFriendshipNoMessage"> - [NAME] vous demande de devenir son ami. - -(Par défaut, vous pourrez voir quand vous êtes tous deux connectés) - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - </form> - </notification> - <notification name="FriendshipAccepted"> - [NAME] a accepté votre amitié. - </notification> - <notification name="FriendshipDeclined"> - [NAME] a refusé votre amitié. - </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. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - </form> - </notification> - <notification name="RegionRestartMinutes"> - La région va redémarrer dans [MINUTES] minutes. -Si vous restez dans cette région, vous serez déconnecté(e). - </notification> - <notification name="RegionRestartSeconds"> - La région va redémarrer dans [SECONDS] secondes. -Si vous restez dans cette région, vous serez déconnecté(e). - </notification> - <notification name="LoadWebPage"> - Charger cette page web [URL] ? - -[MESSAGE] - -Venant de l'objet : [OBJECTNAME], appartenant à : [NAME]? - <form name="form"> - <button name="Gotopage" text="Charger"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="FailedToFindWearableUnnamed"> - La recherche du [TYPE] dans la base de données a échoué. - </notification> - <notification name="FailedToFindWearable"> - La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué. - </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 du client. - </notification> - <notification name="ScriptQuestion"> - '[OBJECTNAME]', un objet appartenant à '[NAME]', aimerait : - -[QUESTIONS] -Acceptez-vous ? - <form name="form"> - <button name="Yes" text="Oui"/> - <button name="No" text="Non"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="ScriptQuestionCaution"> - Un objet appelé « [OBJECTNAME] », appartenant à « [NAME] », aimerait : - -[QUESTIONS] -Si vous n'avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. - -Accepter cette requête ? - <form name="form"> - <button name="Grant" text="Accepter"/> - <button name="Deny" text="Refuser"/> - <button name="Details" text="Détails..."/> - </form> - </notification> - <notification name="ScriptDialog"> - '[TITLE]' de [FIRST] [LAST] -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorer"/> - </form> - </notification> - <notification name="ScriptDialogGroup"> - '[TITLE]' de [GROUPNAME] -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorer"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - Vous venez de recevoir [AMOUNT] L$. -Votre solde en L$ est affiché en haut à droite. - </notification> - <notification name="FirstBalanceDecrease"> - Vous venez de payer [AMOUNT] L$. -Votre solde en L$ est affiché en haut à droite. - </notification> - <notification name="FirstSit"> - Vous êtes assis(e). -Utilisez les touches de direction (ou AWSD) pour regarder autour de vous. -Pour vous lever, cliquez sur le bouton Me lever. - </notification> - <notification name="FirstMap"> - Cliquez et faîtes glisser pour faire défiler la carte. -Double-cliquez pour vous téléporter. -Utilisez les contrôles à droite pour trouver des choses et afficher différents arrière-plans. - </notification> - <notification name="FirstBuild"> - Vous avez ouvert les outils de construction. Tous les objets autour de vous ont été créés avec ces outils. - </notification> - <notification name="FirstTeleport"> - Vous ne pouvez vous téléporter que dans certaines zones de cette région. La flèche pointe vers votre destination. Cliquez sur la flèche pour la faire disparaître. - </notification> - <notification name="FirstOverrideKeys"> - Vos mouvements sont maintenant pris en charge par un objet. -Essayez les flèches de votre clavier ou AWSD pour voir à quoi elles servent. -Certains objets (comme les armes) nécessitent l'activation du mode Vue subjective pour être utilisés. -Pour cela, appuyez sur la touche M. - </notification> - <notification name="FirstAppearance"> - Vous êtes en train d'éditer votre apparence. -Utilisez les touches de direction pour regarder autour de vous. -Une fois terminé, cliquer sur Tout enregistrer. - </notification> - <notification name="FirstInventory"> - Il s'agit de votre inventaire qui contient vos possessions. - -* Pour porter quelque chose, faites glisser l'objet sur vous-même. -* Pour rezzer un objet dans le monde, faites-le glisser sur le sol. -* Pour lire une note, double-cliquez dessus. - </notification> - <notification name="FirstSandbox"> - Cette région est un bac à sable et est utilisée par les résidents pour apprendre à construire. - -Les objets que vous construisez ici seront supprimés après votre départ. N'oubliez donc pas de cliquer droit et de choisir Prendre pour sauvegarder votre création dans votre inventaire. - </notification> - <notification name="FirstFlexible"> - Cet objet est flexible. Les objets flexibles ne peuvent pas avoir de propriétés physiques et doivent rester fantômes. - </notification> - <notification name="FirstDebugMenus"> - Vous avez ouvert le menu Avancé. - -Pour activer/désactiver ce menu, - Windows : Ctrl-Alt-D - Mac : ⌘-Opt-D - </notification> - <notification name="FirstSculptedPrim"> - Vous êtes en train d'éditer un sculptie. Pour spécifier la forme d'un sculptie, vous devez utiliser une texture spécifique. - </notification> - <notification name="MaxListSelectMessage"> - Vous ne pouvez sélectionner que [MAX_SELECT] objets maximum dans cette liste. - </notification> - <notification name="VoiceInviteP2P"> - [NAME] vous invite à un chat vocal. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] a reçu un message instantané et n'est donc plus ignoré. - </notification> - <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] a reçu de l'argent et n'est donc plus ignoré. - </notification> - <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] a reçu un inventaire et n'est donc plus ignoré. - </notification> - <notification name="VoiceInviteGroup"> - [NAME] a rejoint un chat vocal avec le groupe [GROUP]. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="VoiceInviteAdHoc"> - [NAME] a rejoint un chat vocal avec conférence. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="InviteAdHoc"> - [NAME] vous invite à un chat conférence. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="VoiceChannelFull"> - L'appel auquel vous essayez de participer, [VOICE_CHANNEL_NAME], a atteint le nombre maximum de participants. Veuillez réessayer ultérieurement. - </notification> - <notification name="ProximalVoiceChannelFull"> - Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter. - </notification> - <notification name="VoiceChannelDisconnected"> - Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] a mis fin à l'appel. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="VoiceChannelJoinFailed"> - Echec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="VoiceLoginRetry"> - Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants. - </notification> - <notification name="Cannot enter parcel: not a group member"> - Seuls les membres d'un certain groupe peuvent visiter cette zone. - </notification> - <notification name="Cannot enter parcel: banned"> - Vous ne pouvez pas pénétrer sur ce terrain car l'accès vous y est interdit. - </notification> - <notification name="Cannot enter parcel: not on access list"> - Vous ne pouvez pas pénétrer sur ce terrain car vous n'avez pas les droits d'accès requis. - </notification> - <notification name="VoiceNotAllowed"> - Vous n'êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME]. - </notification> - <notification name="VoiceCallGenericError"> - Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement. - </notification> - <notification name="ServerVersionChanged"> - La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. Cliquez pour voir les notes de version. - </notification> - <notification name="UnsupportedCommandSLURL"> - La SLurl que vous avez saisie n'est pas prise en charge. - </notification> - <notification name="IMToast"> - <form name="form"> - <button name="respondbutton" text="Répondre"/> - </form> - </notification> - <notification name="AttachmentSaved"> - L'élément joint a été sauvegardé. - </notification> - <notification name="UnableToFindHelpTopic"> - Impossible de trouver l'aide. - </notification> - <global name="UnsupportedCPU"> - - Votre processeur ne remplit pas les conditions minimum requises. - </global> - <global name="UnsupportedGLRequirements"> - Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d'exploitation. - -Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE]. - </global> - <global name="UnsupportedCPUAmount"> - 796 - </global> - <global name="UnsupportedRAMAmount"> - 510 - </global> - <global name="UnsupportedGPU"> - - Votre carte graphique ne remplit pas les conditions minimum requises. - </global> - <global name="UnsupportedRAM"> - - Votre mémoire système ne remplit pas les conditions minimum requises. - </global> - <global name="PermYes"> - Oui - </global> - <global name="PermNo"> - Non - </global> - <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> - Si vous possédez un terrain, vous pouvez le définir comme domicile. -Sinon, consultez la carte et trouvez les « infohubs ». - </global> -</notifications> +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + Ne plus afficher + </global> + <global name="alwayschoose"> + Toujours choisir cette option + </global> + <global name="implicitclosebutton"> + Fermer + </global> + <template name="okbutton"> + <form> + <button name="OK" text="$yestext"/> + </form> + </template> + <template name="okignore"/> + <template name="okcancelbuttons"> + <form> + <button name="Cancel" text="$notext"/> + </form> + </template> + <template name="okcancelignore"/> + <template name="okhelpbuttons"> + <form> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Message d'alerte inconnu" name="MissingAlert"> + Votre version de [APP_NAME] ne peut afficher ce message d'erreur. Veuillez vous assurer que vous avez bien la toute dernière version du client. + +Détails de l'erreur : L'alerte, appelée '[_NAME]' est introuvable dans notifications.xml. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + Erreur floater : impossible de trouver les contrôles suivants : + +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + Aucun didacticiel n'est disponible actuellement. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="BadInstallation"> + Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version su client. http://get.secondlife.com + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + Connexion à [SECOND_LIFE_GRID] impossible. +'[DIAGNOSTIC]' +Veuillez vérifier votre connexion Internet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + Le modèle de message [PATH] est introuvable. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + Enregistrer les changements dans la partie du corps/les habits actuels ? + <usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> + </notification> + <notification name="CompileQueueSaveText"> + Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. + </notification> + <notification name="CompileQueueSaveBytecode"> + Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. + </notification> + <notification name="WriteAnimationFail"> + Une erreur est survenue lors de l'écriture des données d'animation. Veuillez réessayer ultérieurement. + </notification> + <notification name="UploadAuctionSnapshotFail"> + Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON] + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + Impossible d'afficher les contenus de plus d'un objet à la fois. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification name="SaveClothingBodyChanges"> + 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="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] ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer 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 aux résidents selectionnés ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="RevokeModifyRights"> + Souhaitez-vous retirer les droits d'édition à [FIRST_NAME] [LAST_NAME] ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + Souhaitez-vous retirer les droits d'édition aux résidents selectionnés ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="UnableToCreateGroup"> + Impossible de créer le groupe. +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ignorer les modifications" yestext="Enregistrer les modifications"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + Pour envoyer une notice au groupe, vous devez indiquer un sujet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + Vous êtes sur le point d'ajouter des membres du groupe dans le rôle de [ROLE_NAME]. +Les membres ne peuvent pas être destitués de ce rôle. +Ils doivent donner eux-mêmes leur démission. +Êtes-vous certain de vouloir continuer ? + <usetemplate ignoretext="Confirmer avant d'ajouter un nouveau propriétaire" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="AssignDangerousActionWarning"> + Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». + *Avertissement* + Tout membre disposant de ce pouvoir peut s'affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d'attribuer ce pouvoir. + +Ajouter ce pouvoir à « [ROLE_NAME] » ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». + + *Avertissement* + Tout membre dans un rôle avec ce pouvoir peut s'attribuer à lui-même, ainsi qu'à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. + +Ajouter ce pouvoir à « [ROLE_NAME] » ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="JoinGroupCanAfford"> + Rejoindre ce groupe coûte [COST] L$. +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. + </notification> + <notification name="CreateGroupCost"> + La création de ce groupe coûte 100 L$. +Les groupes doivent comporter plus d'un membre, sinon ils sont supprimés. +Veuillez inviter des membres d'ici 48 heures. + <usetemplate canceltext="Annuler" name="okcancelbuttons" notext="Annuler" yestext="Créer un groupe pour 100 L$"/> + </notification> + <notification name="LandBuyPass"> + Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + Pour rendre l'annonce disponible à tous, le prix de vente doit être supérieur à 0 L$. +Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique. + </notification> + <notification name="ConfirmLandSaleChange"> + Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. +Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + Attention : en cliquant sur Vendre à n'importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région. + +Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. +Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l'inventaire du propriétaire précédent ? + +*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ? + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedBySelf"> + Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ? + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedBySelf"> + Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l'inventaire de leur propriétaire ? +Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. + +*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByUser"> + Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l'inventaire de leur propriétaire ? +Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. + +*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l'inventaire de leur propriétaire ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + Êtes-vous certain de vouloir désactiver tous les objets dans cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ? + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + Impossible de désactiver les scripts. +Les dégâts sont autorisés dans toute la région. +Pour que les armes fonctionnent, les scripts doivent être autorisés. + </notification> + <notification name="MustBeInParcel"> + Pour définir le point d'atterrissage, vous devez vous trouver à l'intérieur de la parcelle. + </notification> + <notification name="PromptRecipientEmail"> + Veuillez saisir une adresse e-mail valide pour le(s) destinataire(s). + </notification> + <notification name="PromptSelfEmail"> + Veuillez saisir votre adresse e-mail. + </notification> + <notification name="PromptMissingSubjMsg"> + Envoyer la photo avec le sujet ou le message par défaut ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ErrorProcessingSnapshot"> + Erreur dans le traitement des données de la photo + </notification> + <notification name="ErrorEncodingSnapshot"> + Erreur d'encodage de la photo. + </notification> + <notification name="ErrorUploadingPostcard"> + Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + Une erreur est survenue lors du chargement de la capture d'écran destinée au rapport, suite au problème suivant : [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d'utilisation. + </notification> + <notification name="CouldNotPutOnOutfit"> + Impossible de mettre cet ensemble. +Ce dossier ne contient pas d'habits, de parties du corps ni de pièces jointes. + </notification> + <notification name="CannotWearTrash"> + Vous ne pouvez pas porter d'habits ni de parties du corps se trouvant dans la corbeille. + </notification> + <notification name="CannotWearInfoNotComplete"> + 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. +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 ? + <url name="url"> + https://join.secondlife.com/index.php?lang=fr-FR + </url> + <usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/> + </notification> + <notification name="AddClassified"> + Les petites annonces sont publiées à l'onglet Petites annonces de la section Recherche pendant une semaine. +Rédigez votre annonce, puis cliquez sur Publier pour l'ajouter à la liste des annonces. +Au moment de cliquer sur Publier, vous serez invité à payer des frais. +Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés. + <usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DeleteClassified"> + Supprimer l'annonce [NAME] ? +Une fois payés, les frais ne sont pas remboursables. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ClassifiedSave"> + Enregistrer les changements dans l'annonce [NAME] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> + </notification> + <notification name="DeleteAvatarPick"> + Supprimer le favori [PICK] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + Aller à la page web de [SECOND_LIFE] réservée aux événements ? + <url name="url"> + http://secondlife.com/events/?lang=fr-FR + </url> + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + Veuillez sélectionner une proposition. + </notification> + <notification name="SelectHistoryItemToView"> + Veuillez sélectionner un historique. + </notification> + <notification name="ResetShowNextTimeDialogs"> + Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SkipShowNextTimeDialogs"> + Voulez-vous désactiver tous les pop-ups qui peuvent être évités ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CacheWillClear"> + Le cache sera vidé après le redémarrage de [APP_NAME]. + </notification> + <notification name="CacheWillBeMoved"> + Le cache sera déplacé après le redémarrage de [APP_NAME]. +Remarque : cela videra le cache. + </notification> + <notification name="ChangeConnectionPort"> + Les paramètres du port prendront effet après le redémarrage de [APP_NAME]. + </notification> + <notification name="ChangeSkin"> + Le nouveau thème apparaîtra après le redémarrage de [APP_NAME]. + </notification> + <notification name="GoToAuctionPage"> + Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ? + <url name="url"> + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + </url> + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + Enregistrer les changements ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + L'enregistrement du geste a échoué. +Il y a trop d'étapes dans ce geste. +Essayez d'en supprimer quelques-unes. + </notification> + <notification name="GestureSaveFailedTryAgain"> + L'enregistrement du geste a échoué. Veuillez réessayer dans une minute. + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + Le geste n'a pas pu être enregistré car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="GestureSaveFailedReason"> + Une erreur est survenue lors de l'enregistrement du geste, suite au problème suivant : [REASON]. Essayez d'enregistrer votre geste ultérieurement. + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + La note n'a pas pu être enregistrée car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="SaveNotecardFailReason"> + Une erreur est survenue lors de l'enregistrement de la note, suite au problème suivant : [REASON]. Essayez d'enregistrer votre note ultérieurement. + </notification> + <notification name="ScriptCannotUndo"> + Impossible d'annuler tous les changements dans votre version du script. +Souhaitez-vous charger la dernière version enregistrée sur le serveur ? +(**Attention** Cette opération est irréversible.) + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + Une erreur est survenue lors de l'enregistrement du script, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. + </notification> + <notification name="SaveScriptFailObjectNotFound"> + Impossible d'enregistrer le script car l'objet qui le contient est introuvable. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="SaveBytecodeFailReason"> + Une erreur est survenue lors de l'enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. + </notification> + <notification name="StartRegionEmpty"> + Vous n'avez pas défini de région de départ. +Veuillez saisir le nom de la région dans la case Lieu de départ, ou choisissez Dernier emplacement ou Domicile comme Lieu de départ. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + Impossible de lancer ou d'arrêter le script car l'objet qui le contient est introuvable. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="CannotDownloadFile"> + Impossible de télécharger le fichier + </notification> + <notification name="CannotWriteFile"> + 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 section [SUPPORT_SITE] n'offre aucune aide pour les problèmes de configuration système. + +MINSPECS +Voulez-vous visiter [_URL] pour plus d'informations ? + <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 nous ne connaissons pas actuellement. +Cela est souvent le cas avec le nouveau materiel 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. +(Préférences > Graphiques). + <form name="form"> + <ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] a planté lors de l'initialisation des drivers graphiques. +La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes. +Certaines fonctionnalités graphiques seront donc désactivées. +Nous vous recommandons de mettre à jour les drivers de votre carte graphique. +La qualité des graphiques peut être augmentée à la section Préférences > Graphiques + </notification> + <notification name="RegionNoTerraforming"> + Le terraformage est interdit dans la région [REGION]. + </notification> + <notification name="CannotCopyWarning"> + Vous n'êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="CannotGiveItem"> + Impossible de donner l'objet de l'inventaire. + </notification> + <notification name="TransactionCancelled"> + Transaction annulée. + </notification> + <notification name="TooManyItems"> + Impossible de donner plus de 42 objets au cours d'un seul transfert d'inventaire. + </notification> + <notification name="NoItems"> + Vous n'êtes pas autorisé à transférer les objets sélectionnés. + </notification> + <notification name="CannotCopyCountItems"> + Vous n'êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire. +Souhaitez-vous vraiment donner ces objets ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="CannotGiveCategory"> + Vous n'êtes pas autorisé à transférer le dossier sélectionné. + </notification> + <notification name="FreezeAvatar"> + Geler 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"/> + </notification> + <notification name="FreezeAvatarFullname"> + Geler [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"/> + </notification> + <notification name="EjectAvatarFullname"> + Expulser [AVATAR_NAME] de votre terrain ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Expulser et bannir" yestext="Expulser"/> + </notification> + <notification name="EjectAvatarNoBan"> + Expulser cet avatar de votre terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> + </notification> + <notification name="EjectAvatarFullnameNoBan"> + Expulser [AVATAR_NAME] de votre terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> + </notification> + <notification name="AcquireErrorTooManyObjects"> + Erreur d'acquisition : trop d'objets sélectionnés. + </notification> + <notification name="AcquireErrorObjectSpan"> + Erreur d'acquisition : les objets sont répartis dans plus d'une région. +Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région. + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +Aller sur [_URL] pour obtenir des informations sur l'achat de L$ ? + <url name="url"> + http://secondlife.com/app/currency/?lang=fr-FR + </url> + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + Impossible de lier ces [COUNT] objets. +Vous pouvez lier un maximum de [MAX] objets. + </notification> + <notification name="CannotLinkIncompleteSet"> + Vous ne pouvez lier que des ensembles d'objets complets et vous devez choisir un minimum de deux objets. + </notification> + <notification name="CannotLinkModify"> + Impossible de lier car vous n'avez pas le droit de modifier tous les objets. + +Assurez-vous que vous êtes le propriétaire de tous les objets et qu'aucun d'eux n'est verrouillé. + </notification> + <notification name="CannotLinkDifferentOwners"> + Impossible de lier car les objets n'ont pas tous le même propriétaire. + +Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés. + </notification> + <notification name="NoFileExtension"> + Pas d'extension pour le fichier suivant : '[FILE]' + +Assurez-vous que le fichier a l'extension correcte. + </notification> + <notification name="InvalidFileExtension"> + Extension de fichier [EXTENSION] invalide +[VALIDS] attendu + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + Impossible de lire le fichier son chargé : +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + Il semble que le fichier ne soit pas un fichier RIFF WAVE : +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + Il semble que le fichier ne soit pas un fichier audio PCM WAVE : +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) : +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + Le fichier ne semble pas être pris en charge (doit être 44,1 k) : +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) : +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + Impossible de trouver les données dans l'en-tête WAV : +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + Le fichier audio est trop long (10 secondes maximum) : +[FILE] + </notification> + <notification name="ProblemWithFile"> + Problème avec le fichier [FILE] : + +[ERROR] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + Impossible d'ouvrir le fichier son compressé temporaire : [FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + Échec d'encodage Vorbis inconnu sur : [FILE] + </notification> + <notification name="CannotEncodeFile"> + Impossible d'encoder le fichier : [FILE] + </notification> + <notification name="CorruptResourceFile"> + Fichier ressource corrompu : [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + Version de fichier ressource Linden inconnu : [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + Impossible de créer le fichier de sortie : [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + Actuellement, APP_NAME] ne prend pas en charge le chargement de lots de fichiers d'animation. + </notification> + <notification name="CannotUploadReason"> + Impossible de charger [FILE] suite au problème suivant : [REASON] +Veuillez réessayer ultérieurement. + </notification> + <notification name="LandmarkCreated"> + Vous avez ajouté "[LANDMARK_NAME]" à votre dossier [FOLDER_NAME]. + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l'autorise pas. + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + Impossible d'effectuer les recompilations. +Sélectionnez un objet avec un script. + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + Impossible d'effectuer les recompilations. + +Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + Impossible d'effectuer la réinitialisation. + +Veuillez sélectionner des objets avec des scripts. + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + Impossible d'effectuer la réinitialisation. + +Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + Impossible de définir les scripts sur « exécution ». + +Veuillez sélectionner des objets avec des scripts. + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + Impossible de définir les scripts sur « non-exécution ». + +Veuillez sélectionner des objets avec des scripts. + </notification> + <notification name="NoFrontmostFloater"> + Aucun floater frontmost à sauvegarder. + </notification> + <notification name="SeachFilteredOnShortWords"> + Votre requête a été modifiée et les mots trops courts ont été supprimés. + +Recherche effectuée : [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + Vos termes de recherche étaient trop courts et aucune recherche n'a été effectuée. + </notification> + <notification name="CouldNotTeleportReason"> + Impossible de téléporter. +[REASON] + </notification> + <notification 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. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. +Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. + </notification> + <notification name="nolandmark_tport"> + Désolé, le système n'a pas réussi à localiser la destination de votre repère. + </notification> + <notification name="timeout_tport"> + Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. +Veuillez réessayer dans un moment. + </notification> + <notification name="noaccess_tport"> + Désolé, vous n'avez pas accès à cette destination. + </notification> + <notification name="missing_attach_tport"> + Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. + </notification> + <notification name="too_many_uploads_tport"> + Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. + </notification> + <notification name="expired_tport"> + Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </notification> + <notification name="expired_region_handoff"> + Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </notification> + <notification name="no_host"> + Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. + </notification> + <notification name="no_inventory_host"> + L'inventaire est temporairement indisponible. + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + Impossible de définir le propriétaire foncier : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + Impossible de définir un propriétaire car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer. + </notification> + <notification name="ForceOwnerAuctionWarning"> + Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Souhaitez-vous définir un propriétaire ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + Problème : +Aucune parcelle sélectionnée. + </notification> + <notification name="CannotContentifyNoRegion"> + Problème : +Aucune région sélectionnée. + </notification> + <notification name="CannotReleaseLandNothingSelected"> + Impossible d'abandonner le terrain : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotReleaseLandNoRegion"> + Impossible d'abandonner le terrain : +la région est introuvable. + </notification> + <notification name="CannotBuyLandNothingSelected"> + Impossible d'acheter le terrain : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotBuyLandNoRegion"> + Impossible d'acheter le terrain : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotCloseFloaterBuyLand"> + Vous ne pouvez pas fermer la fenêtre Acheter le terrain avant que [APP_NAME] n'estime le montant de cette transaction. + </notification> + <notification name="CannotDeedLandNothingSelected"> + Cession du terrain impossible : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotDeedLandNoGroup"> + Cession du terrain impossible : +aucun groupe sélectionné. + </notification> + <notification name="CannotDeedLandNoRegion"> + Cession du terrain impossible : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotDeedLandMultipleSelected"> + Cession du terrain impossible : +plusieurs parcelles sélectionnées. + +Essayez de ne sélectionner qu'une seule parcelle. + </notification> + <notification name="ParcelCanPlayMedia"> + Cette parcelle propose des flux média. +Pour jouer des flux média, il faut avoir une connexion internet rapide. + +Jouer les flux média lorsqu'ils sont disponibles ? +(Vous pourrez modifier cette option ultérieurement sous Préférences > Audio et vidéo.) + <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. + +Merci de réessayer. + </notification> + <notification name="CannotDeedLandNoTransfer"> + Cession du terrain impossible : +la cession de terrain est interdite dans la région [REGION]. + </notification> + <notification name="CannotReleaseLandWatingForServer"> + Impossible d'abandonner le terrain : +mise à jour des informations sur la parcelle sur le point d'être envoyée par le serveur. + +Veuillez réessayer dans quelques secondes. + </notification> + <notification name="CannotReleaseLandSelected"> + Impossible d'abandonner le terrain : +vous n'êtes pas le propriétaire des parcelles sélectionnées. + +Veuillez sélectionner une seule parcelle. + </notification> + <notification name="CannotReleaseLandDontOwn"> + Impossible d'abandonner le terrain : +vous n'avez pas le droit de libérer cette parcelle. +Les parcelles qui vous appartiennent sont en vert. + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + Impossible d'abandonner le terrain : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotReleaseLandNoTransfer"> + Impossible d'abandonner le terrain : +le transfert de terrain est interdit dans la région [REGION]. + </notification> + <notification name="CannotReleaseLandPartialSelection"> + Impossible d'abandonner le terrain : +vous devez sélectionner une parcelle entière pour la libérer. + +Sélectionnez toute la parcelle ou divisez-la d'abord. + </notification> + <notification name="ReleaseLandWarning"> + Vous vous apprêtez à libérer [AREA] m² de terrain. +Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$. + +Libérer ce terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + Division du terrain impossible : + +aucune parcelle sélectionnée. + </notification> + <notification name="CannotDivideLandPartialSelection"> + Division du terrain impossible : + +Toute la parcelle est sélectionnée. +Sélectionnez une partie de la parcelle uniquement. + </notification> + <notification name="LandDivideWarning"> + Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut. + +Diviser le terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + Division du terrain impossible : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotJoinLandNoRegion"> + Impossible de fusionner le terrain : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotJoinLandNothingSelected"> + Impossible de fusionner le terrain : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + Impossible de fusionner le terrain : +vous avez sélectionné une seule parcelle. + +Sélectionnez le terrain sur les deux parcelles. + </notification> + <notification name="CannotJoinLandSelection"> + Impossible de fusionner le terrain : +vous devez sélectionner au moins deux parcelles. + +Sélectionnez le terrain sur les deux parcelles. + </notification> + <notification name="JoinLandWarning"> + En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné. +Vous devrez réinitialiser le nom et les options de la nouvelle parcelle. + +Fusionner le terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + Cette note doit être sauvegardée avant que l'objet ne puisse être copié ou visualisé. Enregistrer la note ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + Copier cet objet dans votre inventaire ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Copier"/> + </notification> + <notification name="ResolutionSwitchFail"> + Échec du changement de résolution (à [RESX], de [RESY]) + </notification> + <notification name="ErrorUndefinedGrasses"> + Erreur : herbes non identifiées : [SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + Erreur : arbres non identifiés : [SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d'abord libérer de la mémoire sur votre ordinateur. + </notification> + <notification name="CannotSaveToAssetStore"> + Impossible de sauvegarder le fichier [NAME] dans la base de données centrale. +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] : + [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"> + Impossible d'acheter du terrain pour le groupe : +Vous n'avez pas le droit d'acheter de terrain pour votre groupe. + </notification> + <notification label="Devenir amis" name="AddFriend"> + Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. + +Proposer à [NAME] de devenir votre ami(e) ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Devenir amis" name="AddFriendWithMessage"> + Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. + +Proposer à [NAME] de devenir votre ami(e) ? + <form name="form"> + <input name="message"> + Voulez-vous être mon ami(e) ? + </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"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + Voulez-vous supprimer plusieurs résidents de votre liste d'amis ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedPublicObjectsByUser"> + Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedObjectsByUser"> + Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GodDeleteAllObjectsByUser"> + Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BlankClassifiedName"> + Vous devez choisir un nom pour votre petite annonce. + </notification> + <notification name="MinClassifiedPrice"> + Le coût de l'annonce doit être de [MIN_PRICE] L$ minimum. + +Veuillez saisir un montant plus élevé. + </notification> + <notification name="ConfirmObjectDeleteLock"> + Au moins un des objets que vous avez sélectionnés est verrouillé. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + Au moins un des objets que vous avez sélectionnés n'est pas copiable. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + Au moins un des objets que vous avez sélectionnés ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + Au moins un des objets est verrouillé. +Au moins un des objets n'est pas copiable. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + Au moins un des objets est verrouillé. +Au moins un des objets ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + Au moins un des objets n'est pas copiable. +Au moins un des objets ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + Au moins un des objets est verrouillé. +Au moins un des objets n'est pas copiable. +Au moins un des objets ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + Au moins un des objets est verrouillé. + +Êtes-vous certain de vouloir prendre ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + Vous n'êtes pas le propriétaire de tous les objets que vous prenez. +Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. + +Êtes-vous certain de vouloir prendre ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + Au moins un des objets est verrouillé. +Vous n'êtes pas le propriétaire de tous les objets que vous prenez. +Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. +Par contre, vous pouvez prendre les objets sélectionnés. + +Êtes-vous certain de vouloir prendre ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + Impossible d'acheter le terrain car la sélection couvre plusieurs régions. + +Veuillez sélectionner une zone plus petite et réessayer. + </notification> + <notification name="DeedLandToGroup"> + Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. +Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. + +Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. +La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME]. +Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. + +Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + Les paramètres d'affichage sont au niveau le plus sûr, comme vous l'aviez indiqué. + </notification> + <notification name="DisplaySetToRecommended"> + Vos paramètres d'affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système. + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + </notification> + <notification name="AvatarMovedDesired"> + La destination que vous avez choisie n'est pas disponible actuellement. +Vous avez été téléporté vers une région voisine. + </notification> + <notification name="AvatarMovedLast"> + Votre dernière destination n'est pas disponible actuellement. +Vous avez été téléporté vers une région voisine. + </notification> + <notification name="AvatarMovedHome"> + La destination que vous avez choisie n'est pas disponible actuellement. +Vous avez été téléporté vers une région voisine. +Nous vous conseillons de définir votre domicile ailleurs. + </notification> + <notification name="ClothingLoading"> + Vos vêtements sont en cours de téléchargement. +Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voient correctement. + <form name="form"> + <ignore name="ignore" text="Vos habits prennent du temps à télécharger"/> + </form> + </notification> + <notification name="FirstRun"> + L'installation de [APP_NAME] est terminée. + +S'il s'agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter. +Retourner sur [https://join.secondlife.com/index.php?lang=fr-FR secondlife.com] pour créer un nouveau compte ? + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + Nous avons des difficultés à vous connecter. Il y a peut-être un problème avec votre connexion Internet ou la [SECOND_LIFE_GRID]. + +Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d'aller chez vous. + <url name="url"> + http://fr.secondlife.com/support/ + </url> + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="Aide"/> + <button name="Teleport" text="Téléporter"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + Votre personnage va apparaître dans un moment. + +Pour marcher, utilisez les flèches de direction. +Appuyez sur F1 pour obtenir de l'aide ou en savoir plus sur [SECOND_LIFE]. +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="NotEnoughCurrency"> + [NAME] [PRICE] L$ Vous n'avez pas suffisamment de L$ pour faire cela. + </notification> + <notification name="GrantedModifyRights"> + [FIRST_NAME] [LAST_NAME] vous avez donné la permission de modifier ses objets. + </notification> + <notification name="RevokedModifyRights"> + Vous n'avez plus le droit de modifier les objets de [FIRST_NAME] [LAST_NAME]. + </notification> + <notification name="FlushMapVisibilityCaches"> + Cela videra le cache cartographique de cette région. +Cela n'est vraiment utile que pour faire du débugage. +(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.) + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + Impossible d'acheter plus d'un objet à la fois. Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + Impossible de copier les contenus de plus d'un objet à la fois. +Veuillez ne sélectionner qu'un seul objet. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + Téléporter tous les résidents de cette région chez eux ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + Etes-vous certain de vouloir renvoyer les objets appartenant à [USER_NAME] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + Impossible de definir les textures de la région : +La texture du terrain [TEXTURE_NUM] a une profondeur invalide ([TEXTURE_BIT_DEPTH]). + +Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. + </notification> + <notification name="InvalidTerrainSize"> + Impossible de definir les textures de la région : +La texture du terrain [TEXTURE_NUM] est trop volumineuse ([TEXTURE_SIZE_X] X [TEXTURE_SIZE_Y]). + +Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. + </notification> + <notification name="RawUploadStarted"> + Le chargement a commencé. Cela va prendre une à deux minutes, +suivant votre vitesse de connexion. + </notification> + <notification name="ConfirmBakeTerrain"> + Etes-vous sûr(e) de vouloir figer le relief actuel, en faire le point central des limites d'élévation/abaissement de relief et la valeur par défaut du bouton Annuler modification ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents. + </notification> + <notification name="MaxBannedAgentsOnRegion"> + Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents. + </notification> + <notification name="MaxAgentOnRegionBatch"> + Echec lors de la tentative d'ajout de [NUM_ADDED] agents : +Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Figer"/> + </notification> + <notification name="MaxManagersOnRegion"> + Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine. + </notification> + <notification name="OwnerCanNotBeDenied"> + Impossible d'ajouter le propriétaire du domaine à la liste des résidents bannis. + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + Impossible de changer d'apparence jusqu'à ce que les habits et la silhouette soient chargés. + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n'est pas autorisée. + </notification> + <notification name="CantSetBuyObject"> + Cet objet n'est pas à vendre. +Veuillez choisir un objet à vendre et réessayer. + </notification> + <notification name="FinishedRawDownload"> + Chargement du fichier de terrain raw effectué vers : +[DOWNLOAD_PATH]. + </notification> + <notification name="DownloadWindowsMandatory"> + Une nouvelle version de [APP_NAME] est disponible. +[MESSAGE] +Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. + <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> + </notification> + <notification name="DownloadWindows"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadLinuxMandatory"> + Une nouvelle version de [APP_NAME] est disponible. +[MESSAGE] +Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. + <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> + </notification> + <notification name="DownloadLinux"> + Une mise à jour de [SECOND_LIFE] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Une mise à jour de [SECOND_LIFE] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadMacMandatory"> + Une nouvelle version de [APP_NAME] est disponible. +[MESSAGE] +Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. + +Télécharger vers le dossier Applications ? + <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> + </notification> + <notification name="DownloadMac"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + +Télécharger vers le dossier Applications ? + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + +Télécharger vers le dossier Applications ? + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DeedObjectToGroup"> + Si vous cédez cet objet, le groupe : +* recevra les L$ versés pour l'objet ; + <usetemplate ignoretext="Confimer avant que je ne cède un objet à un groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Voulez-vous ouvrir votre navigateur web système pour afficher ce contenu ? + <usetemplate ignoretext="Ouvrir mon navigateur pour consulter une page web" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + Aller sur secondlife.com pour gérer votre compte ? + <usetemplate ignoretext="Lancer mon navigateur pour gérer mon compte" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + Pour apprendre à signaler un problème de sécurité, consultez le Wiki de [SECOND_LIFE]. + <usetemplate ignoretext="Lancer mon navigateur pour apprendre comment signaler un problème de sécurité" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + Consultez le Wiki sur l'Assurance Qualité de [SECOND_LIFE]. + <usetemplate ignoretext="Lancer mon navigateur web pour consulter la page Wiki sur l'Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + Pour signaler des bugs et autres problèmes, utilisez le JIRA de [SECOND_LIFE]. + <usetemplate ignoretext="Lancer mon navigateur pour utiliser le Public Issue Tracker (JIRA)" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Visitez le blog officiel des Lindens pour les dernières nouvelles et informations. + <usetemplate ignoretext="Lancer mon navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> + </notification> + <notification name="WebLaunchLSLGuide"> + Voulez-vous ouvrir le guide pour l'écriture de scripts ? + <usetemplate ignoretext="Lancer mon navigateur web pour consulter le guide pour l'écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + Voulez-vous ouvrir le portail LSL pour l'écriture de scripts ? + <usetemplate ignoretext="Lancer mon navigateur web pour consulter le portail LSL" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> + </notification> + <notification name="ReturnToOwner"> + Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire. + +*Avertissement* Les objets non transférables seront supprimés ! + <usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + Vous êtes actuellement membre du groupe [GROUP]. +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"/> + </notification> + <notification name="MuteLinden"> + Désolé, vous ne pouvez pas ignorer un Linden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + Vous ne pouvez pas démarrer des enchères sur une parcelle déjà en vente. Si vous êtes certain de vouloir démarrer des enchères, mettez fin à la vente. + </notification> + <notification label="Échec de la fonction Ignorer les objets par nom" name="MuteByNameFailed"> + Vous ignorez déjà ce résident. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RemoveItemWarn"> + Si vous supprimez des contenus, vous risquez d'endommager l'objet. Souhaitez-vous supprimer cet objet ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CantOfferCallingCard"> + Impossible d'offrir une carte de visite actuellement. Veuillez réessayer dans un moment. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CantOfferFriendship"> + Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="BusyModeSet"> + Le mode Occupé est sélectionné. +Les chats et les messages instantanés ne s'afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d'inventaire iront dans la corbeille. + <usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/> + </notification> + <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="KickUser"> + Éjecter cet utilisateur avec quel message ? + <form name="form"> + <input name="message"> + Un administrateur vous a déconnecté. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="KickAllUsers"> + Éjecter tous les résidents actuellement en ligne avec quel message ? + <form name="form"> + <input name="message"> + Un administrateur vous a déconnecté. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="FreezeUser"> + Geler cet utilisateur 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). + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="UnFreezeUser"> + Dégeler cet utilisateur avec quel message ? + <form name="form"> + <input name="message"> + Vous n'êtes plus gelé. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="OfferTeleport"> + Proposez une téléportation avec le message suivant ? + <form name="form"> + <input name="message"> + On se rejoint à [REGION] ? + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + Demander au résident de venir vous rejoindre ? + <form name="form"> + <input name="message"> + On se rejoint à [REGION] ? + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + Êtes-vous certain de vouloir être téléporté ? + <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"> + Téléporter vers [PICK] ? + <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans mes Préférences" 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"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <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. + +Continuer ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Modifier l'accès à un domaine Linden" name="ChangeLindenAccess"> + Vous vous apprêtez à modifier la liste d'accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.). + +Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l'intérieur/extérieur de la grille. +Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedAgentAdd"> + Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedAgentRemove"> + Supprimer de la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedGroupAdd"> + Ajouter à la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedGroupRemove"> + Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateBannedAgentAdd"> + Refuser l'accès à ce domaine uniquement ou à [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateBannedAgentRemove"> + Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateManagerAdd"> + Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateManagerRemove"> + Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Confirmer" name="EstateKickUser"> + Éjecter [EVIL_USER] de ce domaine ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="EstateChangeCovenant"> + Êtes-vous certain de vouloir modifier le règlement du domaine ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked"> + Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. + +Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. + +Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr + </url> + <usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + 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. + +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 Édition > Préférences... > Général. + <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="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. + +Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + Votre catégorie d'accès ne vous permet pas de réclamer cette région. + +Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr + </url> + <usetemplate ignoretext="Je ne peux pas réclamer cette région car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + Votre catégorie d'accès ne vous autorise pas à réclamer cette région. + </notification> + <notification name="LandClaimAccessBlocked_Change"> + Votre catégorie d'accès ne vous permet pas de réclamer 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 Édition > Préférences... > Général. + <usetemplate ignoretext="La catégorie de contenu que j'ai choisie m'empêche de réclamer un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> + </notification> + <notification name="LandBuyAccessBlocked"> + Votre catégorie d'accès ne vous permet pas d'acheter cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. + +Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + Votre catégorie d'accès ne vous permet pas d'acheter cette région. + +Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr + </url> + <usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + Votre catégorie d'accès ne vous permet pas d'acheter cette région. + </notification> + <notification name="LandBuyAccessBlocked_Change"> + Votre catégorie d'accès ne vous autorise pas à acheter 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 Édition > Préférences... > Général. + <usetemplate ignoretext="La catégorie de contenu que j'ai choisie m'empêche d'acheter un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> + </notification> + <notification name="TooManyPrimsSelected"> + "Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer." + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemImportingEstateCovenant"> + Problème lors de l'importation du règlement du domaine. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemAddingEstateManager"> + Problèmes lors de l'ajout d'un nouveau gérant de domaine. Il est possible qu'au moins un des domaines ait une liste de gérants complète. + </notification> + <notification name="ProblemAddingEstateGeneric"> + Problème lors de l'ajout à la liste de ce domaine. Il est possible qu'au moins un des domaines ait une liste complète. + </notification> + <notification name="UnableToLoadNotecardAsset"> + Impossible de charger les données de la note actuellement. + </notification> + <notification name="NotAllowedToViewNotecard"> + Permissions pour afficher la note insuffisantes. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + Les références de la note ne se trouvent pas dans la base de données. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + Rappel : les frais pour passer des petites annonces ne sont pas remboursables. + +Publier cette petite annonce maintenant pour [AMOUNT] L$ ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + Cette petite annonce contient-elle du contenu Mature ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="SetGroupMature"> + Ce groupe contient-il du contenu Mature ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification label="Confirmer le redémarrage" name="ConfirmRestart"> + Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Envoyer un message à la région" name="MessageRegion"> + Saisissez une message qui sera envoyé à tous les résidents présents dans cette région. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification label="Catégorie de la région modifiée" name="RegionMaturityChange"> + La catégorie d'accès de cette région a été mise à jour. +Ce changement n'apparaîtra pas immédiatement sur la carte. + </notification> + <notification label="Versions de voix non compatibles" name="VoiceVersionMismatch"> + Cette version de [APP_NAME] n'est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour [APP_NAME] pour que le chat vocal fonctionne correctement. + </notification> + <notification label="Impossible d'acheter des objets" name="BuyObjectOneOwner"> + Impossible d'acheter simultanément des objets de propriétaires différents. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOnly"> + Impossible d'acheter les contenus de plus d'un objet à la fois. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOwner"> + Impossible d'acheter simultanément des objets de propriétaires différents. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification name="BuyOriginal"> + Acheter l'objet original pour [PRICE] L$ à [PRICE] ? +Vous deviendrez le propriétaire de cet objet. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + Acheter l'objet original pour [PRICE] L$ ? +Vous deviendrez le propriétaire de cet objet. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + Acheter une copie pour [PRICE] L$ à [OWNER] ? +L'objet sera copié dans votre inventaire. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + Acheter une copie pour [PRICE] L$ ? +L'objet sera copié dans votre inventaire. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyContents"> + Acheter des contenus pour [PRICE] L$ à [OWNER] ? +Ils seront copiés dans votre inventaire. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + Acheter des contenus pour [PRICE] L$ ? +Ils seront copiés dans votre inventaire. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmPurchase"> + Suite à cette transaction, vous allez : +[ACTION] + +Êtes-vous certain de vouloir effectuer cette transaction ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmPurchasePassword"> + Suite à cette transaction, vous allez : +[ACTION] + +Êtes-vous certain de vouloir effectuer cette transaction ? +Veuillez saisir à nouveau votre mot de passe et cliquer sur OK. + <form name="form"> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="SetPickLocation"> + Remarque : +vous avez mis à jour l'emplacement de ce favori mais les autres détails resteront inchangés. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + Vous avez sélectionné des objets non copiables. +Ces objets seront déplacés dans votre inventaire et non pas copiés. + +Déplacer les objets de l'inventaire ? + <usetemplate ignoretext="M'avertir avant que je ne déplace des objets pour lesquels la copie est interdite" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + Vous avez sélectionné des objets de l'inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés. +L'objet les contenant est scripté, déplacer ces objets peut causer des problèmes au niveau du script. + +Déplacer les objets de l'inventaire ? + <usetemplate ignoretext="M'avertir avant que je ne déplace des objets pour lesquels la copie est interdite et qui pourraient casser des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + Avertissement : l'action du clic Payer l'objet a été définie mais ne fonctionnera que si un script est ajouté avec l'event money(). + <form name="form"> + <ignore name="ignore" text="Je définis l'action du clic Payer l'objet lorsque je construis un objet sans le script money()"/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + Vous n'êtes autorisé à copier aucun élément dans cet objet. + </notification> + <notification name="WebLaunchAccountHistory"> + Aller sur secondlife.com pour consulter l'historique de votre compte ? + <usetemplate ignoretext="Lancer mon navigateur pour consulter l'historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> + </notification> + <notification name="ConfirmQuit"> + Êtes-vous certain de vouloir quitter ? + <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?lang=fr-FR Conditions d'utilisation] et aux [http://secondlife.com/corporate/cs.php?lang=fr-FR Règles de la communauté]. + +Lorsqu'elles sont signalées, toutes les infractions aux Conditions d'utilisation et aux Règles de la communauté font l'objet d'une enquête et sont résolues. Pour accéder aux détails de la résolution d'un incident, allez sur : + +http://secondlife.com/support/incidentreport.php + </notification> + <notification name="HelpReportAbuseEmailEO"> + Important : ce rapport ira au propriétaire de la région dans laquelle vous êtes et non à Linden Lab. + +Pour aider les résidents et les visiteurs, le propriétaire de la région dans laquelle vous êtes a choisi de recevoir et de s'occuper de tous les rapports envoyés à partir de cette région. Linden Lab n'enquêtera pas sur les rapports que vous envoyez à partir de cet endroit. + +Le propriétaire de la région traitera les rapports en fonction des règles de cette région, comme indiqué dans le réglement du domaine. +(Les réglements sont visibles à partir du menu Monde > À propos du terrain.) + +La résolution de ce rapport ne s'applique qu'à cette région ; L'accès aux autres endroits de [SECOND_LIFE] ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l'accès à l'ensemble de [SECOND_LIFE]. + </notification> + <notification name="HelpReportAbuseSelectCategory"> + Veuillez choisir une catégorie pour ce rapport d'infraction. +Le choix d'une catégorie nous permet de traiter les rapports d'infraction plus rapidement. + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + Veuillez saisir le nom du contrevenant. +Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + Veuillez indiquer l'endroit où l'infraction a eu lieu. +Les informations précises et exactes nous permettent de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + Veuillez saisir un récapitulatif de l'infraction. +Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + Veuillez saisir une description détaillée de l'infraction. +Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l'incident que vous signalez. +Les descriptions précises nous permettent de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + Cher résident, + +Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction : + +(1) Remplissez un rapport d'infraction. Vous pouvez soumettre un rapport d'infraction si vous pensez qu'un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l'encontre du résident non respectueux des Conditions d'utilisation ou des règles de la communauté. Sachez toutefois que l'équipe chargée des infractions ne supprimera pas de contenu à l'intérieur de [SECOND_LIFE]. + +(2) Demandez à ce que du contenu à l'intérieur de [SECOND_LIFE] soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d'infraction valide, tel que fourni dans notre Règlement contre les violations des droit d'auteurs (DMCA), à http://secondlife.com/corporate/dmca.php. + +Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport. Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits. + +Merci, + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + Les composantes requises suivantes ne se trouvent pas dans [FLOATER]: +[COMPONENTS] + </notification> + <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"> + <ignore name="ignore" save_option="true" text="Remplacer une pièce-jointe existante par l'objet sélectionné"/> + <button ignore="Remplacer automatiquement" name="Yes" text="OK"/> + <button ignore="Ne jamais remplacer" name="No" text="Annuler"/> + </form> + </notification> + <notification label="Réponse si occupé(e)" name="BusyModePay"> + Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement. + +Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ? + <form name="form"> + <ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/> + <button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/> + <button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/> + </form> + </notification> + <notification name="ConfirmEmptyTrash"> + Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente ? + <usetemplate ignoretext="Confimer avant de vider la corbeille" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + Êtes-vous certain de vouloir supprimer l'historique de vos visites et recherches ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="ConfirmClearCookies"> + Êtes-vous certain de vouloir supprimer vos cookies ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ? + <usetemplate ignoretext="Confimer avant de vider le dossier Objets trouvés" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="CopySLURL"> + La SLurl suivante a été copiée dans votre presse-papier : + [SLURL] + +Liez-la à partir d'une page web pour permettre aux autres résidents d'accéder facilement à cet endroit ou bien collez-la dans la barre d'adresse de votre navigateur. + <form name="form"> + <ignore name="ignore" text="La SLurl est copiée dans mon presse-papier"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + Voulez-vous écraser l'option précédemment enregistrée ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="WLDeletePresetAlert"> + Voulez-vous supprimer [SKY] ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="WLNoEditDefault"> + Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. + </notification> + <notification name="WLMissingSky"> + Une dossier semble manquer au Cycle du jour : [SKY]. + </notification> + <notification name="PPSaveEffectAlert"> + Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="NewSkyPreset"> + Nommez le nouveau ciel. + <form name="form"> + <input name="message"> + Nouveau préréglage + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + Ce préréglage existe déjà  ! + </notification> + <notification name="NewWaterPreset"> + Nommez ce nouveau préréglage d'eau. + <form name="form"> + <input name="message"> + Nouveau préréglage + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + Ce préréglage existe déjà  ! + </notification> + <notification name="WaterNoEditDefault"> + Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. + </notification> + <notification name="ChatterBoxSessionStartError"> + Impossible de démarrer une nouvelle session de chat avec [RECIPIENT]. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + Vous devez terminer votre session de chat avec [NAME]. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + Vous ne pouvez pas acheter un objet s'il fait partie d'une pièce-jointe. + </notification> + <notification label="À propos des requêtes pour les autorisations de débit" name="DebitPermissionDetails"> + Accepter cette requête donne au script l'autorisation de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette autorisation, le propriétaire de l'objet doit supprimer l'objet ou bien réinitialiser les scripts dans l'objet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + Voulez-vous automatiquement porter l'habit que vous allez créer ? + <usetemplate ignoretext="Porter automatiquement tout en modifiant mon apparence" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="NotAgeVerified"> + Pour pouvoir pénétrer dans cette zone, vous devez avoir procédé à la vérification de votre âge. Souhaitez-vous aller sur [SECOND_LIFE] et procéder à la vérification de votre âge ? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php?lang=fr + </url> + <usetemplate ignoretext="Je n'ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement. Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/index.php?lang=fr + </url> + <usetemplate ignoretext="Mes informations de paiement ne sont pas enregistrées" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="MissingString"> + The string [STRING_NAME] is missing from strings.xml + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + Annulé + </notification> + <notification name="CancelledSit"> + Action annulée + </notification> + <notification name="CancelledAttach"> + Attachement annulé + </notification> + <notification name="ReplacedMissingWearable"> + Habits et parties du corps manquants remplacés par les éléments par défaut. + </notification> + <notification name="GroupNotice"> + Sujet : [SUBJECT], Message : [MESSAGE] + </notification> + <notification name="FriendOnline"> + [FIRST] [LAST] est connecté(e) + </notification> + <notification name="FriendOffline"> + [FIRST] [LAST] est déconnecté(e) + </notification> + <notification name="AddSelfFriend"> + Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même. + </notification> + <notification name="UploadingAuctionSnapshot"> + Importation de photos SL et Web en cours... +(prend environ 5 minutes.) + </notification> + <notification name="UploadPayment"> + Le chargement a coûté [AMOUNT] L$. + </notification> + <notification name="UploadWebSnapshotDone"> + Photo Web importée + </notification> + <notification name="UploadSnapshotDone"> + Photo SL importée + </notification> + <notification name="TerrainDownloaded"> + Fichier terrain.raw téléchargé + </notification> + <notification name="GestureMissing"> + Geste [NAME] absent de la base de données. + </notification> + <notification name="UnableToLoadGesture"> + Impossible de charger le geste [NAME]. +Merci de réessayer. + </notification> + <notification name="LandmarkMissing"> + Repère absent de la base de données. + </notification> + <notification name="UnableToLoadLandmark"> + Impossible de charger le repère. Merci de réessayer. + </notification> + <notification name="CapsKeyOn"> + La touche Verr.maj est activée. +Cela risque d'impacter votre mot de passe. + </notification> + <notification name="NotecardMissing"> + Note absente de la base de données. + </notification> + <notification name="NotecardNoPermissions"> + Vous n'avez pas le droit de consulter cette note. + </notification> + <notification name="RezItemNoPermissions"> + Permissions insuffisantes pour rezzer l'objet. + </notification> + <notification name="UnableToLoadNotecard"> + Impossible de lire les données de la note actuellement. + </notification> + <notification name="ScriptMissing"> + Script absent de la base de données. + </notification> + <notification name="ScriptNoPermissions"> + Permissions insuffisantes pour voir le script. + </notification> + <notification name="UnableToLoadScript"> + Impossible de charger le script. Merci de réessayer. + </notification> + <notification name="IncompleteInventory"> + Tous les éléments que vous souhaitez transférer ne sont pas encore disponibles sur le serveur. +Merci d'essayer à nouveau dans une minute. + </notification> + <notification name="CannotModifyProtectedCategories"> + Vous ne pouvez pas modifier de catégories protégées. + </notification> + <notification name="CannotRemoveProtectedCategories"> + Vous ne pouvez pas supprimer de catégories protégées. + </notification> + <notification name="OfferedCard"> + Vous avez offert votre carte de visite à [FIRST] [LAST] + </notification> + <notification name="UnableToBuyWhileDownloading"> + Achat impossible durant le chargement de l'objet. +Merci de réessayer. + </notification> + <notification name="UnableToLinkWhileDownloading"> + Impossible de lier durant le chargement de l'objet. +Merci de réessayer. + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + Vous ne pouvez pas acheter simultanément des objets de propriétaires différents. +Veuillez sélectionner un seul objet. + </notification> + <notification name="ObjectNotForSale"> + Cet objet n'est pas à vendre. + </notification> + <notification name="EnteringGodMode"> + Activation du mode divin : niveau [LEVEL] + </notification> + <notification name="LeavingGodMode"> + Désactivation du mode divin : niveau [LEVEL] + </notification> + <notification name="CopyFailed"> + Vous n'avez pas le droit de copier ceci. + </notification> + <notification name="InventoryAccepted"> + [NAME] a accepté votre envoi. + </notification> + <notification name="InventoryDeclined"> + [NAME] a refusé votre envoi. + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + Votre carte de visite a été acceptée. + </notification> + <notification name="CallingCardDeclined"> + Votre carte de visite a été refusée. + </notification> + <notification name="TeleportToLandmark"> + A présent que vous êtes sur le continent, vous pouvez voyager par téléportation (vers [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Repères (Landmarks). +Choisissez un repère, double-cliquez dessus et cliquez sur Téléporter. + </notification> + <notification name="TeleportToPerson"> + A présent que vous êtes sur le continent, vous pouvez contacter des résidents (tel [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Cartes de visite (Calling Cards). +Choisissez en une, double-cliquez dessus et cliquez sur Message Instantané. + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur. +Veuillez sélectionner un terrain plus petit. + </notification> + <notification name="SearchWordBanned"> + Certains termes de votre recherche ont été exclus car ils ne correspondaient pas aux standards fixés dans les Règles communautaires. + </notification> + <notification name="NoContentToSearch"> + Veuillez sélectionner au moins un type de contenu à rechercher (PG, Mature ou Adulte) + </notification> + <notification name="GroupVote"> + [NAME] a proposé un vote pour : +[MESSAGE] + <form name="form"> + <button name="VoteNow" text="Voter"/> + <button name="Later" text="Plus tard"/> + </form> + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + Avis d'événement : + +[NAME] +[DATE] + <form name="form"> + <button name="Teleport" text="Téléporter"/> + <button name="Description" text="Description"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + Tous les objets de cette parcelle qui seront transférés à l'acheteur sont maintenant mis en surbrillance. + +* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance. + <form name="form"> + <button name="Done" text="Transfert effectué"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + Gestes désactivés ayant le même mot-clé : +[NAMES] + </notification> + <notification name="NoQuickTime"> + Le logiciel Apple QuickTime ne semble pas installé sur votre système. +Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de QuickTime (http://www.apple.com/fr/quicktime/download) et installez le lecteur QuickTime. + </notification> + <notification name="NoPlugin"> + Aucun Media Plugin n'a été trouvé pour prendre en charge "[MIME_TYPE]". Les médias de ce type ne sont pas disponibles. + </notification> + <notification name="MediaPluginFailed"> + Le Media Plugin suivant a échoué : + [PLUGIN] + +Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeur. + <form name="form"> + <ignore name="ignore" text="L'éxécution d'un Media Plugin a échoué"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire. + </notification> + <notification name="OtherObjectsReturned"> + Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire. + </notification> + <notification name="OtherObjectsReturned2"> + Les objets sur la parcelle appartenant à « [NAME] » ont étés renvoyés à leur propriétaire. + </notification> + <notification name="GroupObjectsReturned"> + Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe [GROUPNAME] ont été renvoyés dans l'inventaire de leur propriétaire. +Les objets donnés transférables ont étés renvoyés à leur propriétaire. +Les objets non transférables donnés au groupe ont étés supprimés. + </notification> + <notification name="UnOwnedObjectsReturned"> + Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires. + </notification> + <notification name="NotSafe"> + Les dégâts sont autorisés sur ce terrain. +Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile. + </notification> + <notification name="NoFly"> + Le vol est interdit dans cette zone. +Vous ne pouvez pas voler ici. + </notification> + <notification name="PushRestricted"> + Les bousculades sont interdites dans cette zone. +Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain. + </notification> + <notification name="NoVoice"> + Le chat vocal est interdit dans cette zone. Vous n'entendrez personne parler. + </notification> + <notification name="NoBuild"> + La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d'objets ici. + </notification> + <notification name="ScriptsStopped"> + Un administrateur a temporairement stoppé les scripts dans cette région. + </notification> + <notification name="ScriptsNotRunning"> + Aucun script ne fonctionne dans cette région. + </notification> + <notification name="NoOutsideScripts"> + Les scripts externes sont désactivés sur ce terrain. + +Aucun script ne marche ici à part ceux du propriétaire du terrain. + </notification> + <notification name="ClaimPublicLand"> + Vous ne pouvez réclamer qu'un terrain public dans la région où vous vous trouvez actuellement. + </notification> + <notification name="RegionTPAccessBlocked"> + Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Vous devez sans doute procéder à la vérification de votre âge ou installer une version plus récente du client. + +Pour savoir comment accéder aux zones ayant un tel niveau d'accès, veuillez consulter les pages d'aide. + </notification> + <notification name="URBannedFromRegion"> + Vous avez été banni de cette région. + </notification> + <notification name="NoTeenGridAccess"> + Votre compte ne peut pas se connecter à cette région du Teen grid. + </notification> + <notification name="ImproperPaymentStatus"> + Vous n'avez pas le statut de paiement approprié pour pénétrer dans cette région. + </notification> + <notification name="MustGetAgeParcel"> + Pour pouvoir pénétrer sur cette parcelle, vous devez avoir procédé à la vérification de votre âge. + </notification> + <notification name="NoDestRegion"> + Région de destination introuvable. + </notification> + <notification name="NotAllowedInDest"> + Vous n'êtes pas autorisé dans cette région. + </notification> + <notification name="RegionParcelBan"> + Impossible de traverser une parcelle bannie. Veuillez trouver une autre solution. + </notification> + <notification name="TelehubRedirect"> + Vous avez été redirigé vers un téléhub. + </notification> + <notification name="CouldntTPCloser"> + Il n'a pas été possible de vous téléporter vers une destination plus proche. + </notification> + <notification name="TPCancelled"> + Téléportation annulée. + </notification> + <notification name="FullRegionTryAgain"> + La région dans laquelle vous essayez de pénétrer est pleine actuellement. +Veuillez réessayer dans quelques minutes. + </notification> + <notification name="GeneralFailure"> + Panne générale. + </notification> + <notification name="RoutedWrongRegion"> + Dirigé vers la mauvaise région. Merci de réessayer. + </notification> + <notification name="NoValidAgentID"> + ID agent non valide. + </notification> + <notification name="NoValidSession"> + ID de session non valide. + </notification> + <notification name="NoValidCircuit"> + Aucun code de circuit valide. + </notification> + <notification name="NoValidTimestamp"> + Timestamp non valide. + </notification> + <notification name="NoPendingConnection"> + Impossible de créer la connexion en attente. + </notification> + <notification name="InternalUsherError"> + Erreur interne lors de la tentative de connexion. + </notification> + <notification name="NoGoodTPDestination"> + Impossible de trouver un lieu de téléportation valide dans cette région. + </notification> + <notification name="InternalErrorRegionResolver"> + Une erreur interne est survenue lors de la résolution des coodonnées de la région. + </notification> + <notification name="NoValidLanding"> + Impossible de trouver un point d'atterrissage valide. + </notification> + <notification name="NoValidParcel"> + Aucune parcelle valide n'a été trouvée. + </notification> + <notification name="ObjectGiveItem"> + Un objet appelé [OBJECTFROMNAME] appartenant à [FIRST] [LAST] vous a donné : [OBJECTTYPE] appelé(e) [OBJECTNAME]. + <form name="form"> + <button name="Keep" text="Garder"/> + <button name="Discard" text="Jeter"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="ObjectGiveItemUnknownUser"> + L'objet [OBJECTFROMNAME] appartenant à un utilisateur inconnu vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. + <form name="form"> + <button name="Keep" text="Garder"/> + <button name="Discard" text="Jeter"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME] vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. + <form name="form"> + <button name="Keep" text="Garder"/> + <button name="Discard" text="Jeter"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="Rejoindre"/> + <button name="Decline" text="Refuser"/> + <button name="Info" text="Infos"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME] vous propose de le/la rejoindre par téléportation : + +[MESSAGE] + <form name="form"> + <button name="Teleport" text="Téléporter"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="Plus tard"/> + <button name="GoNow..." text="Y aller maintenant..."/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME] vous demande de devenir son ami(e). + +[MESSAGE] + +(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.) + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + </form> + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME] vous demande de devenir son ami. + +(Par défaut, vous pourrez voir quand vous êtes tous deux connectés) + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + [NAME] a accepté votre amitié. + </notification> + <notification name="FriendshipDeclined"> + [NAME] a refusé votre amitié. + </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. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + La région va redémarrer dans [MINUTES] minutes. +Si vous restez dans cette région, vous serez déconnecté(e). + </notification> + <notification name="RegionRestartSeconds"> + La région va redémarrer dans [SECONDS] secondes. +Si vous restez dans cette région, vous serez déconnecté(e). + </notification> + <notification name="LoadWebPage"> + Charger cette page web [URL] ? + +[MESSAGE] + +Venant de l'objet : [OBJECTNAME], appartenant à : [NAME]? + <form name="form"> + <button name="Gotopage" text="Charger"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + La recherche du [TYPE] dans la base de données a échoué. + </notification> + <notification name="FailedToFindWearable"> + La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué. + </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 du client. + </notification> + <notification name="ScriptQuestion"> + '[OBJECTNAME]', un objet appartenant à '[NAME]', aimerait : + +[QUESTIONS] +Acceptez-vous ? + <form name="form"> + <button name="Yes" text="Oui"/> + <button name="No" text="Non"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + Un objet appelé « [OBJECTNAME] », appartenant à « [NAME] », aimerait : + +[QUESTIONS] +Si vous n'avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. + +Accepter cette requête ? + <form name="form"> + <button name="Grant" text="Accepter"/> + <button name="Deny" text="Refuser"/> + <button name="Details" text="Détails..."/> + </form> + </notification> + <notification name="ScriptDialog"> + '[TITLE]' de [FIRST] [LAST] +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorer"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + '[TITLE]' de [GROUPNAME] +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorer"/> + </form> + </notification> + <notification name="FirstBalanceIncrease"> + Vous venez de recevoir [AMOUNT] L$. +Votre solde en L$ est affiché en haut à droite. + </notification> + <notification name="FirstBalanceDecrease"> + Vous venez de payer [AMOUNT] L$. +Votre solde en L$ est affiché en haut à droite. + </notification> + <notification name="FirstSit"> + Vous êtes assis(e). +Utilisez les touches de direction (ou AWSD) pour regarder autour de vous. +Pour vous lever, cliquez sur le bouton Me lever. + </notification> + <notification name="FirstMap"> + Cliquez et faîtes glisser pour faire défiler la carte. +Double-cliquez pour vous téléporter. +Utilisez les contrôles à droite pour trouver des choses et afficher différents arrière-plans. + </notification> + <notification name="FirstBuild"> + Vous avez ouvert les outils de construction. Tous les objets autour de vous ont été créés avec ces outils. + </notification> + <notification name="FirstTeleport"> + Vous ne pouvez vous téléporter que dans certaines zones de cette région. La flèche pointe vers votre destination. Cliquez sur la flèche pour la faire disparaître. + </notification> + <notification name="FirstOverrideKeys"> + Vos mouvements sont maintenant pris en charge par un objet. +Essayez les flèches de votre clavier ou AWSD pour voir à quoi elles servent. +Certains objets (comme les armes) nécessitent l'activation du mode Vue subjective pour être utilisés. +Pour cela, appuyez sur la touche M. + </notification> + <notification name="FirstAppearance"> + Vous êtes en train d'éditer votre apparence. +Utilisez les touches de direction pour regarder autour de vous. +Une fois terminé, cliquer sur Tout enregistrer. + </notification> + <notification name="FirstInventory"> + Il s'agit de votre inventaire qui contient vos possessions. + +* Pour porter quelque chose, faites glisser l'objet sur vous-même. +* Pour rezzer un objet dans le monde, faites-le glisser sur le sol. +* Pour lire une note, double-cliquez dessus. + </notification> + <notification name="FirstSandbox"> + Cette région est un bac à sable et est utilisée par les résidents pour apprendre à construire. + +Les objets que vous construisez ici seront supprimés après votre départ. N'oubliez donc pas de cliquer droit et de choisir Prendre pour sauvegarder votre création dans votre inventaire. + </notification> + <notification name="FirstFlexible"> + Cet objet est flexible. Les objets flexibles ne peuvent pas avoir de propriétés physiques et doivent rester fantômes. + </notification> + <notification name="FirstDebugMenus"> + Vous avez ouvert le menu Avancé. + +Pour activer/désactiver ce menu, + Windows : Ctrl-Alt-D + Mac : ⌘-Opt-D + </notification> + <notification name="FirstSculptedPrim"> + Vous êtes en train d'éditer un sculptie. Pour spécifier la forme d'un sculptie, vous devez utiliser une texture spécifique. + </notification> + <notification name="MaxListSelectMessage"> + Vous ne pouvez sélectionner que [MAX_SELECT] objets maximum dans cette liste. + </notification> + <notification name="VoiceInviteP2P"> + [NAME] vous invite à un chat vocal. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + [FIRST] [LAST] a reçu un message instantané et n'est donc plus ignoré. + </notification> + <notification name="AutoUnmuteByMoney"> + [FIRST] [LAST] a reçu de l'argent et n'est donc plus ignoré. + </notification> + <notification name="AutoUnmuteByInventory"> + [FIRST] [LAST] a reçu un inventaire et n'est donc plus ignoré. + </notification> + <notification name="VoiceInviteGroup"> + [NAME] a rejoint un chat vocal avec le groupe [GROUP]. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME] a rejoint un chat vocal avec conférence. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME] vous invite à un chat conférence. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + L'appel auquel vous essayez de participer, [VOICE_CHANNEL_NAME], a atteint le nombre maximum de participants. Veuillez réessayer ultérieurement. + </notification> + <notification name="ProximalVoiceChannelFull"> + Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter. + </notification> + <notification name="VoiceChannelDisconnected"> + Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME] a mis fin à l'appel. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="VoiceChannelJoinFailed"> + Echec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="VoiceLoginRetry"> + Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants. + </notification> + <notification name="Cannot enter parcel: not a group member"> + Seuls les membres d'un certain groupe peuvent visiter cette zone. + </notification> + <notification name="Cannot enter parcel: banned"> + Vous ne pouvez pas pénétrer sur ce terrain car l'accès vous y est interdit. + </notification> + <notification name="Cannot enter parcel: not on access list"> + Vous ne pouvez pas pénétrer sur ce terrain car vous n'avez pas les droits d'accès requis. + </notification> + <notification name="VoiceNotAllowed"> + Vous n'êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME]. + </notification> + <notification name="VoiceCallGenericError"> + Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement. + </notification> + <notification name="ServerVersionChanged"> + La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. Cliquez pour voir les notes de version. + </notification> + <notification name="UnsupportedCommandSLURL"> + La SLurl que vous avez saisie n'est pas prise en charge. + </notification> + <notification name="IMToast"> + <form name="form"> + <button name="respondbutton" text="Répondre"/> + </form> + </notification> + <notification name="AttachmentSaved"> + L'élément joint a été sauvegardé. + </notification> + <notification name="UnableToFindHelpTopic"> + Impossible de trouver l'aide. + </notification> + <global name="UnsupportedCPU"> + - Votre processeur ne remplit pas les conditions minimum requises. + </global> + <global name="UnsupportedGLRequirements"> + Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d'exploitation. + +Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE]. + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - Votre carte graphique ne remplit pas les conditions minimum requises. + </global> + <global name="UnsupportedRAM"> + - Votre mémoire système ne remplit pas les conditions minimum requises. + </global> + <global name="PermYes"> + Oui + </global> + <global name="PermNo"> + Non + </global> + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Si vous possédez un terrain, vous pouvez le définir comme domicile. +Sinon, consultez la carte et trouvez les « infohubs ». + </global> +</notifications> 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 afadd109b1da913bf49f4f240fd52e7e68ed6686..3a13748efabb1de9eef8d8fd04c0477d9af16047 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml @@ -1,38 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Profile Edit" name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" value="Résident"/> - <string name="AcctTypeTrial" value="Essai"/> - <string name="AcctTypeCharterMember" value="Membre originaire"/> - <string name="AcctTypeEmployee" value="Employé(e) de Linden Lab"/> - <string name="PaymentInfoUsed" value="Infos de paiement utilisées"/> - <string name="PaymentInfoOnFile" value="Infos de paiement enregistrées"/> - <string name="NoPaymentInfoOnFile" value="Aucune info de paiement"/> - <string name="AgeVerified" value="Âge vérifié"/> - <string name="NotAgeVerified" value="Âge non vérifié"/> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=fr - </string> - <string name="no_partner_text" value="Aucun"/> - <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="Cliquez pour sélectionner une image"/> - </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> - <check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/> - <text name="title_acc_status_text" value="Statut du compte :"/> - </panel> - </panel> - </scroll_container> - <panel name="profile_me_buttons_panel"> - <button label="Enregistrer les changements" name="save_btn"/> - <button label="Annuler" name="cancel_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profile Edit" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="AcctTypeResident" value="Résident"/> + <string name="AcctTypeTrial" value="Essai"/> + <string name="AcctTypeCharterMember" value="Membre originaire"/> + <string name="AcctTypeEmployee" value="Employé(e) de Linden Lab"/> + <string name="PaymentInfoUsed" value="Infos de paiement utilisées"/> + <string name="PaymentInfoOnFile" value="Infos de paiement enregistrées"/> + <string name="NoPaymentInfoOnFile" value="Aucune info de paiement"/> + <string name="AgeVerified" value="Âge vérifié"/> + <string name="NotAgeVerified" value="Âge non vérifié"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=fr + </string> + <string name="no_partner_text" value="Aucun"/> + <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="Cliquez pour sélectionner une image"/> + </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> + <check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="Statut du compte :"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="Enregistrer les changements" name="save_btn"/> + <button label="Annuler" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_invite.xml b/indra/newview/skins/default/xui/fr/panel_group_invite.xml index ae01f05bfbf8933c327fe57a6a08e02ac07be945..7055d9e3f263cf5599f27fefa74c419a74642407 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_invite.xml @@ -1,29 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Inviter un résident" name="invite_panel"> - <panel.string name="confirm_invite_owner_str"> - Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent ! - </panel.string> - <panel.string name="loading"> - (en cours de chargement...) - </panel.string> - <panel.string name="already_in_group"> - Certains des avatars font déjà partie du groupe et n'ont pas été invités. - </panel.string> - <text name="help_text"> - Vous pouvez inviter plusieurs résidents -à la fois. Cliquez d'abord sur -Choisir un résident. - </text> - <button label="Choisir un résident" name="add_button" tool_tip=""/> - <name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/> - <button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/> - <text name="role_text"> - Assignez-leur un rôle : - </text> - <combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/> - <button label="Envoyer les invitations" name="ok_button"/> - <button label="Annuler" name="cancel_button"/> - <string name="GroupInvitation"> - Invitations au groupe - </string> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Inviter un résident" name="invite_panel"> + <panel.string name="confirm_invite_owner_str"> + Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent ! + </panel.string> + <panel.string name="loading"> + (en cours de chargement...) + </panel.string> + <panel.string name="already_in_group"> + Certains des avatars font déjà partie du groupe et n'ont pas été invités. + </panel.string> + <text name="help_text"> + Vous pouvez inviter plusieurs résidents +à la fois. Cliquez d'abord sur +Choisir un résident. + </text> + <button label="Choisir un résident" name="add_button" tool_tip=""/> + <name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/> + <button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/> + <text name="role_text"> + Assignez-leur un rôle : + </text> + <combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/> + <button label="Envoyer les invitations" name="ok_button"/> + <button label="Annuler" name="cancel_button"/> + <string name="GroupInvitation"> + Invitations au groupe + </string> +</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 9a24b7a68716bb178f01cec178489ac3f7a1ad6b..3ffdf53e7cd32dea86f92ba5c9b1e767e3401dca 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,86 +1,86 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Terrain et L$" name="land_money_tab"> - <string name="help_text"> - Les parcelles appartenant au groupe sont indiquées avec le détails des contributions. Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. Les onglets Planification, Détails et Ventes correspondent aux finances du groupe. - </string> - <button label="?" name="help_button"/> - <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"> - Vous n'avez pas la permission d'accéder aux informations -financières de ce groupe. - </string> - <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"> - Impossible de définir votre don de terre. - </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 du groupe est requise pour prendre en -charge le terrain utilisé. - </text> - <text name="group_money_heading"> - Finances - </text> - <tab_container name="group_money_tab_container"> - <panel label="Planification" name="group_money_planning_tab"> - <text_editor name="group_money_planning_text"> - Calcul en cours... - </text_editor> - </panel> - <panel label="Détails" name="group_money_details_tab"> - <text_editor name="group_money_details_text"> - Calcul en cours... - </text_editor> - <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/> - <button label="Plus tard >" label_selected="Plus tard >" name="later_details_button" tool_tip="Avancer dans le temps"/> - </panel> - <panel label="Ventes" name="group_money_sales_tab"> - <text_editor name="group_money_sales_text"> - Calcul en cours... - </text_editor> - <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/> - <button label="Plus tard >" label_selected="Plus tard >" name="later_sales_button" tool_tip="Avancer dans le temps"/> - </panel> - </tab_container> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Terrain et L$" name="land_money_tab"> + <string name="help_text"> + Les parcelles appartenant au groupe sont indiquées avec le détails des contributions. Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. Les onglets Planification, Détails et Ventes correspondent aux finances du groupe. + </string> + <button label="?" name="help_button"/> + <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"> + Vous n'avez pas la permission d'accéder aux informations +financières de ce groupe. + </string> + <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"> + Impossible de définir votre don de terre. + </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 du groupe est requise pour prendre en +charge le terrain utilisé. + </text> + <text name="group_money_heading"> + Finances + </text> + <tab_container name="group_money_tab_container"> + <panel label="Planification" name="group_money_planning_tab"> + <text_editor name="group_money_planning_text"> + Calcul en cours... + </text_editor> + </panel> + <panel label="Détails" name="group_money_details_tab"> + <text_editor name="group_money_details_text"> + Calcul en cours... + </text_editor> + <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/> + <button label="Plus tard >" label_selected="Plus tard >" name="later_details_button" tool_tip="Avancer dans le temps"/> + </panel> + <panel label="Ventes" name="group_money_sales_tab"> + <text_editor name="group_money_sales_text"> + Calcul en cours... + </text_editor> + <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/> + <button label="Plus tard >" label_selected="Plus tard >" name="later_sales_button" tool_tip="Avancer dans le temps"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml index 15d48c4eb4cb441d040e92baa979eabaa4f75d86..a61cb787a838c70924592514da84f5ced8856e3e 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="group_list_item"> - <text name="group_name" value="Inconnu"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="group_list_item"> + <text name="group_name" value="Inconnu"/> +</panel> 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 b719f1f07ff397e9217fb5484fca5c22bdd7632f..432bb8b9c16e8c2db2ee671f412e03b417d4facc 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Notices" name="notices_tab"> - <text name="help_text"> - Les notices vous permettent d'envoyer des messages et pièces-jointes aux membres du groupe autorisés à les recevoir. Vous pouvez désactiver la réception des notices à l'onglet Général. - </text> - <text name="no_notices_text"> - Aucune notice - </text> - <button label="?" label_selected="?" name="help_button"/> - <text name="lbl"> - Anciennes notices du groupe - </text> - <text name="lbl2"> - Les notes sont conservées pendant 14 jours. La limite est de 200 notes quotidiennes par groupe. - </text> - <scroll_list name="notice_list"> - <column label="" name="icon"/> - <column label="Sujet" name="subject"/> - <column label="De" name="from"/> - <column label="Date" name="date"/> - </scroll_list> - <text name="notice_list_none_found"> - Aucun résultat. - </text> - <button label="Nouvelle note" label_selected="Créer une notice" name="create_new_notice"/> - <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/> - <panel label="Créer une notice" name="panel_create_new_notice"> - <text name="lbl"> - Créer une notice - </text> - <text name="lbl2"> - Vous pouvez ajouter un objet simple à la note en le faisant glisser de votre inventaire vers cette section. Les objets joints doivent pouvoir être copiés et transférés. Vous ne pouvez pas envoyer de dossier. - </text> - <text bottom_delta="-79" left="20" name="lbl3"> - Sujet : - </text> - <line_editor left_delta="61" name="create_subject" width="331"/> - <text left="20" 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> - <line_editor left_delta="74" name="create_inventory_name" width="190"/> - <button label="Supprimer pièce-jointe" 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"/> - <panel name="drop_target2" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> - <panel name="drop_target" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> - </panel> - <panel label="Voir ancienne notice" name="panel_view_past_notice"> - <text name="lbl"> - Détails - </text> - <text name="lbl2"> - Pour envoyer une nouvelle notice, cliquez sur Créer une notice ci-dessus. - </text> - <text name="lbl3"> - Sujet : - </text> - <text name="lbl4"> - Message : - </text> - <button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/> - <line_editor left="128" name="view_inventory_name" width="256"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Notices" name="notices_tab"> + <text name="help_text"> + Les notices vous permettent d'envoyer des messages et pièces-jointes aux membres du groupe autorisés à les recevoir. Vous pouvez désactiver la réception des notices à l'onglet Général. + </text> + <text name="no_notices_text"> + Aucune notice + </text> + <button label="?" label_selected="?" name="help_button"/> + <text name="lbl"> + Anciennes notices du groupe + </text> + <text name="lbl2"> + Les notes sont conservées pendant 14 jours. La limite est de 200 notes quotidiennes par groupe. + </text> + <scroll_list name="notice_list"> + <column label="" name="icon"/> + <column label="Sujet" name="subject"/> + <column label="De" name="from"/> + <column label="Date" name="date"/> + </scroll_list> + <text name="notice_list_none_found"> + Aucun résultat. + </text> + <button label="Nouvelle note" label_selected="Créer une notice" name="create_new_notice"/> + <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/> + <panel label="Créer une notice" name="panel_create_new_notice"> + <text name="lbl"> + Créer une notice + </text> + <text name="lbl2"> + Vous pouvez ajouter un objet simple à la note en le faisant glisser de votre inventaire vers cette section. Les objets joints doivent pouvoir être copiés et transférés. Vous ne pouvez pas envoyer de dossier. + </text> + <text bottom_delta="-79" left="20" name="lbl3"> + Sujet : + </text> + <line_editor left_delta="61" name="create_subject" width="331"/> + <text left="20" 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> + <line_editor left_delta="74" name="create_inventory_name" width="190"/> + <button label="Supprimer pièce-jointe" 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"/> + <panel name="drop_target2" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> + <panel name="drop_target" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> + </panel> + <panel label="Voir ancienne notice" name="panel_view_past_notice"> + <text name="lbl"> + Détails + </text> + <text name="lbl2"> + Pour envoyer une nouvelle notice, cliquez sur Créer une notice ci-dessus. + </text> + <text name="lbl3"> + Sujet : + </text> + <text name="lbl4"> + Message : + </text> + <button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/> + <line_editor left="128" name="view_inventory_name" width="256"/> + </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 1b716babc654dc4d20eb4c5dec0038d4c3dc74c0..65aaab40f170c5c8106437a6bb70e613f8974788 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml @@ -1,113 +1,113 @@ -<?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"> - Certains changements n'ont pas été appliqués sur ce sous-onglet. - </panel.string> - <panel.string name="want_apply_text"> - Voulez-vous enregistrer les modifications ? - </panel.string> - <tab_container height="164" name="roles_tab_container"> - <panel height="148" 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.columns label="Membre" name="name"/> - <name_list.columns label="Donations" name="donated" width="116"/> - <name_list.columns label="En ligne" name="online" width="136"/> - </name_list> - <button label="Inviter" name="member_invite" width="165"/> - <button label="Expulser" name="member_eject"/> - </panel> - <panel height="148" label="Rôles" name="roles_sub_tab"> - <panel.string name="help_text"> - Chaque rôle possède un titre et des pouvoirs. Un membre peut avoir plusieurs rôles mais il ne peut y avoir que 10 rôles dans un groupe, Visiteur et Propriétaire inclus. - </panel.string> - <panel.string name="cant_delete_role"> - Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés. - </panel.string> - <filter_editor label="Filtrer les rôles" name="filter_input"/> - <scroll_list bottom_delta="-104" height="104" name="role_list"> - <scroll_list.columns label="Rôle" name="name"/> - <scroll_list.columns label="Titre" name="title"/> - <scroll_list.columns label="Membres" name="members"/> - </scroll_list> - <button label="Ajouter un rôle" name="role_create"/> - <button label="Supprimer le rôle" name="role_delete"/> - </panel> - <panel height="148" label="Pouvoirs" name="actions_sub_tab" tool_tip="Vous pouvez afficher une description du pouvoir et voir quels membres et rôles peuvent s'en servir."> - <panel.string name="help_text"> - Les pouvoirs déterminent les facultés de chaque membre dans le groupe. - </panel.string> - <filter_editor label="Filtrer les pouvoirs" name="filter_input"/> - <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails."> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="action"/> - </scroll_list> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - Rôles assignés - </text> - <scroll_list name="member_assigned_roles"> - <scroll_list.columns label="" name="checkbox"/> - <scroll_list.columns label="" name="role"/> - </scroll_list> - <text name="static2"> - Pouvoirs attribués - </text> - <scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="action"/> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - Nom - </text> - <line_editor name="role_name"> - Employés - </line_editor> - <text name="static3"> - Titre - </text> - <line_editor name="role_title"> - (en attente) - </line_editor> - <text name="static2"> - Description - </text> - <text_editor name="role_description"> - (en attente) - </text_editor> - <text name="static4"> - Membres assignés - </text> - <check_box label="Membres visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l'onglet Général aux personnes en dehors du groupe."/> - <text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès."> - Pouvoirs attribués - </text> - <scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> - <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"> - Description - </text> - <text_editor name="action_description"> - Ce pouvoir permet d'expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire. - </text_editor> - <text name="static2"> - Rôles avec ce pouvoir - </text> - <text name="static3"> - Membres avec ce pouvoir - </text> - </panel> -</panel> +<?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"> + Certains changements n'ont pas été appliqués sur ce sous-onglet. + </panel.string> + <panel.string name="want_apply_text"> + Voulez-vous enregistrer les modifications ? + </panel.string> + <tab_container height="164" name="roles_tab_container"> + <panel height="148" 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.columns label="Membre" name="name"/> + <name_list.columns label="Donations" name="donated" width="116"/> + <name_list.columns label="En ligne" name="online" width="136"/> + </name_list> + <button label="Inviter" name="member_invite" width="165"/> + <button label="Expulser" name="member_eject"/> + </panel> + <panel height="148" label="Rôles" name="roles_sub_tab"> + <panel.string name="help_text"> + Chaque rôle possède un titre et des pouvoirs. Un membre peut avoir plusieurs rôles mais il ne peut y avoir que 10 rôles dans un groupe, Visiteur et Propriétaire inclus. + </panel.string> + <panel.string name="cant_delete_role"> + Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés. + </panel.string> + <filter_editor label="Filtrer les rôles" name="filter_input"/> + <scroll_list bottom_delta="-104" height="104" name="role_list"> + <scroll_list.columns label="Rôle" name="name"/> + <scroll_list.columns label="Titre" name="title"/> + <scroll_list.columns label="Membres" name="members"/> + </scroll_list> + <button label="Ajouter un rôle" name="role_create"/> + <button label="Supprimer le rôle" name="role_delete"/> + </panel> + <panel height="148" label="Pouvoirs" name="actions_sub_tab" tool_tip="Vous pouvez afficher une description du pouvoir et voir quels membres et rôles peuvent s'en servir."> + <panel.string name="help_text"> + Les pouvoirs déterminent les facultés de chaque membre dans le groupe. + </panel.string> + <filter_editor label="Filtrer les pouvoirs" name="filter_input"/> + <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + </tab_container> + <panel name="members_footer"> + <text name="static"> + Rôles assignés + </text> + <scroll_list name="member_assigned_roles"> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="role"/> + </scroll_list> + <text name="static2"> + Pouvoirs attribués + </text> + <scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="roles_footer"> + <text name="static"> + Nom + </text> + <line_editor name="role_name"> + Employés + </line_editor> + <text name="static3"> + Titre + </text> + <line_editor name="role_title"> + (en attente) + </line_editor> + <text name="static2"> + Description + </text> + <text_editor name="role_description"> + (en attente) + </text_editor> + <text name="static4"> + Membres assignés + </text> + <check_box label="Membres visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l'onglet Général aux personnes en dehors du groupe."/> + <text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès."> + Pouvoirs attribués + </text> + <scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> + <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"> + Description + </text> + <text_editor name="action_description"> + Ce pouvoir permet d'expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire. + </text_editor> + <text name="static2"> + Rôles avec ce pouvoir + </text> + <text name="static3"> + Membres avec ce pouvoir + </text> + </panel> +</panel> 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 7f8f03f9aba4c589104b2cc23504e88d0f01ca96..340ca75d1968ae24442859e86a929a91aca83d00 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 @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_im_control_panel"> - <button label="Voir le profil" name="view_profile_btn"/> - <button label="Devenir amis" name="add_friend_btn"/> - <button label="Partager" name="share_btn"/> - <panel name="panel_call_buttons"> - <button label="Appeler" name="call_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <button label="Voir le profil" name="view_profile_btn"/> + <button label="Devenir amis" name="add_friend_btn"/> + <button label="Partager" name="share_btn"/> + <panel name="panel_call_buttons"> + <button label="Appeler" name="call_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index 3c174aa45bda18e53b4a789b751786d444edbec0..f7ab2891e85edea31949d6e2d80fe473472c74ee 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_login"> - <panel.string name="create_account_url"> - http://secondlife.com/registration/ - </panel.string> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <panel name="login_widgets"> - <line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/> - <line_editor name="last_name_edit" tool_tip="Nom sur [SECOND_LIFE]"/> - <text name="start_location_text"> - Lieu de départ : - </text> - <text name="create_new_account_text"> - Créer un compte - </text> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://fr.secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=fr + </panel.string> + <panel name="login_widgets"> + <line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/> + <line_editor name="last_name_edit" tool_tip="Nom sur [SECOND_LIFE]"/> + <text name="start_location_text"> + Lieu de départ : + </text> + <text name="create_new_account_text"> + Créer un compte + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_me.xml b/indra/newview/skins/default/xui/fr/panel_me.xml new file mode 100644 index 0000000000000000000000000000000000000000..5bedee46161104d0fd2e818e1733c8f01faf38f6 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_me.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Moi" name="panel_me"> + <tab_container name="tabs"> + <panel label="Mon Profil" name="panel_profile"/> + <panel label="Préférences" name="panel_picks"/> + </tab_container> +</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 7aa8f2440494fd5b437ce91b6698236d09099b75..c236c59fbc82a425e023242eb094589e6a7f49a8 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,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="chat_bar"> - <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_pick_info.xml b/indra/newview/skins/default/xui/fr/panel_pick_info.xml new file mode 100644 index 0000000000000000000000000000000000000000..642e31a2c36d589654c336464f2cdcd4d1ccac29 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/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="Infos"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[name]"/> + <text name="pick_location" value="[chargement...]"/> + <text name="pick_desc" value="[description]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Téléporter" name="teleport_btn"/> + <button label="Carte" name="show_on_map_btn"/> + <button label="Éditer" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_picks.xml b/indra/newview/skins/default/xui/fr/panel_picks.xml index 534af5ed3f20cc72762fb2fed7f0beca2d3c1094..25aeac9e755a044c50bce34c7ca2cfc44726103b 100644 --- a/indra/newview/skins/default/xui/fr/panel_picks.xml +++ b/indra/newview/skins/default/xui/fr/panel_picks.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Favoris" name="panel_picks"> - <panel label="bottom_panel" name="edit_panel"> - <button name="new_btn" tool_tip="Ajouter cet endroit à mes Favoris"/> - </panel> - <panel name="buttons_cucks"> - <button label="Carte" name="show_on_map_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Favoris" name="panel_picks"> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="Ajouter cet endroit à mes Favoris"/> + </panel> + <panel name="buttons_cucks"> + <button label="Carte" name="show_on_map_btn"/> + </panel> +</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 1f7c9a57dc8ca31b7dae1047899ef5f28f458cff..e2d00a2421fc77de9a07602207b8fd83baefb0df 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -1,42 +1,42 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Chat écrit" name="chat"> - <radio_group name="chat_font_size"> - <radio_item label="Petite" name="radio"/> - <radio_item label="Moyenne" name="radio2"/> - <radio_item label="Grande" name="radio3"/> - </radio_group> - <color_swatch label="Vous" name="user"/> - <text name="text_box1"> - Moi - </text> - <color_swatch label="Avatars" name="agent"/> - <text name="text_box2"> - Avatars - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="Système" name="system"/> - <text name="text_box4"> - Système - </text> - <color_swatch label="Erreurs de script" name="script_error"/> - <text name="text_box5"> - Erreurs de script - </text> - <color_swatch label="Objets" name="objects"/> - <text name="text_box6"> - Objets - </text> - <color_swatch label="Propriétaire" name="owner"/> - <text name="text_box7"> - Propriétaire - </text> - <color_swatch label="URL" name="links"/> - <text name="text_box9"> - URL - </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"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Chat écrit" name="chat"> + <radio_group name="chat_font_size"> + <radio_item label="Petite" name="radio"/> + <radio_item label="Moyenne" name="radio2"/> + <radio_item label="Grande" name="radio3"/> + </radio_group> + <color_swatch label="Vous" name="user"/> + <text name="text_box1"> + Moi + </text> + <color_swatch label="Avatars" name="agent"/> + <text name="text_box2"> + Avatars + </text> + <color_swatch label="IM" name="im"/> + <text name="text_box3"> + IM + </text> + <color_swatch label="Système" name="system"/> + <text name="text_box4"> + Système + </text> + <color_swatch label="Erreurs de script" name="script_error"/> + <text name="text_box5"> + Erreurs de script + </text> + <color_swatch label="Objets" name="objects"/> + <text name="text_box6"> + Objets + </text> + <color_swatch label="Propriétaire" name="owner"/> + <text name="text_box7"> + Propriétaire + </text> + <color_swatch label="URL" name="links"/> + <text name="text_box9"> + URL + </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"/> +</panel> 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 2afd7152cb7c86011ed513cbd1f37d66ca228c88..6a469c7322ac00d26f495dd2787df6aa9801c782 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -1,116 +1,116 @@ -<?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'IU : - </text> - <text name="QualitySpeed"> - Qualité et vitesse : - </text> - <text left="105" name="FasterText"> - Plus rapide - </text> - <text name="BetterText"> - Mieux - </text> - <text name="ShadersPrefText"> - Faible - </text> - <text name="ShadersPrefText2"> - Moyen - </text> - <text name="ShadersPrefText3"> - Élevé - </text> - <text name="ShadersPrefText4"> - Ultra - </text> - <panel label="CustomGraphics" name="CustomGraphics Panel"> - <text name="ShadersText"> - Effets : - </text> - <check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/> - <check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/> - <check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/> - <check_box initial_value="true" label="Reflets de l'eau" name="Reflections"/> - <text name="ReflectionDetailText"> - Objets reflétés : - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item label="Terrain et Arbres" name="0"/> - <radio_item label="Objets statiques" name="1"/> - <radio_item label="Objets et avatars" name="2"/> - <radio_item label="Tout" name="3"/> - </radio_group> - <text name="AvatarRenderingText"> - Rendu de l'avatar : - </text> - <check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/> - <check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/> - <check_box initial_value="true" label="Mouvement des habits" name="AvatarCloth"/> - <slider label="Limite d'affichage :" name="DrawDistance"/> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/> - <slider label="Qualité post-traitement :" name="RenderPostProcess"/> - <text name="MeshDetailText"> - Détails des rendus : - </text> - <slider label=" Objets :" name="ObjectMeshDetail"/> - <slider label=" Flexiprims :" name="FlexibleMeshDetail"/> - <slider label=" Arbres :" name="TreeMeshDetail"/> - <slider label=" Avatars :" name="AvatarMeshDetail"/> - <slider label=" Relief :" name="TerrainMeshDetail"/> - <slider label=" Ciel :" name="SkyMeshDetail"/> - <text name="PostProcessText"> - Faible - </text> - <text name="ObjectMeshDetailText"> - Faible - </text> - <text name="FlexibleMeshDetailText"> - Faible - </text> - <text name="TreeMeshDetailText"> - Faible - </text> - <text name="AvatarMeshDetailText"> - Faible - </text> - <text name="TerrainMeshDetailText"> - Faible - </text> - <text name="SkyMeshDetailText"> - Faible - </text> - <text name="LightingDetailText"> - 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_group> - <text left="380" name="TerrainDetailText"> - Rendu du terrain : - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item label="Faible" name="0"/> - <radio_item label="Élevé" name="2"/> - </radio_group> - </panel> - <button label="Appliquer" label_selected="Appliquer" name="Apply"/> - <button label="Réinitialiser" name="Defaults"/> - <button label="Avancé" name="Advanced"/> - <button label="Matériel" label_selected="Matériel" name="GraphicsHardwareButton"/> -</panel> +<?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'IU : + </text> + <text name="QualitySpeed"> + Qualité et vitesse : + </text> + <text left="105" name="FasterText"> + Plus rapide + </text> + <text name="BetterText"> + Mieux + </text> + <text name="ShadersPrefText"> + Faible + </text> + <text name="ShadersPrefText2"> + Moyen + </text> + <text name="ShadersPrefText3"> + Élevé + </text> + <text name="ShadersPrefText4"> + Ultra + </text> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Effets : + </text> + <check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/> + <check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/> + <check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Reflets de l'eau" name="Reflections"/> + <text name="ReflectionDetailText"> + Objets reflétés : + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Terrain et Arbres" name="0"/> + <radio_item label="Objets statiques" name="1"/> + <radio_item label="Objets et avatars" name="2"/> + <radio_item label="Tout" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Rendu de l'avatar : + </text> + <check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/> + <check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Mouvement des habits" name="AvatarCloth"/> + <slider label="Limite d'affichage :" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/> + <slider label="Qualité post-traitement :" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Détails des rendus : + </text> + <slider label=" Objets :" name="ObjectMeshDetail"/> + <slider label=" Flexiprims :" name="FlexibleMeshDetail"/> + <slider label=" Arbres :" name="TreeMeshDetail"/> + <slider label=" Avatars :" name="AvatarMeshDetail"/> + <slider label=" Relief :" name="TerrainMeshDetail"/> + <slider label=" Ciel :" name="SkyMeshDetail"/> + <text name="PostProcessText"> + Faible + </text> + <text name="ObjectMeshDetailText"> + Faible + </text> + <text name="FlexibleMeshDetailText"> + Faible + </text> + <text name="TreeMeshDetailText"> + Faible + </text> + <text name="AvatarMeshDetailText"> + Faible + </text> + <text name="TerrainMeshDetailText"> + Faible + </text> + <text name="SkyMeshDetailText"> + Faible + </text> + <text name="LightingDetailText"> + 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_group> + <text left="380" name="TerrainDetailText"> + Rendu du terrain : + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="Faible" name="0"/> + <radio_item label="Élevé" name="2"/> + </radio_group> + </panel> + <button label="Appliquer" label_selected="Appliquer" name="Apply"/> + <button label="Réinitialiser" name="Defaults"/> + <button label="Avancé" name="Advanced"/> + <button label="Matériel" label_selected="Matériel" name="GraphicsHardwareButton"/> +</panel> 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 c1a6d450891124c59b2e7868f66a822eb84634c8..3beaaf5c7928ab9653f8f409567a74b7745efef1 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml @@ -1,21 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Communication" name="im"> - <panel.string name="log_in_to_change"> - se connecter pour changer - </panel.string> - <button label="Vider le cache" name="clear_cache"/> - <text name="cache_size_label_l"> - (Endroits, images, web, historique des recherches) - </text> - <check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/> - <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="Sauvegarder les journaux sur mon ordinateur" name="log_instant_messages"/> - <radio_group name="ChatIMLogs"> - <radio_item label="Chat" name="radio1"/> - <radio_item label="IM" name="radio2"/> - </radio_group> - <line_editor left="308" name="log_path_string" right="-20"/> - <button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Communication" name="im"> + <panel.string name="log_in_to_change"> + se connecter pour changer + </panel.string> + <button label="Vider le cache" name="clear_cache"/> + <text name="cache_size_label_l"> + (Endroits, images, web, historique des recherches) + </text> + <check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/> + <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="Sauvegarder les journaux sur mon ordinateur" name="log_instant_messages"/> + <radio_group name="ChatIMLogs"> + <radio_item label="Chat" name="radio1"/> + <radio_item label="IM" name="radio2"/> + </radio_group> + <line_editor left="308" name="log_path_string" right="-20"/> + <button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/> +</panel> 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 7f6c7c57bd92f61a554198e557cee6a8e983d8cf..2e8f5e9a8b4de0bf4f7a75770fa1c677e1d0ead5 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml @@ -1,46 +1,46 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Contrôle et caméra" name="Input panel"> - <button label="Autres accessoires" name="joystick_setup_button" width="175"/> - <text name="Mouselook:"> - Vue subjective : - </text> - <text name=" Mouse Sensitivity"> - Sensibilité de la souris - </text> - <check_box label="Inverser" name="invert_mouse"/> - <text name="Network:"> - Réseau : - </text> - <text name="Maximum bandwidth"> - Bande passante maximale - </text> - <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"/> - <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="Choisir" name="reset_cache"/> - <text name="Cache location"> - Emplacement du cache - </text> - <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_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"/> - <text name="Proxy location"> - Emplacement du proxy - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Contrôle et caméra" name="Input panel"> + <button label="Autres accessoires" name="joystick_setup_button" width="175"/> + <text name="Mouselook:"> + Vue subjective : + </text> + <text name=" Mouse Sensitivity"> + Sensibilité de la souris + </text> + <check_box label="Inverser" name="invert_mouse"/> + <text name="Network:"> + Réseau : + </text> + <text name="Maximum bandwidth"> + Bande passante maximale + </text> + <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"/> + <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="Choisir" name="reset_cache"/> + <text name="Cache location"> + Emplacement du cache + </text> + <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_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"/> + <text name="Proxy location"> + Emplacement du proxy + </text> +</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 c002c55c23e4148ea2a238436379378e0a395ab9..3c38da3eb91a32e62e5b3d3d3a8b595a58237bd7 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Audio et vidéo" name="Preference Media panel"> - <slider label="Volume principal" name="System Volume"/> - <slider label="Son ambiant" name="Wind Volume"/> - <slider label="Sons" name="SFX Volume"/> - <slider label="Média" name="Media Volume"/> - <slider label="Interface" name="UI Volume"/> - <slider label="Musique" name="Music Volume"/> - <slider label="Voix" name="Voice Volume"/> - <text_editor name="voice_unavailable"> - Le chat vocal n'est pas disponible - </text_editor> - <check_box label="Chat vocal" name="enable_voice_check"/> - <radio_group name="ear_location"> - <radio_item label="Écouter depuis la position de la caméra" name="0"/> - <radio_item label="Écouter depuis la position de l'avatar" name="1"/> - </radio_group> - <button label="Paramètres du matériel" name="device_settings_btn"/> - <text name="muting_text"> - Volume : - </text> - <panel name="Volume Panel" width="249"/> - <check_box label="Couper le son" name="disable audio"/> - <text bottom="-195" name="streaming_prefs_text" width="145"> - Média : - </text> - <text name="audio_prefs_text"> - Audio : - </text> - <panel label="Volume" name="Volume Panel"/> - <check_box label="Couper le son quand minimisé" name="mute_when_minimized"/> - <check_box label="Jouer la musique disponible" name="streaming_music"/> - <check_box label="Jouer le média disponible" name="streaming_video"/> - <check_box label="Lire automatiquement le média" name="auto_streaming_video"/> - <slider label="Effet Doppler" label_width="115" name="Doppler Effect"/> - <slider label="Facteur d'éloignement" label_width="115" name="Distance Factor"/> - <slider label="Facteur d'atténuation" label_width="115" name="Rolloff Factor"/> - <spinner label="Alerte L$" name="L$ Change Threshold"/> - <spinner label="Alerte santé" name="Health Change Threshold"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Audio et vidéo" name="Preference Media panel"> + <slider label="Volume principal" name="System Volume"/> + <slider label="Son ambiant" name="Wind Volume"/> + <slider label="Sons" name="SFX Volume"/> + <slider label="Média" name="Media Volume"/> + <slider label="Interface" name="UI Volume"/> + <slider label="Musique" name="Music Volume"/> + <slider label="Voix" name="Voice Volume"/> + <text_editor name="voice_unavailable"> + Le chat vocal n'est pas disponible + </text_editor> + <check_box label="Chat vocal" name="enable_voice_check"/> + <radio_group name="ear_location"> + <radio_item label="Écouter depuis la position de la caméra" name="0"/> + <radio_item label="Écouter depuis la position de l'avatar" name="1"/> + </radio_group> + <button label="Paramètres du matériel" name="device_settings_btn"/> + <text name="muting_text"> + Volume : + </text> + <panel name="Volume Panel" width="249"/> + <check_box label="Couper le son" name="disable audio"/> + <text bottom="-195" name="streaming_prefs_text" width="145"> + Média : + </text> + <text name="audio_prefs_text"> + Audio : + </text> + <panel label="Volume" name="Volume Panel"/> + <check_box label="Couper le son quand minimisé" name="mute_when_minimized"/> + <check_box label="Jouer la musique disponible" name="streaming_music"/> + <check_box label="Jouer le média disponible" name="streaming_video"/> + <check_box label="Lire automatiquement le média" name="auto_streaming_video"/> + <slider label="Effet Doppler" label_width="115" name="Doppler Effect"/> + <slider label="Facteur d'éloignement" label_width="115" name="Distance Factor"/> + <slider label="Facteur d'atténuation" label_width="115" name="Rolloff Factor"/> + <spinner label="Alerte L$" name="L$ Change Threshold"/> + <spinner label="Alerte santé" name="Health Change Threshold"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml index bd67605d9f2a8eae4b99262182d92e31bb997c18..dc28547cb495e9655edffa0de3a4fa8ccbfa3cc6 100644 --- a/indra/newview/skins/default/xui/fr/panel_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_profile.xml @@ -1,41 +1,45 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Profil" name="panel_profile"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="payment_update_link_url"> - http://www.secondlife.com/account/billing.php?lang=en - </string> - <string name="my_account_link_url" value="http://secondlife.com/account"/> - <string name="no_partner_text" value="Aucun"/> - <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="Monde physique :"/> - </panel> - <text name="me_homepage_text"> - Page d'accueil : - </text> - <text name="title_member_text" value="Membre depuis :"/> - <text name="title_acc_status_text" value="Statut du compte :"/> - <text name="title_partner_text" value="Partenaire :"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="title_groups_text" value="Groupes :"/> - </panel> - </scroll_container> - <panel name="profile_buttons_panel"> - <button label="Devenir amis" name="add_friend"/> - <button label="IM" name="im"/> - <button label="Appeler" name="call"/> - <button label="Téléporter" name="teleport"/> - </panel> - <panel name="profile_me_buttons_panel"> - <button label="Modifier le profil" name="edit_profile_btn"/> - <button label="Changer d'apparence" name="edit_appearance_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profil" name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=fr-FR + </string> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=fr + </string> + <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=fr-FR"/> + <string name="no_partner_text" value="Aucun"/> + <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="Monde physique :"/> + </panel> + <text name="me_homepage_text"> + Page d'accueil : + </text> + <text name="title_member_text" value="Membre depuis :"/> + <text name="title_acc_status_text" value="Statut du compte :"/> + <text name="title_partner_text" value="Partenaire :"/> + <panel name="partner_data_panel"> + <text name="partner_text" value="[FIRST] [LAST]"/> + </panel> + <text name="title_groups_text" value="Groupes :"/> + </panel> + </scroll_container> + <panel name="profile_buttons_panel"> + <button label="Devenir amis" name="add_friend"/> + <button label="IM" name="im"/> + <button label="Appeler" name="call"/> + <button label="Téléporter" name="teleport"/> + </panel> + <panel name="profile_me_buttons_panel"> + <button label="Modifier le profil" name="edit_profile_btn"/> + <button label="Changer d'apparence" name="edit_appearance_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml index 44539ddba478dc46633c306b6af312e60c56c676..928df67e4c484d4db8a973ba84f4b17e8cbd3d2c 100644 --- a/indra/newview/skins/default/xui/fr/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/fr/panel_profile_view.xml @@ -1,15 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_target_profile"> - <string name="status_online"> - En ligne - </string> - <string name="status_offline"> - Hors ligne - </string> - <text name="user_name" value="(en cours de chargement...)"/> - <text name="status" value="En ligne"/> - <tab_container name="tabs"> - <panel label="Profil" name="panel_profile"/> - <panel label="Favoris" name="panel_picks"/> - </tab_container> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + En ligne + </string> + <string name="status_offline"> + Hors ligne + </string> + <text name="user_name" value="(en cours de chargement...)"/> + <text name="status" value="En ligne"/> + <tab_container name="tabs"> + <panel label="Profil" name="panel_profile"/> + <panel label="Favoris" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml index 5790efe2f8f3fcbfb41f9c915cc3836e9f847927..7256fe410934007cc92a0b29c86b75747ab00d49 100644 --- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/fr/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"> - Chargement… - </panel.string> - <panel.string name="can_not_view"> - Ce scipt 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. - </panel.string> - <panel.string name="public_objects_can_not_run"> - Les objets publics ne peuvent pas exécuter de scripts - </panel.string> - <panel.string name="script_running"> - Exécution en cours - </panel.string> - <panel.string name="Title"> - Script : [NAME] - </panel.string> - <text_editor name="Script Editor"> - Chargement… - </text_editor> - <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/> - <combo_box label="Insérer..." name="Insert..."/> - <menu_bar name="script_menu"> - <menu label="Fichier" name="File"> - <menu_item_call label="Enregistrer" name="Save"/> - <menu_item_call label="Annuler tous les changements" name="Revert All Changes"/> - </menu> - <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="Tout sélectionner" name="Select All"/> - <menu_item_call label="Désélectionner" name="Deselect"/> - <menu_item_call label="Rechercher / Remplacer..." name="Search / Replace..."/> - </menu> - <menu label="Aide" name="Help"> - <menu_item_call label="Aide..." name="Help..."/> - <menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/> - </menu> - </menu_bar> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + Chargement… + </panel.string> + <panel.string name="can_not_view"> + Ce scipt 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. + </panel.string> + <panel.string name="public_objects_can_not_run"> + Les objets publics ne peuvent pas exécuter de scripts + </panel.string> + <panel.string name="script_running"> + Exécution en cours + </panel.string> + <panel.string name="Title"> + Script : [NAME] + </panel.string> + <text_editor name="Script Editor"> + Chargement… + </text_editor> + <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/> + <combo_box label="Insérer..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="Fichier" name="File"> + <menu_item_call label="Enregistrer" name="Save"/> + <menu_item_call label="Annuler tous les changements" name="Revert All Changes"/> + </menu> + <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="Tout sélectionner" name="Select All"/> + <menu_item_call label="Désélectionner" name="Deselect"/> + <menu_item_call label="Rechercher / Remplacer..." name="Search / Replace..."/> + </menu> + <menu label="Aide" name="Help"> + <menu_item_call label="Aide..." name="Help..."/> + <menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml index 9a2567c831ad9b21c6dd31923d4b43b68d805c81..ee4e8a6be65d33d1565cff393d441216d9a8a99b 100644 --- a/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml +++ b/indra/newview/skins/default/xui/fr/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="Me lever" name="stand_btn" tool_tip="Cliquez ici pour vous lever."/> - <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/> -</panel> +<?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="Me lever" name="stand_btn" tool_tip="Cliquez ici pour vous lever."/> + <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/> +</panel> 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 c963b4d8cba62f3f72c171a95de7fc66b9194def..6a481a155c7f36b099f14e1981996319482413de 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -1,22 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="status"> - <panel.string name="StatBarDaysOfWeek"> - Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday - </panel.string> - <panel.string name="StatBarMonthsOfYear"> - January:February:March:April:May:June:July:August:September:October:November:December - </panel.string> - <panel.string name="packet_loss_tooltip"> - Perte de paquets - </panel.string> - <panel.string name="bandwidth_tooltip"> - Bande passante - </panel.string> - <panel.string name="buycurrencylabel"> - [AMT] L$ - </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="Mon solde : Cliquez ici pour acheter plus de L$"/> - <text name="TimeText" tool_tip="Heure actuelle (Californie)"> - midi - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + January:February:March:April:May:June:July:August:September:October:November:December + </panel.string> + <panel.string name="packet_loss_tooltip"> + Perte de paquets + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bande passante + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="Mon solde : Cliquez ici pour acheter plus de L$"/> + <text name="TimeText" tool_tip="Heure actuelle (Californie)"> + midi + </text> +</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 2fb7baaf7ca1347e5e57a774837eba2fc3bca10b..a35d0eaea9c4ab6b6973ac46938f4cefcf68aed6 100644 --- a/indra/newview/skins/default/xui/fr/panel_world_map.xml +++ b/indra/newview/skins/default/xui/fr/panel_world_map.xml @@ -1,57 +1,57 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="world_map"> - <panel.string name="Loading"> - Chargement… - </panel.string> - <panel.string name="InvalidLocation"> - Lieu invalide... - </panel.string> - <panel.string name="world_map_north"> - N - </panel.string> - <panel.string name="world_map_east"> - E - </panel.string> - <panel.string name="world_map_west"> - O - </panel.string> - <panel.string name="world_map_south"> - S - </panel.string> - <panel.string name="world_map_southeast"> - SE - </panel.string> - <panel.string name="world_map_northeast"> - NE - </panel.string> - <panel.string name="world_map_southwest"> - SO - </panel.string> - <panel.string name="world_map_northwest"> - NO - </panel.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="E" name="floater_map_east" text="E"> - E - </text> - <text label="O" name="floater_map_west" text="O"> - O - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SE" name="floater_map_southeast" text="SE"> - SE - </text> - <text label="NE" name="floater_map_northeast" text="NE"> - NE - </text> - <text label="SO" name="floater_map_southwest" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northwest" text="NO"> - NO - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="world_map"> + <panel.string name="Loading"> + Chargement… + </panel.string> + <panel.string name="InvalidLocation"> + Lieu invalide... + </panel.string> + <panel.string name="world_map_north"> + N + </panel.string> + <panel.string name="world_map_east"> + E + </panel.string> + <panel.string name="world_map_west"> + O + </panel.string> + <panel.string name="world_map_south"> + S + </panel.string> + <panel.string name="world_map_southeast"> + SE + </panel.string> + <panel.string name="world_map_northeast"> + NE + </panel.string> + <panel.string name="world_map_southwest"> + SO + </panel.string> + <panel.string name="world_map_northwest"> + NO + </panel.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="E" name="floater_map_east" text="E"> + E + </text> + <text label="O" name="floater_map_west" text="O"> + O + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SE" name="floater_map_southeast" text="SE"> + SE + </text> + <text label="NE" name="floater_map_northeast" text="NE"> + NE + </text> + <text label="SO" name="floater_map_southwest" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northwest" text="NO"> + NO + </text> +</panel> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 06cc7d4a791dc33f82aa7095c040f32bf09db240..c59e359d6ec126fffdb90077c61d15d52be1c85b 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1,3149 +1,3150 @@ -<?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 - that are returned from one component and may appear in many places--> -<strings> - <string name="SECOND_LIFE"> - Second Life - </string> - <string name="APP_NAME"> - Second Life - </string> - <string name="SECOND_LIFE_GRID"> - Grille de Second Life - </string> - <string name="SUPPORT_SITE"> - Portail Assistance Second Life - </string> - <string name="StartupDetectingHardware"> - Détection du matériel... - </string> - <string name="StartupLoading"> - Chargement - </string> - <string name="Fullbright"> - Fullbright (Legacy) - </string> - <string name="LoginInProgress"> - La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. - </string> - <string name="LoginInProgressNoFrozen"> - Connexion... - </string> - <string name="LoginAuthenticating"> - Authentification en cours - </string> - <string name="LoginMaintenance"> - Maintenance du compte en cours… - </string> - <string name="LoginAttempt"> - La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER] - </string> - <string name="LoginPrecaching"> - Monde en cours de chargement… - </string> - <string name="LoginInitializingBrowser"> - Navigateur Web incorporé en cours d'initialisation… - </string> - <string name="LoginInitializingMultimedia"> - Multimédia en cours d'initialisation… - </string> - <string name="LoginVerifyingCache"> - Fichiers du cache en cours de vérification (peut prendre 60-90 s)... - </string> - <string name="LoginProcessingResponse"> - Réponse en cours de traitement… - </string> - <string name="LoginInitializingWorld"> - Monde en cours d'initialisation… - </string> - <string name="LoginDecodingImages"> - Décodage des images en cours... - </string> - <string name="LoginInitializingQuicktime"> - Quicktime en cours d'initialisation - </string> - <string name="LoginQuicktimeNotFound"> - Quicktime introuvable, impossible de procéder à l'initialisation. - </string> - <string name="LoginQuicktimeOK"> - Initialisation de Quicktime réussie. - </string> - <string name="LoginWaitingForRegionHandshake"> - Liaison avec la région en cours de création... - </string> - <string name="LoginConnectingToRegion"> - Connexion avec la région en cours... - </string> - <string name="LoginDownloadingClothing"> - Habits en cours de téléchargement... - </string> - <string name="AgentLostConnection"> - Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet. - </string> - <string name="TooltipPerson"> - Personne - </string> - <string name="TooltipNoName"> - (pas de nom) - </string> - <string name="TooltipOwner"> - Propriétaire : - </string> - <string name="TooltipPublic"> - Public - </string> - <string name="TooltipIsGroup"> - (Groupe) - </string> - <string name="TooltipForSaleL$"> - À vendre : [AMOUNT] L$ - </string> - <string name="TooltipFlagGroupBuild"> - Contruction de groupe - </string> - <string name="TooltipFlagNoBuild"> - Pas de construction - </string> - <string name="TooltipFlagNoEdit"> - Contruction de groupe - </string> - <string name="TooltipFlagNotSafe"> - Non sécurisé - </string> - <string name="TooltipFlagNoFly"> - Interdiction de voler - </string> - <string name="TooltipFlagGroupScripts"> - Scripts de groupe - </string> - <string name="TooltipFlagNoScripts"> - Pas de scripts - </string> - <string name="TooltipLand"> - Terrain : - </string> - <string name="TooltipMustSingleDrop"> - Impossible de faire glisser plus d'un objet ici - </string> - <string name="TooltipHttpUrl"> - Cliquez pour afficher cette page web - </string> - <string name="TooltipSLURL"> - Cliquez pour en savoir plus sur cet endroit - </string> - <string name="TooltipAgentUrl"> - Cliquez pour afficher le profil de ce résident - </string> - <string name="TooltipGroupUrl"> - Cliquez pour afficher la description de ce groupe - </string> - <string name="TooltipEventUrl"> - Cliquez pour afficher la description de cet événement - </string> - <string name="TooltipClassifiedUrl"> - Cliquez pour afficher cette petite annonce - </string> - <string name="TooltipParcelUrl"> - Cliquez pour afficher la description de cette parcelle - </string> - <string name="TooltipTeleportUrl"> - Cliquez pour vous téléporter à cet endroit - </string> - <string name="TooltipObjectIMUrl"> - Cliquez pour afficher la description de cet objet - </string> - <string name="TooltipSLAPP"> - Cliquez pour exécuter la commande secondlife:// command - </string> - <string name="BUTTON_CLOSE_DARWIN"> - Fermer (⌘-W) - </string> - <string name="BUTTON_CLOSE_WIN"> - Fermer (Ctrl+W) - </string> - <string name="BUTTON_RESTORE"> - Restaurer - </string> - <string name="BUTTON_MINIMIZE"> - Minimiser - </string> - <string name="BUTTON_TEAR_OFF"> - Réduire - </string> - <string name="BUTTON_DOCK"> - Attacher - </string> - <string name="BUTTON_UNDOCK"> - Détacher - </string> - <string name="BUTTON_HELP"> - Afficher l'aide - </string> - <string name="RetrievingData"> - En cours d'extraction... - </string> - <string name="ReleaseNotes"> - Notes de version - </string> - <string name="LoadingData"> - Chargement.. - </string> - <string name="AvatarNameNobody"> - (personne) - </string> - <string name="AvatarNameWaiting"> - (en attente) - </string> - <string name="AvatarNameHippos"> - (hippos) - </string> - <string name="GroupNameNone"> - (aucun) - </string> - <string name="AssetErrorNone"> - Aucune erreur - </string> - <string name="AssetErrorRequestFailed"> - Requête de l'actif : échec - </string> - <string name="AssetErrorNonexistentFile"> - Requête de l'actif : fichier inexistant - </string> - <string name="AssetErrorNotInDatabase"> - Requête de l'actif : actif introuvable dans la base de données - </string> - <string name="AssetErrorEOF"> - Fin du ficher - </string> - <string name="AssetErrorCannotOpenFile"> - Impossible d'ouvrir le fichier - </string> - <string name="AssetErrorFileNotFound"> - Fichier introuvable - </string> - <string name="AssetErrorTCPTimeout"> - Délai d'attente du transfert du fichier dépassé - </string> - <string name="AssetErrorCircuitGone"> - Disparition du circuit - </string> - <string name="AssetErrorPriceMismatch"> - Il y a une différence de prix entre le client et le serveur - </string> - <string name="AssetErrorUnknownStatus"> - Statut inconnu - </string> - <string name="texture"> - texture - </string> - <string name="sound"> - son - </string> - <string name="calling card"> - carte de visite - </string> - <string name="landmark"> - repère - </string> - <string name="legacy script"> - script (ancienne version) - </string> - <string name="clothing"> - habits - </string> - <string name="object"> - objet - </string> - <string name="note card"> - note - </string> - <string name="folder"> - dossier - </string> - <string name="root"> - racine - </string> - <string name="lsl2 script"> - script lsl2 - </string> - <string name="lsl bytecode"> - bytecode lsl - </string> - <string name="tga texture"> - texture tga - </string> - <string name="body part"> - partie du corps - </string> - <string name="snapshot"> - photo - </string> - <string name="lost and found"> - objets trouvés - </string> - <string name="targa image"> - image targa - </string> - <string name="trash"> - poubelle - </string> - <string name="jpeg image"> - image jpeg - </string> - <string name="animation"> - animation - </string> - <string name="gesture"> - geste - </string> - <string name="simstate"> - simstate - </string> - <string name="favorite"> - favori - </string> - <string name="symbolic link"> - lien - </string> - <string name="AvatarAway"> - Absent - </string> - <string name="AvatarBusy"> - Occupé - </string> - <string name="AvatarMuted"> - Ignoré - </string> - <string name="anim_express_afraid"> - Effrayé - </string> - <string name="anim_express_anger"> - En colère - </string> - <string name="anim_away"> - Absent - </string> - <string name="anim_backflip"> - Salto arrière - </string> - <string name="anim_express_laugh"> - Rire en se tenant le ventre - </string> - <string name="anim_express_toothsmile"> - Grand sourire - </string> - <string name="anim_blowkiss"> - Envoyer un baiser - </string> - <string name="anim_express_bored"> - Bailler d'ennui - </string> - <string name="anim_bow"> - S'incliner - </string> - <string name="anim_clap"> - Applaudir - </string> - <string name="anim_courtbow"> - Révérence de cour - </string> - <string name="anim_express_cry"> - Pleurer - </string> - <string name="anim_dance1"> - Danse 1 - </string> - <string name="anim_dance2"> - Danse 2 - </string> - <string name="anim_dance3"> - Danse 3 - </string> - <string name="anim_dance4"> - Danse 4 - </string> - <string name="anim_dance5"> - Danse 5 - </string> - <string name="anim_dance6"> - Danse 6 - </string> - <string name="anim_dance7"> - Danse 7 - </string> - <string name="anim_dance8"> - Danse 8 - </string> - <string name="anim_express_disdain"> - Mépris - </string> - <string name="anim_drink"> - Boire - </string> - <string name="anim_express_embarrased"> - Gêne - </string> - <string name="anim_angry_fingerwag"> - Désapprobation - </string> - <string name="anim_fist_pump"> - Victoire - </string> - <string name="anim_yoga_float"> - Yoga - </string> - <string name="anim_express_frown"> - Froncer les sourcils - </string> - <string name="anim_impatient"> - Impatient - </string> - <string name="anim_jumpforjoy"> - Sauter de joie - </string> - <string name="anim_kissmybutt"> - Va te faire voir ! - </string> - <string name="anim_express_kiss"> - Baiser - </string> - <string name="anim_laugh_short"> - Rire - </string> - <string name="anim_musclebeach"> - Montrer ses muscles - </string> - <string name="anim_no_unhappy"> - Non (mécontent) - </string> - <string name="anim_no_head"> - Non - </string> - <string name="anim_nyanya"> - Na na na na nère - </string> - <string name="anim_punch_onetwo"> - Gauche-droite - </string> - <string name="anim_express_open_mouth"> - Bouche ouverte - </string> - <string name="anim_peace"> - Paix - </string> - <string name="anim_point_you"> - Montrer quelqu'un du doigt - </string> - <string name="anim_point_me"> - Se montrer du doigt - </string> - <string name="anim_punch_l"> - Gauche - </string> - <string name="anim_punch_r"> - Droite - </string> - <string name="anim_rps_countdown"> - Compter (pierre-papier-ciseaux) - </string> - <string name="anim_rps_paper"> - Papier (pierre-papier-ciseaux) - </string> - <string name="anim_rps_rock"> - Pierre (pierre-papier-ciseaux) - </string> - <string name="anim_rps_scissors"> - Ciseaux (pierre-papier-ciseaux) - </string> - <string name="anim_express_repulsed"> - Dégoût - </string> - <string name="anim_kick_roundhouse_r"> - Coup de pied circulaire - </string> - <string name="anim_express_sad"> - Triste - </string> - <string name="anim_salute"> - Salut - </string> - <string name="anim_shout"> - Crier - </string> - <string name="anim_express_shrug"> - Hausser les épaules - </string> - <string name="anim_express_smile"> - Sourire - </string> - <string name="anim_smoke_idle"> - Fumer, immobile - </string> - <string name="anim_smoke_inhale"> - Fumer, prendre une bouffée - </string> - <string name="anim_smoke_throw_down"> - Fumer, jeter son mégot - </string> - <string name="anim_express_surprise"> - Surprise - </string> - <string name="anim_sword_strike_r"> - Coup d'épée - </string> - <string name="anim_angry_tantrum"> - Caprice - </string> - <string name="anim_express_tongue_out"> - Tirer la langue - </string> - <string name="anim_hello"> - Faire signe - </string> - <string name="anim_whisper"> - Chuchoter - </string> - <string name="anim_whistle"> - Siffler - </string> - <string name="anim_express_wink"> - Clin d'Å“il - </string> - <string name="anim_wink_hollywood"> - Clin d'Å“il (Hollywood) - </string> - <string name="anim_express_worry"> - Soucis - </string> - <string name="anim_yes_happy"> - Oui (Joie) - </string> - <string name="anim_yes_head"> - Oui - </string> - <string name="texture_loading"> - Chargement... - </string> - <string name="worldmap_offline"> - Hors ligne - </string> - <string name="Ok"> - OK - </string> - <string name="Premature end of file"> - Fichier incomplet - </string> - <string name="ST_NO_JOINT"> - Impossible de trouver ROOT ou JOINT. - </string> - <string name="whisper"> - chuchote : - </string> - <string name="shout"> - crie : - </string> - <string name="ringing"> - Connexion au chat vocal du Monde en cours… - </string> - <string name="connected"> - Connecté(e) - </string> - <string name="unavailable"> - Voix non disponible à l'endroit où vous êtes - </string> - <string name="hang_up"> - Déconnecté du chat vocal - </string> - <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Débiter vos Linden dollars (L$) - </string> - <string name="ActOnControlInputs"> - Utiliser vos touches de commandes - </string> - <string name="RemapControlInputs"> - Reconfigurer vos touches de commandes - </string> - <string name="AnimateYourAvatar"> - Animer votre avatar - </string> - <string name="AttachToYourAvatar"> - Attacher à votre avatar - </string> - <string name="ReleaseOwnership"> - Passer l'objet dans le domaine public (sans propriétaire) - </string> - <string name="LinkAndDelink"> - Lier et délier d'autres objets - </string> - <string name="AddAndRemoveJoints"> - Créer et supprimer des liens avec d'autres objets - </string> - <string name="ChangePermissions"> - Modifier ses droits - </string> - <string name="TrackYourCamera"> - Suivre votre caméra - </string> - <string name="ControlYourCamera"> - Contrôler votre caméra - </string> - <string name="SIM_ACCESS_PG"> - PG - </string> - <string name="SIM_ACCESS_MATURE"> - Mature - </string> - <string name="SIM_ACCESS_ADULT"> - Adult - </string> - <string name="SIM_ACCESS_DOWN"> - Hors ligne - </string> - <string name="SIM_ACCESS_MIN"> - Inconnu - </string> - <string name="land_type_unknown"> - (inconnu) - </string> - <string name="all_files"> - Tous fichiers - </string> - <string name="sound_files"> - Sons - </string> - <string name="animation_files"> - Animations - </string> - <string name="image_files"> - Images - </string> - <string name="save_file_verb"> - Enregistrer - </string> - <string name="load_file_verb"> - Charger - </string> - <string name="targa_image_files"> - Images Targa - </string> - <string name="bitmap_image_files"> - Images Bitmap - </string> - <string name="avi_movie_file"> - Fichier de film AVI - </string> - <string name="xaf_animation_file"> - Fichier d'animation XAF - </string> - <string name="xml_file"> - Fichier XML - </string> - <string name="dot_raw_file"> - Fichier RAW - </string> - <string name="compressed_image_files"> - Images compressées - </string> - <string name="load_files"> - Charger des fichiers - </string> - <string name="choose_the_directory"> - Choisir le répertoire - </string> - <string name="AvatarSetNotAway"> - Ne plus me mettre en mode absent - </string> - <string name="AvatarSetAway"> - Me mettre en mode absent - </string> - <string name="AvatarSetNotBusy"> - Ne plus me mettre en mode occupé - </string> - <string name="AvatarSetBusy"> - Me mettre en mode occupé - </string> - <string name="shape"> - Silhouette - </string> - <string name="skin"> - Peau - </string> - <string name="hair"> - Cheveux - </string> - <string name="eyes"> - Yeux - </string> - <string name="shirt"> - Chemise - </string> - <string name="pants"> - Pantalon - </string> - <string name="shoes"> - Chaussures - </string> - <string name="socks"> - Chaussettes - </string> - <string name="jacket"> - Veste - </string> - <string name="gloves"> - Gants - </string> - <string name="undershirt"> - Sous-vêtements (homme) - </string> - <string name="underpants"> - Sous-vêtements (femme) - </string> - <string name="skirt"> - Jupe - </string> - <string name="invalid"> - non valide - </string> - <string name="BodyPartsRightArm"> - Bras droit - </string> - <string name="BodyPartsHead"> - Tête - </string> - <string name="BodyPartsLeftArm"> - Bras gauche - </string> - <string name="BodyPartsLeftLeg"> - Jambe gauche - </string> - <string name="BodyPartsTorso"> - Torse - </string> - <string name="BodyPartsRightLeg"> - Jambe droite - </string> - <string name="GraphicsQualityLow"> - Faible - </string> - <string name="GraphicsQualityMid"> - Moyen - </string> - <string name="GraphicsQualityHigh"> - Élevé - </string> - <string name="LeaveMouselook"> - Appuyez sur ESC pour quitter la vue subjective - </string> - <string name="InventoryNoMatchingItems"> - Aucun objet correspondant ne se trouve dans l'inventaire. - </string> - <string name="InventoryNoTexture"> - Vous n'avez pas de copie de cette texture dans votre inventaire - </string> - <string name="LoadingContents"> - chargement des contenus en cours... - </string> - <string name="NoContents"> - Aucun contenu - </string> - <string name="InvFolder My Inventory"> - Mon inventaire - </string> - <string name="InvFolder My Favorites"> - Mes favoris - </string> - <string name="InvFolder Library"> - Bibliothèque - </string> - <string name="InvFolder Textures"> - Textures - </string> - <string name="InvFolder Sounds"> - Sons - </string> - <string name="InvFolder Calling Cards"> - Cartes de visite - </string> - <string name="InvFolder Landmarks"> - Repères - </string> - <string name="InvFolder Scripts"> - Scripts - </string> - <string name="InvFolder Clothing"> - Habits - </string> - <string name="InvFolder Objects"> - Objets - </string> - <string name="InvFolder Notecards"> - Notes - </string> - <string name="InvFolder New Folder"> - Nouveau dossier - </string> - <string name="InvFolder Inventory"> - Inventaire - </string> - <string name="InvFolder Uncompressed Images"> - Images non compressées - </string> - <string name="InvFolder Body Parts"> - Parties du corps - </string> - <string name="InvFolder Trash"> - Poubelle - </string> - <string name="InvFolder Photo Album"> - Albums photo - </string> - <string name="InvFolder Lost And Found"> - Objets trouvés - </string> - <string name="InvFolder Uncompressed Sounds"> - Sons non compressés - </string> - <string name="InvFolder Animations"> - Animations - </string> - <string name="InvFolder Gestures"> - Gestes - </string> - <string name="InvFolder favorite"> - Favoris - </string> - <string name="InvFolder Current Outfit"> - Tenue actuelle - </string> - <string name="InvFolder My Outfits"> - Mes tenues - </string> - <string name="InvFolder Friends"> - Amis - </string> - <string name="InvFolder All"> - Tout - </string> - <string name="Buy"> - Acheter - </string> - <string name="BuyforL$"> - Acheter des L$ - </string> - <string name="Stone"> - Pierre - </string> - <string name="Metal"> - Métal - </string> - <string name="Glass"> - Verre - </string> - <string name="Wood"> - Bois - </string> - <string name="Flesh"> - Chair - </string> - <string name="Plastic"> - Plastique - </string> - <string name="Rubber"> - Caoutchouc - </string> - <string name="Light"> - Léger - </string> - <string name="KBShift"> - Maj- - </string> - <string name="KBCtrl"> - Ctrl - </string> - <string name="Chest"> - Poitrine - </string> - <string name="Skull"> - Crâne - </string> - <string name="Left Shoulder"> - Épaule gauche - </string> - <string name="Right Shoulder"> - Épaule droite - </string> - <string name="Left Hand"> - Main gauche - </string> - <string name="Right Hand"> - Main droite - </string> - <string name="Left Foot"> - Pied gauche - </string> - <string name="Right Foot"> - Pied droit - </string> - <string name="Spine"> - Colonne - </string> - <string name="Pelvis"> - Bassin - </string> - <string name="Mouth"> - Bouche - </string> - <string name="Chin"> - Menton - </string> - <string name="Left Ear"> - Oreille gauche - </string> - <string name="Right Ear"> - Oreille droite - </string> - <string name="Left Eyeball"> - Globe oculaire gauche - </string> - <string name="Right Eyeball"> - Globe oculaire droit - </string> - <string name="Nose"> - Nez - </string> - <string name="R Upper Arm"> - Bras D - </string> - <string name="R Forearm"> - Avant-bras D - </string> - <string name="L Upper Arm"> - Bras G - </string> - <string name="L Forearm"> - Avant-bras G - </string> - <string name="Right Hip"> - Hanche droite - </string> - <string name="R Upper Leg"> - Cuisse D - </string> - <string name="R Lower Leg"> - Jambe D - </string> - <string name="Left Hip"> - Hanche gauche - </string> - <string name="L Upper Leg"> - Cuisse G - </string> - <string name="L Lower Leg"> - Jambe G - </string> - <string name="Stomach"> - Estomac - </string> - <string name="Left Pec"> - Pectoral gauche - </string> - <string name="Right Pec"> - Pectoral droit - </string> - <string name="YearsMonthsOld"> - [AGEYEARS] [AGEMONTHS] - </string> - <string name="YearsOld"> - [AGEYEARS] - </string> - <string name="MonthsOld"> - [AGEMONTHS] - </string> - <string name="WeeksOld"> - [AGEWEEKS] - </string> - <string name="DaysOld"> - [AGEDAYS] - </string> - <string name="TodayOld"> - Inscrit aujourd'hui - </string> - <string name="AgeYearsA"> - [COUNT] an - </string> - <string name="AgeYearsB"> - [COUNT] ans - </string> - <string name="AgeYearsC"> - [COUNT] ans - </string> - <string name="AgeMonthsA"> - [COUNT] mois - </string> - <string name="AgeMonthsB"> - [COUNT] mois - </string> - <string name="AgeMonthsC"> - [COUNT] mois - </string> - <string name="AgeWeeksA"> - [COUNT] semaine - </string> - <string name="AgeWeeksB"> - [COUNT] semaines - </string> - <string name="AgeWeeksC"> - [COUNT] semaines - </string> - <string name="AgeDaysA"> - [COUNT] jour - </string> - <string name="AgeDaysB"> - [COUNT] jours - </string> - <string name="AgeDaysC"> - [COUNT] jours - </string> - <string name="AcctTypeResident"> - Résident - </string> - <string name="AcctTypeTrial"> - Essai - </string> - <string name="AcctTypeCharterMember"> - Membre originaire - </string> - <string name="AcctTypeEmployee"> - Employé(e) de Linden Lab - </string> - <string name="PaymentInfoUsed"> - Infos de paiement utilisées - </string> - <string name="PaymentInfoOnFile"> - Infos de paiement enregistrées - </string> - <string name="NoPaymentInfoOnFile"> - Aucune info de paiement - </string> - <string name="AgeVerified"> - Âge vérifié - </string> - <string name="NotAgeVerified"> - Âge non vérifié - </string> - <string name="Center 2"> - Centrer 2 - </string> - <string name="Top Right"> - En haut à droite - </string> - <string name="Top"> - En haut - </string> - <string name="Top Left"> - En haut à gauche - </string> - <string name="Center"> - Centrer - </string> - <string name="Bottom Left"> - En bas à gauche - </string> - <string name="Bottom"> - Bas - </string> - <string name="Bottom Right"> - En bas à droite - </string> - <string name="CompileQueueDownloadedCompiling"> - Téléchargé, compilation en cours - </string> - <string name="CompileQueueScriptNotFound"> - Script introuvable sur le serveur. - </string> - <string name="CompileQueueProblemDownloading"> - Problème lors du téléchargement - </string> - <string name="CompileQueueInsufficientPermDownload"> - Permissions insuffisantes pour télécharger un script. - </string> - <string name="CompileQueueInsufficientPermFor"> - Permissions insuffisantes pour - </string> - <string name="CompileQueueUnknownFailure"> - Échec du téléchargement, erreur inconnue - </string> - <string name="CompileQueueTitle"> - Recompilation - progrès - </string> - <string name="CompileQueueStart"> - recompiler - </string> - <string name="ResetQueueTitle"> - Réinitialiser les progrès - </string> - <string name="ResetQueueStart"> - réinitialiser - </string> - <string name="RunQueueTitle"> - Lancer - </string> - <string name="RunQueueStart"> - lancer - </string> - <string name="NotRunQueueTitle"> - Arrêter - </string> - <string name="NotRunQueueStart"> - arrêter - </string> - <string name="CompileSuccessful"> - Compilation réussie ! - </string> - <string name="CompileSuccessfulSaving"> - Compilation réussie, enregistrement en cours... - </string> - <string name="SaveComplete"> - Enregistrement terminé. - </string> - <string name="ObjectOutOfRange"> - Script (objet hors de portée) - </string> - <string name="GodToolsObjectOwnedBy"> - Objet [OBJECT] possédé par [OWNER] - </string> - <string name="GroupsNone"> - aucun - </string> - <string name="Unknown"> - (Inconnu) - </string> - <string name="Balance"> - Solde - </string> - <string name="Credits"> - Remerciements - </string> - <string name="Debits"> - Débits - </string> - <string name="Total"> - Total - </string> - <string name="NoGroupDataFound"> - Aucune donnée trouvée pour le groupe - </string> - <string name="IMParentEstate"> - domaine parent - </string> - <string name="IMMainland"> - continent - </string> - <string name="IMTeen"> - teen - </string> - <string name="RegionInfoError"> - erreur - </string> - <string name="RegionInfoAllEstatesOwnedBy"> - tous les domaines possédés par [OWNER] - </string> - <string name="RegionInfoAllEstatesYouOwn"> - tous les domaines que vous possédez - </string> - <string name="RegionInfoAllEstatesYouManage"> - tous les domaines que vous gérez pour [owner] - </string> - <string name="RegionInfoAllowedResidents"> - Résidents autorisés : ([ALLOWEDAGENTS], max [MAXACCESS]) - </string> - <string name="RegionInfoAllowedGroups"> - Groupes autorisés : ([ALLOWEDGROUPS], max [MAXACCESS]) - </string> - <string name="CursorPos"> - Ligne [LINE], Colonne [COLUMN] - </string> - <string name="PanelDirCountFound"> - [COUNT] trouvé(s) - </string> - <string name="PanelContentsNewScript"> - Nouveau script - </string> - <string name="MuteByName"> - (par nom) - </string> - <string name="MuteAgent"> - (résident) - </string> - <string name="MuteObject"> - (objet) - </string> - <string name="MuteGroup"> - (groupe) - </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="GroupOwned"> - Propriété du groupe - </string> - <string name="Public"> - Public - </string> - <string name="ClassifiedClicksTxt"> - Clics : [TELEPORT] téléporter, [MAP] carte, [PROFILE] profile - </string> - <string name="ClassifiedUpdateAfterPublish"> - (mise à jour après la publication) - </string> - <string name="GroupVoteYes"> - Oui - </string> - <string name="GroupVoteNo"> - Non - </string> - <string name="GroupVoteNoActiveProposals"> - Il n'y a aucune proposition active actuellement - </string> - <string name="GroupVoteNoArchivedProposals"> - Il n'y a aucune proposition archivée actuellement - </string> - <string name="GroupVoteRetrievingArchivedProposals"> - Extraction des propositions archivées - </string> - <string name="GroupVoteRetrievingActiveProposals"> - Extraction des propositions actives - </string> - <string name="MultiPreviewTitle"> - Prévisualiser - </string> - <string name="MultiPropertiesTitle"> - Propriétés - </string> - <string name="InvOfferAnObjectNamed"> - Un objet appelé - </string> - <string name="InvOfferOwnedByGroup"> - possédé par le groupe - </string> - <string name="InvOfferOwnedByUnknownGroup"> - possédé par un groupe inconnu - </string> - <string name="InvOfferOwnedBy"> - possédé par - </string> - <string name="InvOfferOwnedByUnknownUser"> - possédé par un résident inconnu - </string> - <string name="InvOfferGaveYou"> - vous a donné - </string> - <string name="InvOfferYouDecline"> - Vous avez refusé - </string> - <string name="InvOfferFrom"> - de la part de - </string> - <string name="GroupMoneyTotal"> - Total - </string> - <string name="GroupMoneyBought"> - acheté - </string> - <string name="GroupMoneyPaidYou"> - vous a payé - </string> - <string name="GroupMoneyPaidInto"> - payé - </string> - <string name="GroupMoneyBoughtPassTo"> - a acheté un pass à - </string> - <string name="GroupMoneyPaidFeeForEvent"> - a payé des frais pour un événement - </string> - <string name="GroupMoneyPaidPrizeForEvent"> - a payé un prix pour un événement - </string> - <string name="GroupMoneyBalance"> - Solde - </string> - <string name="GroupMoneyCredits"> - Remerciements - </string> - <string name="GroupMoneyDebits"> - Débits - </string> - <string name="ViewerObjectContents"> - Contenus - </string> - <string name="AcquiredItems"> - Objets acquis - </string> - <string name="Cancel"> - Annuler - </string> - <string name="UploadingCosts"> - Chargement de %s coûts - </string> - <string name="UnknownFileExtension"> - Extension de fichier inconnue. %s -.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés - </string> - <string name="AddLandmarkNavBarMenu"> - Ajouter un repère... - </string> - <string name="EditLandmarkNavBarMenu"> - Modifier le repère... - </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> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Maj+ - </string> - <string name="FileSaved"> - Fichier enregistré - </string> - <string name="Receiving"> - Réception - </string> - <string name="AM"> - AM - </string> - <string name="PM"> - PM - </string> - <string name="PST"> - PST - </string> - <string name="PDT"> - PDT - </string> - <string name="Forward"> - Vers l'avant - </string> - <string name="Left"> - Gauche - </string> - <string name="Right"> - Droite - </string> - <string name="Back"> - Précédente - </string> - <string name="North"> - Nord - </string> - <string name="South"> - Sud - </string> - <string name="West"> - Ouest - </string> - <string name="East"> - Est - </string> - <string name="Up"> - Vers le haut - </string> - <string name="Down"> - Vers le bas - </string> - <string name="Any Category"> - Toutes catégories - </string> - <string name="Shopping"> - Shopping - </string> - <string name="Land Rental"> - Terrains à louer - </string> - <string name="Property Rental"> - Propriétés à louer - </string> - <string name="Special Attraction"> - Divertissements - </string> - <string name="New Products"> - Nouveaux produits - </string> - <string name="Employment"> - Emplois - </string> - <string name="Wanted"> - Offres - </string> - <string name="Service"> - Services - </string> - <string name="Personal"> - Divers - </string> - <string name="None"> - Aucun - </string> - <string name="Linden Location"> - Appartenant aux Lindens - </string> - <string name="Adult"> - Adult - </string> - <string name="Arts&Culture"> - Art et Culture - </string> - <string name="Business"> - Affaires - </string> - <string name="Educational"> - Éducation - </string> - <string name="Gaming"> - Jeux - </string> - <string name="Hangout"> - Favoris - </string> - <string name="Newcomer Friendly"> - Accueil pour les nouveaux - </string> - <string name="Parks&Nature"> - Parcs et Nature - </string> - <string name="Residential"> - Résidentiel - </string> - <string name="Stage"> - Phase - </string> - <string name="Other"> - Autre - </string> - <string name="Any"> - Aucun - </string> - <string name="You"> - Vous - </string> - <string name=":"> - : - </string> - <string name=","> - , - </string> - <string name="..."> - ... - </string> - <string name="***"> - *** - </string> - <string name="("> - ( - </string> - <string name=")"> - ) - </string> - <string name="."> - . - </string> - <string name="'"> - ' - </string> - <string name="---"> - --- - </string> - <string name="MBCmdLineError"> - Une erreur est survenue lors de la lecture de la ligne de commande. -Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters -Erreur : - </string> - <string name="MBCmdLineUsg"> - [APP_NAME] Utilisation de la ligne de commande : - </string> - <string name="MBUnableToAccessFile"> - [APP_NAME] ne peut accéder à un fichier requis. - -Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert. -Si ce message persiste, veuillez redémarrer votre ordinateur. -Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME]. - </string> - <string name="MBFatalError"> - Erreur fatale - </string> - <string name="MBRequiresAltiVec"> - [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure). - </string> - <string name="MBAlreadyRunning"> - [APP_NAME] est déjà lancé. -Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches. -Si ce message persiste, redémarrez votre ordinateur. - </string> - <string name="MBFrozenCrashed"> - [APP_NAME] semble avoir crashé lors de l'utilisation précédente. -Voulez-vous envoyer un rapport de crash ? - </string> - <string name="MBAlert"> - Alerte - </string> - <string name="MBNoDirectX"> - [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. -[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance, ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b. - -Voulez-vous continuer ? - </string> - <string name="MBWarning"> - Avertissement - </string> - <string name="MBNoAutoUpdate"> - Les mises à jour automatiques n'existent pas encore pour Linux. -Veuillez télécharger la dernière version sur www.secondlife.com. - </string> - <string name="MBRegClassFailed"> - RegisterClass a échoué - </string> - <string name="MBError"> - Erreur - </string> - <string name="MBFullScreenErr"> - Impossible d'ouvrir le mode plein écran de [WIDTH] x [HEIGHT] -Utilisation du mode fenêtré. - </string> - <string name="MBDestroyWinFailed"> - Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() failed)) - </string> - <string name="MBShutdownErr"> - Erreur de fermeture - </string> - <string name="MBDevContextErr"> - Impossible de créer le contexte GL - </string> - <string name="MBPixelFmtErr"> - Impossible de trouver le format pixel approprié - </string> - <string name="MBPixelFmtDescErr"> - Impossible de trouver la description du format pixel - </string> - <string name="MBTrueColorWindow"> - [APP_NAME] nécessite que True Color (32-bit) soit exécuté dans une fenêtre. -Veuillez allez sous Panneau de configuration > Affichage > Paramètres et régler la couleur de l'écran sur 32-bit. -Sinon, lorsque vous choisissez le mode plein écran, [APP_NAME] ajustera automatiquement l'écran à chaque utilisation. - </string> - <string name="MBAlpha"> - [APP_NAME] ne peut pas être lancé car il n'y pas de channel 8 bit accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. -Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible. - Assurez-vous aussi que votre écran est réglé sur True Clor (22-bit) sous Panneau de configuration > Affichage > Paramètres. -Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. - </string> - <string name="MBPixelFmtSetErr"> - Impossible de trouver le format pixel approprié - </string> - <string name="MBGLContextErr"> - Impossible de créer le contexte de rendu GL - </string> - <string name="MBGLContextActErr"> - Impossible d'activer le contexte de rendu GL - </string> - <string name="MBVideoDrvErr"> - [APP_NAME] ne peut pas être exécuté car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. - -Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. - </string> - <string name="5 O'Clock Shadow"> - Barbe naissante - </string> - <string name="All White"> - Tout blancs - </string> - <string name="Anime Eyes"> - Grand yeux - </string> - <string name="Arced"> - Arquées - </string> - <string name="Arm Length"> - Longueur des bras - </string> - <string name="Attached"> - Minces - </string> - <string name="Attached Earlobes"> - Largeur des lobes - </string> - <string name="Back Bangs"> - Mèches de derrière - </string> - <string name="Back Bangs Down"> - Mèches de derrière Bas - </string> - <string name="Back Bangs Up"> - Mèches de derrière haut - </string> - <string name="Back Fringe"> - Mèches de derrière - </string> - <string name="Back Hair"> - Cheveux de derrière - </string> - <string name="Back Hair Down"> - Cheveux de derrière Bas - </string> - <string name="Back Hair Up"> - Cheveux de derrière haut - </string> - <string name="Baggy"> - Cernés - </string> - <string name="Bangs"> - Frange - </string> - <string name="Bangs Down"> - Frange Bas - </string> - <string name="Bangs Up"> - Frange Haut - </string> - <string name="Beady Eyes"> - Yeux perçants - </string> - <string name="Belly Size"> - Taille du ventre - </string> - <string name="Big"> - Gros - </string> - <string name="Big Butt"> - Grosses fesses - </string> - <string name="Big Eyeball"> - Gros globe oculaire - </string> - <string name="Big Hair Back"> - Cheveux volumineux : Derrière - </string> - <string name="Big Hair Front"> - Cheveux volumineux : Devant - </string> - <string name="Big Hair Top"> - Cheveux volumineux : En haut - </string> - <string name="Big Head"> - Grosse tête - </string> - <string name="Big Pectorals"> - Gros pectoraux - </string> - <string name="Big Spikes"> - Spikes - </string> - <string name="Black"> - Noir - </string> - <string name="Blonde"> - Blond - </string> - <string name="Blonde Hair"> - Cheveux blonds - </string> - <string name="Blush"> - Blush - </string> - <string name="Blush Color"> - Couleur du blush - </string> - <string name="Blush Opacity"> - Opacité du blush - </string> - <string name="Body Definition"> - Contour du corps - </string> - <string name="Body Fat"> - Graisse - </string> - <string name="Body Freckles"> - Grains de beauté - </string> - <string name="Body Thick"> - Corps épais - </string> - <string name="Body Thickness"> - Épaisseur du corps - </string> - <string name="Body Thin"> - Corps mince - </string> - <string name="Bow Legged"> - Jambes arquées - </string> - <string name="Breast Buoyancy"> - Hauteur des seins - </string> - <string name="Breast Cleavage"> - Clivage - </string> - <string name="Breast Size"> - Taille des seins - </string> - <string name="Bridge Width"> - Arête du nez - </string> - <string name="Broad"> - Large - </string> - <string name="Brow Size"> - Taille des sourcils - </string> - <string name="Bug Eyes"> - Yeux globuleux - </string> - <string name="Bugged Eyes"> - Yeux globuleux - </string> - <string name="Bulbous"> - En bulbe - </string> - <string name="Bulbous Nose"> - Nez en bulbe - </string> - <string name="Bushy Eyebrows"> - Sourcils touffus - </string> - <string name="Bushy Hair"> - Cheveux touffus - </string> - <string name="Butt Size"> - Taille des fesses - </string> - <string name="bustle skirt"> - Jupe gonflante - </string> - <string name="no bustle"> - Pas gonflante - </string> - <string name="more bustle"> - Plus gonflante - </string> - <string name="Chaplin"> - Chaplin - </string> - <string name="Cheek Bones"> - Pommettes - </string> - <string name="Chest Size"> - Taille de la poitrine - </string> - <string name="Chin Angle"> - Angle du menton - </string> - <string name="Chin Cleft"> - Fente labiale - </string> - <string name="Chin Curtains"> - Favoris - </string> - <string name="Chin Depth"> - Profondeur du menton - </string> - <string name="Chin Heavy"> - Menton lourd - </string> - <string name="Chin In"> - Menton rentré - </string> - <string name="Chin Out"> - Menton sorti - </string> - <string name="Chin-Neck"> - Menton-cou - </string> - <string name="Clear"> - Effacer - </string> - <string name="Cleft"> - Fente - </string> - <string name="Close Set Eyes"> - Yeux rapprochés - </string> - <string name="Closed"> - Fermé(s) - </string> - <string name="Closed Back"> - Fermé à l'arrière - </string> - <string name="Closed Front"> - Fermé devant - </string> - <string name="Closed Left"> - Fermé à gauche - </string> - <string name="Closed Right"> - Fermé à droite - </string> - <string name="Coin Purse"> - Bijoux de famille - </string> - <string name="Collar Back"> - Col arrière - </string> - <string name="Collar Front"> - Col devant - </string> - <string name="Corner Down"> - Coin vers le bas - </string> - <string name="Corner Normal"> - Coin normal - </string> - <string name="Corner Up"> - Coin vers le haut - </string> - <string name="Creased"> - Frippée - </string> - <string name="Crooked Nose"> - Nez en bec d'aigle - </string> - <string name="Cropped Hair"> - Garçonne - </string> - <string name="Cuff Flare"> - Jambe - </string> - <string name="Dark"> - Sombre - </string> - <string name="Dark Green"> - Vert foncé - </string> - <string name="Darker"> - Plus foncé - </string> - <string name="Deep"> - Profonde - </string> - <string name="Default Heels"> - Talons par défaut - </string> - <string name="Default Toe"> - Orteil par défaut - </string> - <string name="Dense"> - Dense - </string> - <string name="Dense hair"> - Cheveux denses - </string> - <string name="Double Chin"> - Double menton - </string> - <string name="Downturned"> - Pointant vers le bas - </string> - <string name="Duffle Bag"> - Membre viril - </string> - <string name="Ear Angle"> - Angle de l'oreille - </string> - <string name="Ear Size"> - Taille de l'oreille - </string> - <string name="Ear Tips"> - Pointes de l'oreille - </string> - <string name="Egg Head"> - Forme de la tête - </string> - <string name="Eye Bags"> - Cernes - </string> - <string name="Eye Color"> - Couleur des yeux - </string> - <string name="Eye Depth"> - Profondeur des yeux - </string> - <string name="Eye Lightness"> - Clarté des yeux - </string> - <string name="Eye Opening"> - Ouverture des yeux - </string> - <string name="Eye Pop"> - Å’il proéminent - </string> - <string name="Eye Size"> - Taille de l'Å“il - </string> - <string name="Eye Spacing"> - Espacement des yeux - </string> - <string name="Eyeball Size"> - Taille du globe oculaire - </string> - <string name="Eyebrow Arc"> - Arc des sourcils - </string> - <string name="Eyebrow Density"> - Épaisseur des sourcils - </string> - <string name="Eyebrow Height"> - Hauteur des sourcils - </string> - <string name="Eyebrow Points"> - Direction des sourcils - </string> - <string name="Eyebrow Size"> - Taille des sourcils - </string> - <string name="Eyelash Length"> - Longueur des cils - </string> - <string name="Eyeliner"> - Eyeliner - </string> - <string name="Eyeliner Color"> - Couleur de l'eyeliner - </string> - <string name="Eyes Back"> - Yeux noirs - </string> - <string name="Eyes Bugged"> - Yeux globuleux - </string> - <string name="Eyes Forward"> - Yeux vers l'avant - </string> - <string name="Eyes Long Head"> - Yeux longue tête - </string> - <string name="Eyes Shear Left Up"> - Å’il gauche vers le haut - </string> - <string name="Eyes Shear Right Up"> - Å’il droit vers le haut - </string> - <string name="Eyes Short Head"> - Yeux petite tête - </string> - <string name="Eyes Spread"> - Espacement des yeux - </string> - <string name="Eyes Sunken"> - Yeux enfoncés - </string> - <string name="Eyes Together"> - Yeux rapprochés - </string> - <string name="Face Shear"> - Visage - </string> - <string name="Facial Definition"> - Définition du visage - </string> - <string name="Far Set Eyes"> - Yeux écartés - </string> - <string name="Fat"> - Grosse - </string> - <string name="Fat Head"> - Grosse tête - </string> - <string name="Fat Lips"> - Lèvres épaisses - </string> - <string name="Fat Lower"> - Inférieure plus épaisse - </string> - <string name="Fat Lower Lip"> - Lèvre inférieure épaisse - </string> - <string name="Fat Torso"> - Torse épais - </string> - <string name="Fat Upper"> - Supérieure plus épaisse - </string> - <string name="Fat Upper Lip"> - Lèvre supérieure épaisse - </string> - <string name="Female"> - Femme - </string> - <string name="Fingerless"> - Sans doigts - </string> - <string name="Fingers"> - Doigts - </string> - <string name="Flared Cuffs"> - Jambes larges - </string> - <string name="Flat"> - Plat - </string> - <string name="Flat Butt"> - Fesses plates - </string> - <string name="Flat Head"> - Tête plate - </string> - <string name="Flat Toe"> - Orteil plat - </string> - <string name="Foot Size"> - Pointure - </string> - <string name="Forehead Angle"> - Angle du front - </string> - <string name="Forehead Heavy"> - Front lourd - </string> - <string name="Freckles"> - Tâches de rousseur - </string> - <string name="Front Bangs Down"> - Mèches de devant longues - </string> - <string name="Front Bangs Up"> - Mèches de devant courtes - </string> - <string name="Front Fringe"> - Mèches de devant - </string> - <string name="Front Hair"> - Cheveux devant - </string> - <string name="Front Hair Down"> - Cheveux de devant longs - </string> - <string name="Front Hair Up"> - Cheveux de devant courts - </string> - <string name="Full Back"> - Arrière touffu - </string> - <string name="Full Eyeliner"> - Eyeliner marqué - </string> - <string name="Full Front"> - Devant touffu - </string> - <string name="Full Hair Sides"> - Côtés touffus - </string> - <string name="Full Sides"> - Côtés touffus - </string> - <string name="Glossy"> - Brillant - </string> - <string name="Glove Fingers"> - Doigts avec gants - </string> - <string name="Glove Length"> - Longueur des gants - </string> - <string name="Hair"> - Cheveux - </string> - <string name="Hair Back"> - Cheveux : Derrière - </string> - <string name="Hair Front"> - Cheveux : Devant - </string> - <string name="Hair Sides"> - Cheveux : Côtés - </string> - <string name="Hair Sweep"> - Sens de la coiffure - </string> - <string name="Hair Thickess"> - Épaisseur des cheveux - </string> - <string name="Hair Thickness"> - Épaisseur des cheveux - </string> - <string name="Hair Tilt"> - Inclinaison des cheveux - </string> - <string name="Hair Tilted Left"> - Vers la gauche - </string> - <string name="Hair Tilted Right"> - Vers la droite - </string> - <string name="Hair Volume"> - Cheveux : Volume - </string> - <string name="Hand Size"> - Taille de la main - </string> - <string name="Handlebars"> - Guidons - </string> - <string name="Head Length"> - Longueur de la tête - </string> - <string name="Head Shape"> - Forme de la tête - </string> - <string name="Head Size"> - Taille de la tête - </string> - <string name="Head Stretch"> - Allongement de la tête - </string> - <string name="Heel Height"> - Hauteur des talons - </string> - <string name="Heel Shape"> - Forme des talons - </string> - <string name="Height"> - Taille - </string> - <string name="High"> - Haut - </string> - <string name="High Heels"> - Talons hauts - </string> - <string name="High Jaw"> - Mâchoire haute - </string> - <string name="High Platforms"> - Plateformes hautes - </string> - <string name="High and Tight"> - Haut et serré - </string> - <string name="Higher"> - Plus élevé - </string> - <string name="Hip Length"> - Longueur hanche - </string> - <string name="Hip Width"> - Largeur hanche - </string> - <string name="In"> - In - </string> - <string name="In Shdw Color"> - Couleur ombre interne - </string> - <string name="In Shdw Opacity"> - Opacité ombre interne - </string> - <string name="Inner Eye Corner"> - Coin de l'Å“il interne - </string> - <string name="Inner Eye Shadow"> - Ombre de l'Å“il interne - </string> - <string name="Inner Shadow"> - Ombre interne - </string> - <string name="Jacket Length"> - Longueur de la veste - </string> - <string name="Jacket Wrinkles"> - Plis de la veste - </string> - <string name="Jaw Angle"> - Angle de la mâchoire - </string> - <string name="Jaw Jut"> - saillie de la mâchoire - </string> - <string name="Jaw Shape"> - Forme de la mâchoire - </string> - <string name="Join"> - Rapprochés - </string> - <string name="Jowls"> - Bajoues - </string> - <string name="Knee Angle"> - Angle du genou - </string> - <string name="Knock Kneed"> - Genoux rapprochés - </string> - <string name="Large"> - Grande - </string> - <string name="Large Hands"> - Grandes mains - </string> - <string name="Left Part"> - Raie à gauche - </string> - <string name="Leg Length"> - Longueur de la jambe - </string> - <string name="Leg Muscles"> - Muscles de la jambe - </string> - <string name="Less"> - Moins - </string> - <string name="Less Body Fat"> - Moins de graisse - </string> - <string name="Less Curtains"> - Moins - </string> - <string name="Less Freckles"> - Moins - </string> - <string name="Less Full"> - Moins - </string> - <string name="Less Gravity"> - Moins - </string> - <string name="Less Love"> - Moins - </string> - <string name="Less Muscles"> - Moins - </string> - <string name="Less Muscular"> - Moins - </string> - <string name="Less Rosy"> - Moins - </string> - <string name="Less Round"> - Moins - </string> - <string name="Less Saddle"> - Moins - </string> - <string name="Less Square"> - Moins - </string> - <string name="Less Volume"> - Moins - </string> - <string name="Less soul"> - Moins - </string> - <string name="Lighter"> - Plus léger - </string> - <string name="Lip Cleft"> - Fente labiale - </string> - <string name="Lip Cleft Depth"> - Profondeur de la fente labiale - </string> - <string name="Lip Fullness"> - Volume des lèvres - </string> - <string name="Lip Pinkness"> - Rougeur des lèvres - </string> - <string name="Lip Ratio"> - Proportion des lèvres - </string> - <string name="Lip Thickness"> - Épaisseur des lèvres - </string> - <string name="Lip Width"> - Largeur des lèvres - </string> - <string name="Lipgloss"> - Brillant à lèvres - </string> - <string name="Lipstick"> - Rouge à lèvres - </string> - <string name="Lipstick Color"> - Couleur du rouge à lèvres - </string> - <string name="Long"> - Long - </string> - <string name="Long Head"> - Tête longue - </string> - <string name="Long Hips"> - Hanches longues - </string> - <string name="Long Legs"> - Jambes longues - </string> - <string name="Long Neck"> - Long cou - </string> - <string name="Long Pigtails"> - Longues couettes - </string> - <string name="Long Ponytail"> - Longue queue de cheval - </string> - <string name="Long Torso"> - Torse long - </string> - <string name="Long arms"> - Longs bras - </string> - <string name="Longcuffs"> - Manches longues - </string> - <string name="Loose Pants"> - Pantalons amples - </string> - <string name="Loose Shirt"> - Chemise ample - </string> - <string name="Loose Sleeves"> - Manches amples - </string> - <string name="Love Handles"> - Poignées d'amour - </string> - <string name="Low"> - Bas - </string> - <string name="Low Heels"> - Talons bas - </string> - <string name="Low Jaw"> - Mâchoire basse - </string> - <string name="Low Platforms"> - Plateformes basses - </string> - <string name="Low and Loose"> - Bas et ample - </string> - <string name="Lower"> - Abaisser - </string> - <string name="Lower Bridge"> - Arête plus basse - </string> - <string name="Lower Cheeks"> - Joues plus basses - </string> - <string name="Male"> - Homme - </string> - <string name="Middle Part"> - Raie au milieu - </string> - <string name="More"> - Plus - </string> - <string name="More Blush"> - Plus - </string> - <string name="More Body Fat"> - Plus - </string> - <string name="More Curtains"> - Plus - </string> - <string name="More Eyeshadow"> - Plus - </string> - <string name="More Freckles"> - Plus - </string> - <string name="More Full"> - Plus - </string> - <string name="More Gravity"> - Plus - </string> - <string name="More Lipstick"> - Plus - </string> - <string name="More Love"> - Plus - </string> - <string name="More Lower Lip"> - Plus - </string> - <string name="More Muscles"> - Plus - </string> - <string name="More Muscular"> - Plus - </string> - <string name="More Rosy"> - Plus - </string> - <string name="More Round"> - Plus - </string> - <string name="More Saddle"> - Plus - </string> - <string name="More Sloped"> - Plus - </string> - <string name="More Square"> - Plus - </string> - <string name="More Upper Lip"> - Plus - </string> - <string name="More Vertical"> - Plus - </string> - <string name="More Volume"> - Plus - </string> - <string name="More soul"> - Plus - </string> - <string name="Moustache"> - Moustache - </string> - <string name="Mouth Corner"> - Coin de la bouche - </string> - <string name="Mouth Position"> - Position de la bouche - </string> - <string name="Mowhawk"> - Mowhawk - </string> - <string name="Muscular"> - Musclé - </string> - <string name="Mutton Chops"> - Rouflaquettes - </string> - <string name="Nail Polish"> - Vernis à ongles - </string> - <string name="Nail Polish Color"> - Couleur du vernis - </string> - <string name="Narrow"> - Étroit - </string> - <string name="Narrow Back"> - Arrière étroit - </string> - <string name="Narrow Front"> - Devant étroit - </string> - <string name="Narrow Lips"> - Lèvres étroites - </string> - <string name="Natural"> - Naturel - </string> - <string name="Neck Length"> - Longueur du cou - </string> - <string name="Neck Thickness"> - Épaisseur du cou - </string> - <string name="No Blush"> - Pas de blush - </string> - <string name="No Eyeliner"> - Pas de eyeliner - </string> - <string name="No Eyeshadow"> - Pas d'ombre à paupières - </string> - <string name="No Heels"> - Pas de talons - </string> - <string name="No Lipgloss"> - Pas de brillant à lèvres - </string> - <string name="No Lipstick"> - Pas de rouge à lèvres - </string> - <string name="No Part"> - Pas de raie - </string> - <string name="No Polish"> - Pas de vernis - </string> - <string name="No Red"> - Pas de rouge - </string> - <string name="No Spikes"> - Pas de spikes - </string> - <string name="No White"> - Pas de blanc - </string> - <string name="No Wrinkles"> - Pas de rides - </string> - <string name="Normal Lower"> - Normal plus bas - </string> - <string name="Normal Upper"> - Normal plus haut - </string> - <string name="Nose Left"> - Nez à gauche - </string> - <string name="Nose Right"> - Nez à droite - </string> - <string name="Nose Size"> - Taille du nez - </string> - <string name="Nose Thickness"> - Épaisseur du nez - </string> - <string name="Nose Tip Angle"> - Angle du bout du nez - </string> - <string name="Nose Tip Shape"> - Forme du bout du nez - </string> - <string name="Nose Width"> - Largeur du nez - </string> - <string name="Nostril Division"> - Division des narines - </string> - <string name="Nostril Width"> - Largeur des narines - </string> - <string name="Old"> - Vieux - </string> - <string name="Opaque"> - Opaque - </string> - <string name="Open"> - Ouvert - </string> - <string name="Open Back"> - Derrière ouvert - </string> - <string name="Open Front"> - Devant ouvert - </string> - <string name="Open Left"> - Ouvert à gauche - </string> - <string name="Open Right"> - Ouvert à droite - </string> - <string name="Orange"> - Orange - </string> - <string name="Out"> - Dehors - </string> - <string name="Out Shdw Color"> - Couleur de l'ombre externe - </string> - <string name="Out Shdw Opacity"> - Opacité de l'ombre externe - </string> - <string name="Outer Eye Corner"> - Coin de l'Å“il externe - </string> - <string name="Outer Eye Shadow"> - Ombre de l'Å“il externe - </string> - <string name="Outer Shadow"> - Ombre externe - </string> - <string name="Overbite"> - Chevauchement - </string> - <string name="Package"> - Parties - </string> - <string name="Painted Nails"> - Ongles vernis - </string> - <string name="Pale"> - Pâle - </string> - <string name="Pants Crotch"> - Entrejambe - </string> - <string name="Pants Fit"> - Taille - </string> - <string name="Pants Length"> - Longueur - </string> - <string name="Pants Waist"> - Taille - </string> - <string name="Pants Wrinkles"> - Plis - </string> - <string name="Part"> - Raie - </string> - <string name="Part Bangs"> - Séparation de la frange - </string> - <string name="Pectorals"> - Pectoraux - </string> - <string name="Pigment"> - Pigmentation - </string> - <string name="Pigtails"> - Couettes - </string> - <string name="Pink"> - Rose - </string> - <string name="Pinker"> - Plus rose - </string> - <string name="Platform Height"> - Hauteur de la plateforme - </string> - <string name="Platform Width"> - Largeur de la plateforme - </string> - <string name="Pointy"> - Pointu - </string> - <string name="Pointy Heels"> - Talons pointus - </string> - <string name="Pointy Toe"> - Orteil pointu - </string> - <string name="Ponytail"> - Queue de cheval - </string> - <string name="Poofy Skirt"> - Jupe bouffante - </string> - <string name="Pop Left Eye"> - Å’il gauche saillant - </string> - <string name="Pop Right Eye"> - Å’il droit saillant - </string> - <string name="Puffy"> - Gonflé - </string> - <string name="Puffy Eyelids"> - Paupières gonflées - </string> - <string name="Rainbow Color"> - Couleur de l'arc en ciel - </string> - <string name="Red Hair"> - Cheveux roux - </string> - <string name="Red Skin"> - Peau rouge - </string> - <string name="Regular"> - Standard - </string> - <string name="Regular Muscles"> - Muscles normaux - </string> - <string name="Right Part"> - Raie à droite - </string> - <string name="Rosy Complexion"> - Teint rosé - </string> - <string name="Round"> - Rond - </string> - <string name="Round Forehead"> - Front rond - </string> - <string name="Ruddiness"> - Rougeur - </string> - <string name="Ruddy"> - Rouge - </string> - <string name="Rumpled Hair"> - Texture - </string> - <string name="Saddle Bags"> - Culotte de cheval - </string> - <string name="Saddlebags"> - Culotte de cheval - </string> - <string name="Scrawny"> - Maigre - </string> - <string name="Scrawny Leg"> - Jambes maigres - </string> - <string name="Separate"> - Séparés - </string> - <string name="Shading"> - Dégradé - </string> - <string name="Shadow hair"> - Cheveux - </string> - <string name="Shallow"> - Creux - </string> - <string name="Shear Back"> - Coupe derrière - </string> - <string name="Shear Face"> - Visage - </string> - <string name="Shear Front"> - Devant dégagé - </string> - <string name="Shear Left"> - Gauche dégagée - </string> - <string name="Shear Left Up"> - Haut gauche dégagé - </string> - <string name="Shear Right"> - Droite dégagée - </string> - <string name="Shear Right Up"> - Haut droit dégagé - </string> - <string name="Sheared Back"> - Dégagé derrière - </string> - <string name="Sheared Front"> - Dégagé devant - </string> - <string name="Shift Left"> - Déplacer vers la gauche - </string> - <string name="Shift Mouth"> - Déplacer la bouche - </string> - <string name="Shift Right"> - Déplacer vers la droite - </string> - <string name="Shirt Bottom"> - Chemise - </string> - <string name="Shirt Fit"> - Taille - </string> - <string name="Shirt Wrinkles"> - Plis - </string> - <string name="Shoe Height"> - Hauteur de la chaussure - </string> - <string name="Short"> - Court - </string> - <string name="Short Arms"> - Bras courts - </string> - <string name="Short Legs"> - Jambes courtes - </string> - <string name="Short Neck"> - Petit cou - </string> - <string name="Short Pigtails"> - Couettes courtes - </string> - <string name="Short Ponytail"> - Queue de cheval courte - </string> - <string name="Short Sideburns"> - Favoris courts - </string> - <string name="Short Torso"> - Torse court - </string> - <string name="Short hips"> - Hanches courtes - </string> - <string name="Shoulders"> - Épaules - </string> - <string name="Side Bangs"> - Mèches sur le côté - </string> - <string name="Side Bangs Down"> - Mèches sur le côté en bas - </string> - <string name="Side Bangs Up"> - Mèches sur le côté en haut - </string> - <string name="Side Fringe"> - Frange sur le côté - </string> - <string name="Sideburns"> - Favoris - </string> - <string name="Sides Hair"> - Cheveux sur le côté - </string> - <string name="Sides Hair Down"> - Cheveux sur le côté en bas - </string> - <string name="Sides Hair Up"> - Cheveux sur le côté en haut - </string> - <string name="Skinny"> - Maigre - </string> - <string name="Skinny Neck"> - Cou maigre - </string> - <string name="Skirt Fit"> - Taille de la jupe - </string> - <string name="Skirt Length"> - Longueur de la jupe - </string> - <string name="Slanted Forehead"> - Front incliné - </string> - <string name="Sleeve Length"> - Longueur de la manche - </string> - <string name="Sleeve Looseness"> - Ampleur de la manche - </string> - <string name="Slit Back"> - Fente : Derrière - </string> - <string name="Slit Front"> - Fente : Devant - </string> - <string name="Slit Left"> - Fente : Gauche - </string> - <string name="Slit Right"> - Fente : Droite - </string> - <string name="Small"> - Petite - </string> - <string name="Small Hands"> - Petites mains - </string> - <string name="Small Head"> - Petite tête - </string> - <string name="Smooth"> - Lisse - </string> - <string name="Smooth Hair"> - Cheveux lisses - </string> - <string name="Socks Length"> - Longueur des chaussettes - </string> - <string name="Some"> - Quelques un(e)s - </string> - <string name="Soulpatch"> - Soulpatch - </string> - <string name="Sparse"> - Rares - </string> - <string name="Spiked Hair"> - Mèches en pointe - </string> - <string name="Square"> - Carré - </string> - <string name="Square Toe"> - Orteil carré - </string> - <string name="Squash Head"> - Écraser la tête - </string> - <string name="Squash/Stretch Head"> - Allonger/écraser la tête - </string> - <string name="Stretch Head"> - Allonger la tête - </string> - <string name="Sunken"> - Enfoncées - </string> - <string name="Sunken Chest"> - Poitrine enfoncée - </string> - <string name="Sunken Eyes"> - Yeux enfoncés - </string> - <string name="Sweep Back"> - En arrière - </string> - <string name="Sweep Forward"> - Vers l'avant - </string> - <string name="Swept Back"> - En arrière - </string> - <string name="Swept Back Hair"> - Cheveux en arrière - </string> - <string name="Swept Forward"> - Vers l'avant - </string> - <string name="Swept Forward Hair"> - Cheveux vers l''avant - </string> - <string name="Tall"> - Grand - </string> - <string name="Taper Back"> - Biseauter à l'arrière - </string> - <string name="Taper Front"> - Biseauter à l'avant - </string> - <string name="Thick Heels"> - Talons épais - </string> - <string name="Thick Neck"> - Cou épais - </string> - <string name="Thick Toe"> - Orteil épais - </string> - <string name="Thickness"> - Épaisseur - </string> - <string name="Thin"> - Fins - </string> - <string name="Thin Eyebrows"> - Sourcils fins - </string> - <string name="Thin Lips"> - Lèvres fines - </string> - <string name="Thin Nose"> - Nez fin - </string> - <string name="Tight Chin"> - Menton fin - </string> - <string name="Tight Cuffs"> - Jambes serrées - </string> - <string name="Tight Pants"> - Pantalons serrés - </string> - <string name="Tight Shirt"> - Chemise serrée - </string> - <string name="Tight Skirt"> - Jupe serrée - </string> - <string name="Tight Sleeves"> - Manches serrées - </string> - <string name="Tilt Left"> - Pencher sur la gauche - </string> - <string name="Tilt Right"> - Pencher sur la droite - </string> - <string name="Toe Shape"> - Forme de l'orteil - </string> - <string name="Toe Thickness"> - Épaisseur de l'orteil - </string> - <string name="Torso Length"> - Longueur du torse - </string> - <string name="Torso Muscles"> - Muscles du torse - </string> - <string name="Torso Scrawny"> - Torse maigre - </string> - <string name="Unattached"> - Séparés - </string> - <string name="Uncreased"> - Lisse - </string> - <string name="Underbite"> - Rentré - </string> - <string name="Unnatural"> - Artificiel - </string> - <string name="Upper Bridge"> - Arête supérieure - </string> - <string name="Upper Cheeks"> - Pommettes - </string> - <string name="Upper Chin Cleft"> - Fente du menton supérieure - </string> - <string name="Upper Eyelid Fold"> - Paupière supérieure - </string> - <string name="Upturned"> - En trompette - </string> - <string name="Very Red"> - Très rouge - </string> - <string name="Waist Height"> - Hauteur de la taille - </string> - <string name="Well-Fed"> - Bien nourri - </string> - <string name="White Hair"> - Cheveux blancs - </string> - <string name="Wide"> - Large - </string> - <string name="Wide Back"> - Dos large - </string> - <string name="Wide Front"> - Devant large - </string> - <string name="Wide Lips"> - Lèvres larges - </string> - <string name="Wild"> - Revêche - </string> - <string name="Wrinkles"> - Rides - </string> - <string name="LocationCtrlAddLandmarkTooltip"> - Ajouter à mes repères - </string> - <string name="LocationCtrlEditLandmarkTooltip"> - Modifier mes repères - </string> - <string name="UpdaterWindowTitle"> - [APP_NAME] Mettre à jour - </string> - <string name="UpdaterNowUpdating"> - En train de charger [APP_NAME]... - </string> - <string name="UpdaterNowInstalling"> - En train d'installer [APP_NAME]... - </string> - <string name="UpdaterUpdatingDescriptive"> - Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience. - </string> - <string name="UpdaterProgressBarTextWithEllipses"> - Mise à jour en cours... - </string> - <string name="UpdaterProgressBarText"> - Mise à jour en cours - </string> - <string name="UpdaterFailDownloadTitle"> - Le téléchargement de la mise à jour a échoué - </string> - <string name="UpdaterFailUpdateDescriptive"> - Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com. - </string> - <string name="UpdaterFailInstallTitle"> - L'installation de la mise à jour a échoué - </string> - <string name="UpdaterFailStartTitle"> - Impossible de lancer le client - </string> - <string name="only_user_message"> - Vous êtes le seul participant à cette session. - </string> - <string name="offline_message"> - [FIRST] [LAST] est déconnecté(e). - </string> - <string name="invite_message"> - Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. - </string> - <string name="generic_request_error"> - Erreur lors de la requête, veuillez réessayer ultérieurement. - </string> - <string name="insufficient_perms_error"> - Vous n'avez pas les droits requis. - </string> - <string name="session_does_not_exist_error"> - La session a expiré - </string> - <string name="no_ability_error"> - Vous n'avez pas ce pouvoir. - </string> - <string name="no_ability"> - Vous n'avez pas ce pouvoir. - </string> - <string name="not_a_mod_error"> - Vous n'êtes pas modérateur de session. - </string> - <string name="muted_error"> - 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]. - </string> - <string name="message_session_event"> - Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. - </string> - <string name="removed_from_group"> - Vous avez été supprimé du groupe. - </string> - <string name="close_on_no_ability"> - Vous ne pouvez plus participer à la session de chat. - </string> -</strings> +<?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 + 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=fr-FR</string> + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Second Life + </string> + <string name="SECOND_LIFE_GRID"> + Grille de Second Life + </string> + <string name="SUPPORT_SITE"> + Portail Assistance Second Life + </string> + <string name="StartupDetectingHardware"> + Détection du matériel... + </string> + <string name="StartupLoading"> + Chargement + </string> + <string name="Fullbright"> + Fullbright (Legacy) + </string> + <string name="LoginInProgress"> + La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. + </string> + <string name="LoginInProgressNoFrozen"> + Connexion... + </string> + <string name="LoginAuthenticating"> + Authentification en cours + </string> + <string name="LoginMaintenance"> + Maintenance du compte en cours… + </string> + <string name="LoginAttempt"> + La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER] + </string> + <string name="LoginPrecaching"> + Monde en cours de chargement… + </string> + <string name="LoginInitializingBrowser"> + Navigateur Web incorporé en cours d'initialisation… + </string> + <string name="LoginInitializingMultimedia"> + Multimédia en cours d'initialisation… + </string> + <string name="LoginVerifyingCache"> + Fichiers du cache en cours de vérification (peut prendre 60-90 s)... + </string> + <string name="LoginProcessingResponse"> + Réponse en cours de traitement… + </string> + <string name="LoginInitializingWorld"> + Monde en cours d'initialisation… + </string> + <string name="LoginDecodingImages"> + Décodage des images en cours... + </string> + <string name="LoginInitializingQuicktime"> + Quicktime en cours d'initialisation + </string> + <string name="LoginQuicktimeNotFound"> + Quicktime introuvable, impossible de procéder à l'initialisation. + </string> + <string name="LoginQuicktimeOK"> + Initialisation de Quicktime réussie. + </string> + <string name="LoginWaitingForRegionHandshake"> + Liaison avec la région en cours de création... + </string> + <string name="LoginConnectingToRegion"> + Connexion avec la région en cours... + </string> + <string name="LoginDownloadingClothing"> + Habits en cours de téléchargement... + </string> + <string name="AgentLostConnection"> + Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet. + </string> + <string name="TooltipPerson"> + Personne + </string> + <string name="TooltipNoName"> + (pas de nom) + </string> + <string name="TooltipOwner"> + Propriétaire : + </string> + <string name="TooltipPublic"> + Public + </string> + <string name="TooltipIsGroup"> + (Groupe) + </string> + <string name="TooltipForSaleL$"> + À vendre : [AMOUNT] L$ + </string> + <string name="TooltipFlagGroupBuild"> + Contruction de groupe + </string> + <string name="TooltipFlagNoBuild"> + Pas de construction + </string> + <string name="TooltipFlagNoEdit"> + Contruction de groupe + </string> + <string name="TooltipFlagNotSafe"> + Non sécurisé + </string> + <string name="TooltipFlagNoFly"> + Interdiction de voler + </string> + <string name="TooltipFlagGroupScripts"> + Scripts de groupe + </string> + <string name="TooltipFlagNoScripts"> + Pas de scripts + </string> + <string name="TooltipLand"> + Terrain : + </string> + <string name="TooltipMustSingleDrop"> + Impossible de faire glisser plus d'un objet ici + </string> + <string name="TooltipHttpUrl"> + Cliquez pour afficher cette page web + </string> + <string name="TooltipSLURL"> + Cliquez pour en savoir plus sur cet endroit + </string> + <string name="TooltipAgentUrl"> + Cliquez pour afficher le profil de ce résident + </string> + <string name="TooltipGroupUrl"> + Cliquez pour afficher la description de ce groupe + </string> + <string name="TooltipEventUrl"> + Cliquez pour afficher la description de cet événement + </string> + <string name="TooltipClassifiedUrl"> + Cliquez pour afficher cette petite annonce + </string> + <string name="TooltipParcelUrl"> + Cliquez pour afficher la description de cette parcelle + </string> + <string name="TooltipTeleportUrl"> + Cliquez pour vous téléporter à cet endroit + </string> + <string name="TooltipObjectIMUrl"> + Cliquez pour afficher la description de cet objet + </string> + <string name="TooltipSLAPP"> + Cliquez pour exécuter la commande secondlife:// command + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Fermer (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Fermer (Ctrl+W) + </string> + <string name="BUTTON_RESTORE"> + Restaurer + </string> + <string name="BUTTON_MINIMIZE"> + Minimiser + </string> + <string name="BUTTON_TEAR_OFF"> + Réduire + </string> + <string name="BUTTON_DOCK"> + Attacher + </string> + <string name="BUTTON_UNDOCK"> + Détacher + </string> + <string name="BUTTON_HELP"> + Afficher l'aide + </string> + <string name="RetrievingData"> + En cours d'extraction... + </string> + <string name="ReleaseNotes"> + Notes de version + </string> + <string name="LoadingData"> + Chargement.. + </string> + <string name="AvatarNameNobody"> + (personne) + </string> + <string name="AvatarNameWaiting"> + (en attente) + </string> + <string name="AvatarNameHippos"> + (hippos) + </string> + <string name="GroupNameNone"> + (aucun) + </string> + <string name="AssetErrorNone"> + Aucune erreur + </string> + <string name="AssetErrorRequestFailed"> + Requête de l'actif : échec + </string> + <string name="AssetErrorNonexistentFile"> + Requête de l'actif : fichier inexistant + </string> + <string name="AssetErrorNotInDatabase"> + Requête de l'actif : actif introuvable dans la base de données + </string> + <string name="AssetErrorEOF"> + Fin du ficher + </string> + <string name="AssetErrorCannotOpenFile"> + Impossible d'ouvrir le fichier + </string> + <string name="AssetErrorFileNotFound"> + Fichier introuvable + </string> + <string name="AssetErrorTCPTimeout"> + Délai d'attente du transfert du fichier dépassé + </string> + <string name="AssetErrorCircuitGone"> + Disparition du circuit + </string> + <string name="AssetErrorPriceMismatch"> + Il y a une différence de prix entre le client et le serveur + </string> + <string name="AssetErrorUnknownStatus"> + Statut inconnu + </string> + <string name="texture"> + texture + </string> + <string name="sound"> + son + </string> + <string name="calling card"> + carte de visite + </string> + <string name="landmark"> + repère + </string> + <string name="legacy script"> + script (ancienne version) + </string> + <string name="clothing"> + habits + </string> + <string name="object"> + objet + </string> + <string name="note card"> + note + </string> + <string name="folder"> + dossier + </string> + <string name="root"> + racine + </string> + <string name="lsl2 script"> + script lsl2 + </string> + <string name="lsl bytecode"> + bytecode lsl + </string> + <string name="tga texture"> + texture tga + </string> + <string name="body part"> + partie du corps + </string> + <string name="snapshot"> + photo + </string> + <string name="lost and found"> + objets trouvés + </string> + <string name="targa image"> + image targa + </string> + <string name="trash"> + poubelle + </string> + <string name="jpeg image"> + image jpeg + </string> + <string name="animation"> + animation + </string> + <string name="gesture"> + geste + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + favori + </string> + <string name="symbolic link"> + lien + </string> + <string name="AvatarAway"> + Absent + </string> + <string name="AvatarBusy"> + Occupé + </string> + <string name="AvatarMuted"> + Ignoré + </string> + <string name="anim_express_afraid"> + Effrayé + </string> + <string name="anim_express_anger"> + En colère + </string> + <string name="anim_away"> + Absent + </string> + <string name="anim_backflip"> + Salto arrière + </string> + <string name="anim_express_laugh"> + Rire en se tenant le ventre + </string> + <string name="anim_express_toothsmile"> + Grand sourire + </string> + <string name="anim_blowkiss"> + Envoyer un baiser + </string> + <string name="anim_express_bored"> + Bailler d'ennui + </string> + <string name="anim_bow"> + S'incliner + </string> + <string name="anim_clap"> + Applaudir + </string> + <string name="anim_courtbow"> + Révérence de cour + </string> + <string name="anim_express_cry"> + Pleurer + </string> + <string name="anim_dance1"> + Danse 1 + </string> + <string name="anim_dance2"> + Danse 2 + </string> + <string name="anim_dance3"> + Danse 3 + </string> + <string name="anim_dance4"> + Danse 4 + </string> + <string name="anim_dance5"> + Danse 5 + </string> + <string name="anim_dance6"> + Danse 6 + </string> + <string name="anim_dance7"> + Danse 7 + </string> + <string name="anim_dance8"> + Danse 8 + </string> + <string name="anim_express_disdain"> + Mépris + </string> + <string name="anim_drink"> + Boire + </string> + <string name="anim_express_embarrased"> + Gêne + </string> + <string name="anim_angry_fingerwag"> + Désapprobation + </string> + <string name="anim_fist_pump"> + Victoire + </string> + <string name="anim_yoga_float"> + Yoga + </string> + <string name="anim_express_frown"> + Froncer les sourcils + </string> + <string name="anim_impatient"> + Impatient + </string> + <string name="anim_jumpforjoy"> + Sauter de joie + </string> + <string name="anim_kissmybutt"> + Va te faire voir ! + </string> + <string name="anim_express_kiss"> + Baiser + </string> + <string name="anim_laugh_short"> + Rire + </string> + <string name="anim_musclebeach"> + Montrer ses muscles + </string> + <string name="anim_no_unhappy"> + Non (mécontent) + </string> + <string name="anim_no_head"> + Non + </string> + <string name="anim_nyanya"> + Na na na na nère + </string> + <string name="anim_punch_onetwo"> + Gauche-droite + </string> + <string name="anim_express_open_mouth"> + Bouche ouverte + </string> + <string name="anim_peace"> + Paix + </string> + <string name="anim_point_you"> + Montrer quelqu'un du doigt + </string> + <string name="anim_point_me"> + Se montrer du doigt + </string> + <string name="anim_punch_l"> + Gauche + </string> + <string name="anim_punch_r"> + Droite + </string> + <string name="anim_rps_countdown"> + Compter (pierre-papier-ciseaux) + </string> + <string name="anim_rps_paper"> + Papier (pierre-papier-ciseaux) + </string> + <string name="anim_rps_rock"> + Pierre (pierre-papier-ciseaux) + </string> + <string name="anim_rps_scissors"> + Ciseaux (pierre-papier-ciseaux) + </string> + <string name="anim_express_repulsed"> + Dégoût + </string> + <string name="anim_kick_roundhouse_r"> + Coup de pied circulaire + </string> + <string name="anim_express_sad"> + Triste + </string> + <string name="anim_salute"> + Salut + </string> + <string name="anim_shout"> + Crier + </string> + <string name="anim_express_shrug"> + Hausser les épaules + </string> + <string name="anim_express_smile"> + Sourire + </string> + <string name="anim_smoke_idle"> + Fumer, immobile + </string> + <string name="anim_smoke_inhale"> + Fumer, prendre une bouffée + </string> + <string name="anim_smoke_throw_down"> + Fumer, jeter son mégot + </string> + <string name="anim_express_surprise"> + Surprise + </string> + <string name="anim_sword_strike_r"> + Coup d'épée + </string> + <string name="anim_angry_tantrum"> + Caprice + </string> + <string name="anim_express_tongue_out"> + Tirer la langue + </string> + <string name="anim_hello"> + Faire signe + </string> + <string name="anim_whisper"> + Chuchoter + </string> + <string name="anim_whistle"> + Siffler + </string> + <string name="anim_express_wink"> + Clin d'Å“il + </string> + <string name="anim_wink_hollywood"> + Clin d'Å“il (Hollywood) + </string> + <string name="anim_express_worry"> + Soucis + </string> + <string name="anim_yes_happy"> + Oui (Joie) + </string> + <string name="anim_yes_head"> + Oui + </string> + <string name="texture_loading"> + Chargement... + </string> + <string name="worldmap_offline"> + Hors ligne + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Fichier incomplet + </string> + <string name="ST_NO_JOINT"> + Impossible de trouver ROOT ou JOINT. + </string> + <string name="whisper"> + chuchote : + </string> + <string name="shout"> + crie : + </string> + <string name="ringing"> + Connexion au chat vocal du Monde en cours… + </string> + <string name="connected"> + Connecté(e) + </string> + <string name="unavailable"> + Voix non disponible à l'endroit où vous êtes + </string> + <string name="hang_up"> + Déconnecté du chat vocal + </string> + <string name="ScriptQuestionCautionChatGranted"> + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS]. + </string> + <string name="ScriptTakeMoney"> + Débiter vos Linden dollars (L$) + </string> + <string name="ActOnControlInputs"> + Utiliser vos touches de commandes + </string> + <string name="RemapControlInputs"> + Reconfigurer vos touches de commandes + </string> + <string name="AnimateYourAvatar"> + Animer votre avatar + </string> + <string name="AttachToYourAvatar"> + Attacher à votre avatar + </string> + <string name="ReleaseOwnership"> + Passer l'objet dans le domaine public (sans propriétaire) + </string> + <string name="LinkAndDelink"> + Lier et délier d'autres objets + </string> + <string name="AddAndRemoveJoints"> + Créer et supprimer des liens avec d'autres objets + </string> + <string name="ChangePermissions"> + Modifier ses droits + </string> + <string name="TrackYourCamera"> + Suivre votre caméra + </string> + <string name="ControlYourCamera"> + Contrôler votre caméra + </string> + <string name="SIM_ACCESS_PG"> + PG + </string> + <string name="SIM_ACCESS_MATURE"> + Mature + </string> + <string name="SIM_ACCESS_ADULT"> + Adult + </string> + <string name="SIM_ACCESS_DOWN"> + Hors ligne + </string> + <string name="SIM_ACCESS_MIN"> + Inconnu + </string> + <string name="land_type_unknown"> + (inconnu) + </string> + <string name="all_files"> + Tous fichiers + </string> + <string name="sound_files"> + Sons + </string> + <string name="animation_files"> + Animations + </string> + <string name="image_files"> + Images + </string> + <string name="save_file_verb"> + Enregistrer + </string> + <string name="load_file_verb"> + Charger + </string> + <string name="targa_image_files"> + Images Targa + </string> + <string name="bitmap_image_files"> + Images Bitmap + </string> + <string name="avi_movie_file"> + Fichier de film AVI + </string> + <string name="xaf_animation_file"> + Fichier d'animation XAF + </string> + <string name="xml_file"> + Fichier XML + </string> + <string name="dot_raw_file"> + Fichier RAW + </string> + <string name="compressed_image_files"> + Images compressées + </string> + <string name="load_files"> + Charger des fichiers + </string> + <string name="choose_the_directory"> + Choisir le répertoire + </string> + <string name="AvatarSetNotAway"> + Ne plus me mettre en mode absent + </string> + <string name="AvatarSetAway"> + Me mettre en mode absent + </string> + <string name="AvatarSetNotBusy"> + Ne plus me mettre en mode occupé + </string> + <string name="AvatarSetBusy"> + Me mettre en mode occupé + </string> + <string name="shape"> + Silhouette + </string> + <string name="skin"> + Peau + </string> + <string name="hair"> + Cheveux + </string> + <string name="eyes"> + Yeux + </string> + <string name="shirt"> + Chemise + </string> + <string name="pants"> + Pantalon + </string> + <string name="shoes"> + Chaussures + </string> + <string name="socks"> + Chaussettes + </string> + <string name="jacket"> + Veste + </string> + <string name="gloves"> + Gants + </string> + <string name="undershirt"> + Sous-vêtements (homme) + </string> + <string name="underpants"> + Sous-vêtements (femme) + </string> + <string name="skirt"> + Jupe + </string> + <string name="invalid"> + non valide + </string> + <string name="BodyPartsRightArm"> + Bras droit + </string> + <string name="BodyPartsHead"> + Tête + </string> + <string name="BodyPartsLeftArm"> + Bras gauche + </string> + <string name="BodyPartsLeftLeg"> + Jambe gauche + </string> + <string name="BodyPartsTorso"> + Torse + </string> + <string name="BodyPartsRightLeg"> + Jambe droite + </string> + <string name="GraphicsQualityLow"> + Faible + </string> + <string name="GraphicsQualityMid"> + Moyen + </string> + <string name="GraphicsQualityHigh"> + Élevé + </string> + <string name="LeaveMouselook"> + Appuyez sur ESC pour quitter la vue subjective + </string> + <string name="InventoryNoMatchingItems"> + Aucun objet correspondant ne se trouve dans l'inventaire. + </string> + <string name="InventoryNoTexture"> + Vous n'avez pas de copie de cette texture dans votre inventaire + </string> + <string name="LoadingContents"> + chargement des contenus en cours... + </string> + <string name="NoContents"> + Aucun contenu + </string> + <string name="InvFolder My Inventory"> + Mon inventaire + </string> + <string name="InvFolder My Favorites"> + Mes favoris + </string> + <string name="InvFolder Library"> + Bibliothèque + </string> + <string name="InvFolder Textures"> + Textures + </string> + <string name="InvFolder Sounds"> + Sons + </string> + <string name="InvFolder Calling Cards"> + Cartes de visite + </string> + <string name="InvFolder Landmarks"> + Repères + </string> + <string name="InvFolder Scripts"> + Scripts + </string> + <string name="InvFolder Clothing"> + Habits + </string> + <string name="InvFolder Objects"> + Objets + </string> + <string name="InvFolder Notecards"> + Notes + </string> + <string name="InvFolder New Folder"> + Nouveau dossier + </string> + <string name="InvFolder Inventory"> + Inventaire + </string> + <string name="InvFolder Uncompressed Images"> + Images non compressées + </string> + <string name="InvFolder Body Parts"> + Parties du corps + </string> + <string name="InvFolder Trash"> + Poubelle + </string> + <string name="InvFolder Photo Album"> + Albums photo + </string> + <string name="InvFolder Lost And Found"> + Objets trouvés + </string> + <string name="InvFolder Uncompressed Sounds"> + Sons non compressés + </string> + <string name="InvFolder Animations"> + Animations + </string> + <string name="InvFolder Gestures"> + Gestes + </string> + <string name="InvFolder favorite"> + Favoris + </string> + <string name="InvFolder Current Outfit"> + Tenue actuelle + </string> + <string name="InvFolder My Outfits"> + Mes tenues + </string> + <string name="InvFolder Friends"> + Amis + </string> + <string name="InvFolder All"> + Tout + </string> + <string name="Buy"> + Acheter + </string> + <string name="BuyforL$"> + Acheter des L$ + </string> + <string name="Stone"> + Pierre + </string> + <string name="Metal"> + Métal + </string> + <string name="Glass"> + Verre + </string> + <string name="Wood"> + Bois + </string> + <string name="Flesh"> + Chair + </string> + <string name="Plastic"> + Plastique + </string> + <string name="Rubber"> + Caoutchouc + </string> + <string name="Light"> + Léger + </string> + <string name="KBShift"> + Maj- + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Poitrine + </string> + <string name="Skull"> + Crâne + </string> + <string name="Left Shoulder"> + Épaule gauche + </string> + <string name="Right Shoulder"> + Épaule droite + </string> + <string name="Left Hand"> + Main gauche + </string> + <string name="Right Hand"> + Main droite + </string> + <string name="Left Foot"> + Pied gauche + </string> + <string name="Right Foot"> + Pied droit + </string> + <string name="Spine"> + Colonne + </string> + <string name="Pelvis"> + Bassin + </string> + <string name="Mouth"> + Bouche + </string> + <string name="Chin"> + Menton + </string> + <string name="Left Ear"> + Oreille gauche + </string> + <string name="Right Ear"> + Oreille droite + </string> + <string name="Left Eyeball"> + Globe oculaire gauche + </string> + <string name="Right Eyeball"> + Globe oculaire droit + </string> + <string name="Nose"> + Nez + </string> + <string name="R Upper Arm"> + Bras D + </string> + <string name="R Forearm"> + Avant-bras D + </string> + <string name="L Upper Arm"> + Bras G + </string> + <string name="L Forearm"> + Avant-bras G + </string> + <string name="Right Hip"> + Hanche droite + </string> + <string name="R Upper Leg"> + Cuisse D + </string> + <string name="R Lower Leg"> + Jambe D + </string> + <string name="Left Hip"> + Hanche gauche + </string> + <string name="L Upper Leg"> + Cuisse G + </string> + <string name="L Lower Leg"> + Jambe G + </string> + <string name="Stomach"> + Estomac + </string> + <string name="Left Pec"> + Pectoral gauche + </string> + <string name="Right Pec"> + Pectoral droit + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] + </string> + <string name="YearsOld"> + [AGEYEARS] + </string> + <string name="MonthsOld"> + [AGEMONTHS] + </string> + <string name="WeeksOld"> + [AGEWEEKS] + </string> + <string name="DaysOld"> + [AGEDAYS] + </string> + <string name="TodayOld"> + Inscrit aujourd'hui + </string> + <string name="AgeYearsA"> + [COUNT] an + </string> + <string name="AgeYearsB"> + [COUNT] ans + </string> + <string name="AgeYearsC"> + [COUNT] ans + </string> + <string name="AgeMonthsA"> + [COUNT] mois + </string> + <string name="AgeMonthsB"> + [COUNT] mois + </string> + <string name="AgeMonthsC"> + [COUNT] mois + </string> + <string name="AgeWeeksA"> + [COUNT] semaine + </string> + <string name="AgeWeeksB"> + [COUNT] semaines + </string> + <string name="AgeWeeksC"> + [COUNT] semaines + </string> + <string name="AgeDaysA"> + [COUNT] jour + </string> + <string name="AgeDaysB"> + [COUNT] jours + </string> + <string name="AgeDaysC"> + [COUNT] jours + </string> + <string name="AcctTypeResident"> + Résident + </string> + <string name="AcctTypeTrial"> + Essai + </string> + <string name="AcctTypeCharterMember"> + Membre originaire + </string> + <string name="AcctTypeEmployee"> + Employé(e) de Linden Lab + </string> + <string name="PaymentInfoUsed"> + Infos de paiement utilisées + </string> + <string name="PaymentInfoOnFile"> + Infos de paiement enregistrées + </string> + <string name="NoPaymentInfoOnFile"> + Aucune info de paiement + </string> + <string name="AgeVerified"> + Âge vérifié + </string> + <string name="NotAgeVerified"> + Âge non vérifié + </string> + <string name="Center 2"> + Centrer 2 + </string> + <string name="Top Right"> + En haut à droite + </string> + <string name="Top"> + En haut + </string> + <string name="Top Left"> + En haut à gauche + </string> + <string name="Center"> + Centrer + </string> + <string name="Bottom Left"> + En bas à gauche + </string> + <string name="Bottom"> + Bas + </string> + <string name="Bottom Right"> + En bas à droite + </string> + <string name="CompileQueueDownloadedCompiling"> + Téléchargé, compilation en cours + </string> + <string name="CompileQueueScriptNotFound"> + Script introuvable sur le serveur. + </string> + <string name="CompileQueueProblemDownloading"> + Problème lors du téléchargement + </string> + <string name="CompileQueueInsufficientPermDownload"> + Permissions insuffisantes pour télécharger un script. + </string> + <string name="CompileQueueInsufficientPermFor"> + Permissions insuffisantes pour + </string> + <string name="CompileQueueUnknownFailure"> + Échec du téléchargement, erreur inconnue + </string> + <string name="CompileQueueTitle"> + Recompilation - progrès + </string> + <string name="CompileQueueStart"> + recompiler + </string> + <string name="ResetQueueTitle"> + Réinitialiser les progrès + </string> + <string name="ResetQueueStart"> + réinitialiser + </string> + <string name="RunQueueTitle"> + Lancer + </string> + <string name="RunQueueStart"> + lancer + </string> + <string name="NotRunQueueTitle"> + Arrêter + </string> + <string name="NotRunQueueStart"> + arrêter + </string> + <string name="CompileSuccessful"> + Compilation réussie ! + </string> + <string name="CompileSuccessfulSaving"> + Compilation réussie, enregistrement en cours... + </string> + <string name="SaveComplete"> + Enregistrement terminé. + </string> + <string name="ObjectOutOfRange"> + Script (objet hors de portée) + </string> + <string name="GodToolsObjectOwnedBy"> + Objet [OBJECT] possédé par [OWNER] + </string> + <string name="GroupsNone"> + aucun + </string> + <string name="Unknown"> + (Inconnu) + </string> + <string name="Balance"> + Solde + </string> + <string name="Credits"> + Remerciements + </string> + <string name="Debits"> + Débits + </string> + <string name="Total"> + Total + </string> + <string name="NoGroupDataFound"> + Aucune donnée trouvée pour le groupe + </string> + <string name="IMParentEstate"> + domaine parent + </string> + <string name="IMMainland"> + continent + </string> + <string name="IMTeen"> + teen + </string> + <string name="RegionInfoError"> + erreur + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + tous les domaines possédés par [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + tous les domaines que vous possédez + </string> + <string name="RegionInfoAllEstatesYouManage"> + tous les domaines que vous gérez pour [owner] + </string> + <string name="RegionInfoAllowedResidents"> + Résidents autorisés : ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Groupes autorisés : ([ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="CursorPos"> + Ligne [LINE], Colonne [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] trouvé(s) + </string> + <string name="PanelContentsNewScript"> + Nouveau script + </string> + <string name="MuteByName"> + (par nom) + </string> + <string name="MuteAgent"> + (résident) + </string> + <string name="MuteObject"> + (objet) + </string> + <string name="MuteGroup"> + (groupe) + </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="GroupOwned"> + Propriété du groupe + </string> + <string name="Public"> + Public + </string> + <string name="ClassifiedClicksTxt"> + Clics : [TELEPORT] téléporter, [MAP] carte, [PROFILE] profile + </string> + <string name="ClassifiedUpdateAfterPublish"> + (mise à jour après la publication) + </string> + <string name="GroupVoteYes"> + Oui + </string> + <string name="GroupVoteNo"> + Non + </string> + <string name="GroupVoteNoActiveProposals"> + Il n'y a aucune proposition active actuellement + </string> + <string name="GroupVoteNoArchivedProposals"> + Il n'y a aucune proposition archivée actuellement + </string> + <string name="GroupVoteRetrievingArchivedProposals"> + Extraction des propositions archivées + </string> + <string name="GroupVoteRetrievingActiveProposals"> + Extraction des propositions actives + </string> + <string name="MultiPreviewTitle"> + Prévisualiser + </string> + <string name="MultiPropertiesTitle"> + Propriétés + </string> + <string name="InvOfferAnObjectNamed"> + Un objet appelé + </string> + <string name="InvOfferOwnedByGroup"> + possédé par le groupe + </string> + <string name="InvOfferOwnedByUnknownGroup"> + possédé par un groupe inconnu + </string> + <string name="InvOfferOwnedBy"> + possédé par + </string> + <string name="InvOfferOwnedByUnknownUser"> + possédé par un résident inconnu + </string> + <string name="InvOfferGaveYou"> + vous a donné + </string> + <string name="InvOfferYouDecline"> + Vous avez refusé + </string> + <string name="InvOfferFrom"> + de la part de + </string> + <string name="GroupMoneyTotal"> + Total + </string> + <string name="GroupMoneyBought"> + acheté + </string> + <string name="GroupMoneyPaidYou"> + vous a payé + </string> + <string name="GroupMoneyPaidInto"> + payé + </string> + <string name="GroupMoneyBoughtPassTo"> + a acheté un pass à + </string> + <string name="GroupMoneyPaidFeeForEvent"> + a payé des frais pour un événement + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + a payé un prix pour un événement + </string> + <string name="GroupMoneyBalance"> + Solde + </string> + <string name="GroupMoneyCredits"> + Remerciements + </string> + <string name="GroupMoneyDebits"> + Débits + </string> + <string name="ViewerObjectContents"> + Contenus + </string> + <string name="AcquiredItems"> + Objets acquis + </string> + <string name="Cancel"> + Annuler + </string> + <string name="UploadingCosts"> + Chargement de %s coûts + </string> + <string name="UnknownFileExtension"> + Extension de fichier inconnue. %s +.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés + </string> + <string name="AddLandmarkNavBarMenu"> + Ajouter un repère... + </string> + <string name="EditLandmarkNavBarMenu"> + Modifier le repère... + </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> + <string name="accel-win-alt"> + Alt+ + </string> + <string name="accel-win-shift"> + Maj+ + </string> + <string name="FileSaved"> + Fichier enregistré + </string> + <string name="Receiving"> + Réception + </string> + <string name="AM"> + AM + </string> + <string name="PM"> + PM + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Forward"> + Vers l'avant + </string> + <string name="Left"> + Gauche + </string> + <string name="Right"> + Droite + </string> + <string name="Back"> + Précédente + </string> + <string name="North"> + Nord + </string> + <string name="South"> + Sud + </string> + <string name="West"> + Ouest + </string> + <string name="East"> + Est + </string> + <string name="Up"> + Vers le haut + </string> + <string name="Down"> + Vers le bas + </string> + <string name="Any Category"> + Toutes catégories + </string> + <string name="Shopping"> + Shopping + </string> + <string name="Land Rental"> + Terrains à louer + </string> + <string name="Property Rental"> + Propriétés à louer + </string> + <string name="Special Attraction"> + Divertissements + </string> + <string name="New Products"> + Nouveaux produits + </string> + <string name="Employment"> + Emplois + </string> + <string name="Wanted"> + Offres + </string> + <string name="Service"> + Services + </string> + <string name="Personal"> + Divers + </string> + <string name="None"> + Aucun + </string> + <string name="Linden Location"> + Appartenant aux Lindens + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + Art et Culture + </string> + <string name="Business"> + Affaires + </string> + <string name="Educational"> + Éducation + </string> + <string name="Gaming"> + Jeux + </string> + <string name="Hangout"> + Favoris + </string> + <string name="Newcomer Friendly"> + Accueil pour les nouveaux + </string> + <string name="Parks&Nature"> + Parcs et Nature + </string> + <string name="Residential"> + Résidentiel + </string> + <string name="Stage"> + Phase + </string> + <string name="Other"> + Autre + </string> + <string name="Any"> + Aucun + </string> + <string name="You"> + Vous + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="MBCmdLineError"> + Une erreur est survenue lors de la lecture de la ligne de commande. +Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters +Erreur : + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Utilisation de la ligne de commande : + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] ne peut accéder à un fichier requis. + +Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert. +Si ce message persiste, veuillez redémarrer votre ordinateur. +Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME]. + </string> + <string name="MBFatalError"> + Erreur fatale + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] est déjà lancé. +Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches. +Si ce message persiste, redémarrez votre ordinateur. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] semble avoir crashé lors de l'utilisation précédente. +Voulez-vous envoyer un rapport de crash ? + </string> + <string name="MBAlert"> + Alerte + </string> + <string name="MBNoDirectX"> + [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. +[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance, ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b. + +Voulez-vous continuer ? + </string> + <string name="MBWarning"> + Avertissement + </string> + <string name="MBNoAutoUpdate"> + Les mises à jour automatiques n'existent pas encore pour Linux. +Veuillez télécharger la dernière version sur www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + RegisterClass a échoué + </string> + <string name="MBError"> + Erreur + </string> + <string name="MBFullScreenErr"> + Impossible d'ouvrir le mode plein écran de [WIDTH] x [HEIGHT] +Utilisation du mode fenêtré. + </string> + <string name="MBDestroyWinFailed"> + Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() failed)) + </string> + <string name="MBShutdownErr"> + Erreur de fermeture + </string> + <string name="MBDevContextErr"> + Impossible de créer le contexte GL + </string> + <string name="MBPixelFmtErr"> + Impossible de trouver le format pixel approprié + </string> + <string name="MBPixelFmtDescErr"> + Impossible de trouver la description du format pixel + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] nécessite que True Color (32-bit) soit exécuté dans une fenêtre. +Veuillez allez sous Panneau de configuration > Affichage > Paramètres et régler la couleur de l'écran sur 32-bit. +Sinon, lorsque vous choisissez le mode plein écran, [APP_NAME] ajustera automatiquement l'écran à chaque utilisation. + </string> + <string name="MBAlpha"> + [APP_NAME] ne peut pas être lancé car il n'y pas de channel 8 bit accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. +Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible. + Assurez-vous aussi que votre écran est réglé sur True Clor (22-bit) sous Panneau de configuration > Affichage > Paramètres. +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Impossible de trouver le format pixel approprié + </string> + <string name="MBGLContextErr"> + Impossible de créer le contexte de rendu GL + </string> + <string name="MBGLContextActErr"> + Impossible d'activer le contexte de rendu GL + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] ne peut pas être exécuté car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. + +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Barbe naissante + </string> + <string name="All White"> + Tout blancs + </string> + <string name="Anime Eyes"> + Grand yeux + </string> + <string name="Arced"> + Arquées + </string> + <string name="Arm Length"> + Longueur des bras + </string> + <string name="Attached"> + Minces + </string> + <string name="Attached Earlobes"> + Largeur des lobes + </string> + <string name="Back Bangs"> + Mèches de derrière + </string> + <string name="Back Bangs Down"> + Mèches de derrière Bas + </string> + <string name="Back Bangs Up"> + Mèches de derrière haut + </string> + <string name="Back Fringe"> + Mèches de derrière + </string> + <string name="Back Hair"> + Cheveux de derrière + </string> + <string name="Back Hair Down"> + Cheveux de derrière Bas + </string> + <string name="Back Hair Up"> + Cheveux de derrière haut + </string> + <string name="Baggy"> + Cernés + </string> + <string name="Bangs"> + Frange + </string> + <string name="Bangs Down"> + Frange Bas + </string> + <string name="Bangs Up"> + Frange Haut + </string> + <string name="Beady Eyes"> + Yeux perçants + </string> + <string name="Belly Size"> + Taille du ventre + </string> + <string name="Big"> + Gros + </string> + <string name="Big Butt"> + Grosses fesses + </string> + <string name="Big Eyeball"> + Gros globe oculaire + </string> + <string name="Big Hair Back"> + Cheveux volumineux : Derrière + </string> + <string name="Big Hair Front"> + Cheveux volumineux : Devant + </string> + <string name="Big Hair Top"> + Cheveux volumineux : En haut + </string> + <string name="Big Head"> + Grosse tête + </string> + <string name="Big Pectorals"> + Gros pectoraux + </string> + <string name="Big Spikes"> + Spikes + </string> + <string name="Black"> + Noir + </string> + <string name="Blonde"> + Blond + </string> + <string name="Blonde Hair"> + Cheveux blonds + </string> + <string name="Blush"> + Blush + </string> + <string name="Blush Color"> + Couleur du blush + </string> + <string name="Blush Opacity"> + Opacité du blush + </string> + <string name="Body Definition"> + Contour du corps + </string> + <string name="Body Fat"> + Graisse + </string> + <string name="Body Freckles"> + Grains de beauté + </string> + <string name="Body Thick"> + Corps épais + </string> + <string name="Body Thickness"> + Épaisseur du corps + </string> + <string name="Body Thin"> + Corps mince + </string> + <string name="Bow Legged"> + Jambes arquées + </string> + <string name="Breast Buoyancy"> + Hauteur des seins + </string> + <string name="Breast Cleavage"> + Clivage + </string> + <string name="Breast Size"> + Taille des seins + </string> + <string name="Bridge Width"> + Arête du nez + </string> + <string name="Broad"> + Large + </string> + <string name="Brow Size"> + Taille des sourcils + </string> + <string name="Bug Eyes"> + Yeux globuleux + </string> + <string name="Bugged Eyes"> + Yeux globuleux + </string> + <string name="Bulbous"> + En bulbe + </string> + <string name="Bulbous Nose"> + Nez en bulbe + </string> + <string name="Bushy Eyebrows"> + Sourcils touffus + </string> + <string name="Bushy Hair"> + Cheveux touffus + </string> + <string name="Butt Size"> + Taille des fesses + </string> + <string name="bustle skirt"> + Jupe gonflante + </string> + <string name="no bustle"> + Pas gonflante + </string> + <string name="more bustle"> + Plus gonflante + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + Pommettes + </string> + <string name="Chest Size"> + Taille de la poitrine + </string> + <string name="Chin Angle"> + Angle du menton + </string> + <string name="Chin Cleft"> + Fente labiale + </string> + <string name="Chin Curtains"> + Favoris + </string> + <string name="Chin Depth"> + Profondeur du menton + </string> + <string name="Chin Heavy"> + Menton lourd + </string> + <string name="Chin In"> + Menton rentré + </string> + <string name="Chin Out"> + Menton sorti + </string> + <string name="Chin-Neck"> + Menton-cou + </string> + <string name="Clear"> + Effacer + </string> + <string name="Cleft"> + Fente + </string> + <string name="Close Set Eyes"> + Yeux rapprochés + </string> + <string name="Closed"> + Fermé(s) + </string> + <string name="Closed Back"> + Fermé à l'arrière + </string> + <string name="Closed Front"> + Fermé devant + </string> + <string name="Closed Left"> + Fermé à gauche + </string> + <string name="Closed Right"> + Fermé à droite + </string> + <string name="Coin Purse"> + Bijoux de famille + </string> + <string name="Collar Back"> + Col arrière + </string> + <string name="Collar Front"> + Col devant + </string> + <string name="Corner Down"> + Coin vers le bas + </string> + <string name="Corner Normal"> + Coin normal + </string> + <string name="Corner Up"> + Coin vers le haut + </string> + <string name="Creased"> + Frippée + </string> + <string name="Crooked Nose"> + Nez en bec d'aigle + </string> + <string name="Cropped Hair"> + Garçonne + </string> + <string name="Cuff Flare"> + Jambe + </string> + <string name="Dark"> + Sombre + </string> + <string name="Dark Green"> + Vert foncé + </string> + <string name="Darker"> + Plus foncé + </string> + <string name="Deep"> + Profonde + </string> + <string name="Default Heels"> + Talons par défaut + </string> + <string name="Default Toe"> + Orteil par défaut + </string> + <string name="Dense"> + Dense + </string> + <string name="Dense hair"> + Cheveux denses + </string> + <string name="Double Chin"> + Double menton + </string> + <string name="Downturned"> + Pointant vers le bas + </string> + <string name="Duffle Bag"> + Membre viril + </string> + <string name="Ear Angle"> + Angle de l'oreille + </string> + <string name="Ear Size"> + Taille de l'oreille + </string> + <string name="Ear Tips"> + Pointes de l'oreille + </string> + <string name="Egg Head"> + Forme de la tête + </string> + <string name="Eye Bags"> + Cernes + </string> + <string name="Eye Color"> + Couleur des yeux + </string> + <string name="Eye Depth"> + Profondeur des yeux + </string> + <string name="Eye Lightness"> + Clarté des yeux + </string> + <string name="Eye Opening"> + Ouverture des yeux + </string> + <string name="Eye Pop"> + Å’il proéminent + </string> + <string name="Eye Size"> + Taille de l'Å“il + </string> + <string name="Eye Spacing"> + Espacement des yeux + </string> + <string name="Eyeball Size"> + Taille du globe oculaire + </string> + <string name="Eyebrow Arc"> + Arc des sourcils + </string> + <string name="Eyebrow Density"> + Épaisseur des sourcils + </string> + <string name="Eyebrow Height"> + Hauteur des sourcils + </string> + <string name="Eyebrow Points"> + Direction des sourcils + </string> + <string name="Eyebrow Size"> + Taille des sourcils + </string> + <string name="Eyelash Length"> + Longueur des cils + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Couleur de l'eyeliner + </string> + <string name="Eyes Back"> + Yeux noirs + </string> + <string name="Eyes Bugged"> + Yeux globuleux + </string> + <string name="Eyes Forward"> + Yeux vers l'avant + </string> + <string name="Eyes Long Head"> + Yeux longue tête + </string> + <string name="Eyes Shear Left Up"> + Å’il gauche vers le haut + </string> + <string name="Eyes Shear Right Up"> + Å’il droit vers le haut + </string> + <string name="Eyes Short Head"> + Yeux petite tête + </string> + <string name="Eyes Spread"> + Espacement des yeux + </string> + <string name="Eyes Sunken"> + Yeux enfoncés + </string> + <string name="Eyes Together"> + Yeux rapprochés + </string> + <string name="Face Shear"> + Visage + </string> + <string name="Facial Definition"> + Définition du visage + </string> + <string name="Far Set Eyes"> + Yeux écartés + </string> + <string name="Fat"> + Grosse + </string> + <string name="Fat Head"> + Grosse tête + </string> + <string name="Fat Lips"> + Lèvres épaisses + </string> + <string name="Fat Lower"> + Inférieure plus épaisse + </string> + <string name="Fat Lower Lip"> + Lèvre inférieure épaisse + </string> + <string name="Fat Torso"> + Torse épais + </string> + <string name="Fat Upper"> + Supérieure plus épaisse + </string> + <string name="Fat Upper Lip"> + Lèvre supérieure épaisse + </string> + <string name="Female"> + Femme + </string> + <string name="Fingerless"> + Sans doigts + </string> + <string name="Fingers"> + Doigts + </string> + <string name="Flared Cuffs"> + Jambes larges + </string> + <string name="Flat"> + Plat + </string> + <string name="Flat Butt"> + Fesses plates + </string> + <string name="Flat Head"> + Tête plate + </string> + <string name="Flat Toe"> + Orteil plat + </string> + <string name="Foot Size"> + Pointure + </string> + <string name="Forehead Angle"> + Angle du front + </string> + <string name="Forehead Heavy"> + Front lourd + </string> + <string name="Freckles"> + Tâches de rousseur + </string> + <string name="Front Bangs Down"> + Mèches de devant longues + </string> + <string name="Front Bangs Up"> + Mèches de devant courtes + </string> + <string name="Front Fringe"> + Mèches de devant + </string> + <string name="Front Hair"> + Cheveux devant + </string> + <string name="Front Hair Down"> + Cheveux de devant longs + </string> + <string name="Front Hair Up"> + Cheveux de devant courts + </string> + <string name="Full Back"> + Arrière touffu + </string> + <string name="Full Eyeliner"> + Eyeliner marqué + </string> + <string name="Full Front"> + Devant touffu + </string> + <string name="Full Hair Sides"> + Côtés touffus + </string> + <string name="Full Sides"> + Côtés touffus + </string> + <string name="Glossy"> + Brillant + </string> + <string name="Glove Fingers"> + Doigts avec gants + </string> + <string name="Glove Length"> + Longueur des gants + </string> + <string name="Hair"> + Cheveux + </string> + <string name="Hair Back"> + Cheveux : Derrière + </string> + <string name="Hair Front"> + Cheveux : Devant + </string> + <string name="Hair Sides"> + Cheveux : Côtés + </string> + <string name="Hair Sweep"> + Sens de la coiffure + </string> + <string name="Hair Thickess"> + Épaisseur des cheveux + </string> + <string name="Hair Thickness"> + Épaisseur des cheveux + </string> + <string name="Hair Tilt"> + Inclinaison des cheveux + </string> + <string name="Hair Tilted Left"> + Vers la gauche + </string> + <string name="Hair Tilted Right"> + Vers la droite + </string> + <string name="Hair Volume"> + Cheveux : Volume + </string> + <string name="Hand Size"> + Taille de la main + </string> + <string name="Handlebars"> + Guidons + </string> + <string name="Head Length"> + Longueur de la tête + </string> + <string name="Head Shape"> + Forme de la tête + </string> + <string name="Head Size"> + Taille de la tête + </string> + <string name="Head Stretch"> + Allongement de la tête + </string> + <string name="Heel Height"> + Hauteur des talons + </string> + <string name="Heel Shape"> + Forme des talons + </string> + <string name="Height"> + Taille + </string> + <string name="High"> + Haut + </string> + <string name="High Heels"> + Talons hauts + </string> + <string name="High Jaw"> + Mâchoire haute + </string> + <string name="High Platforms"> + Plateformes hautes + </string> + <string name="High and Tight"> + Haut et serré + </string> + <string name="Higher"> + Plus élevé + </string> + <string name="Hip Length"> + Longueur hanche + </string> + <string name="Hip Width"> + Largeur hanche + </string> + <string name="In"> + In + </string> + <string name="In Shdw Color"> + Couleur ombre interne + </string> + <string name="In Shdw Opacity"> + Opacité ombre interne + </string> + <string name="Inner Eye Corner"> + Coin de l'Å“il interne + </string> + <string name="Inner Eye Shadow"> + Ombre de l'Å“il interne + </string> + <string name="Inner Shadow"> + Ombre interne + </string> + <string name="Jacket Length"> + Longueur de la veste + </string> + <string name="Jacket Wrinkles"> + Plis de la veste + </string> + <string name="Jaw Angle"> + Angle de la mâchoire + </string> + <string name="Jaw Jut"> + saillie de la mâchoire + </string> + <string name="Jaw Shape"> + Forme de la mâchoire + </string> + <string name="Join"> + Rapprochés + </string> + <string name="Jowls"> + Bajoues + </string> + <string name="Knee Angle"> + Angle du genou + </string> + <string name="Knock Kneed"> + Genoux rapprochés + </string> + <string name="Large"> + Grande + </string> + <string name="Large Hands"> + Grandes mains + </string> + <string name="Left Part"> + Raie à gauche + </string> + <string name="Leg Length"> + Longueur de la jambe + </string> + <string name="Leg Muscles"> + Muscles de la jambe + </string> + <string name="Less"> + Moins + </string> + <string name="Less Body Fat"> + Moins de graisse + </string> + <string name="Less Curtains"> + Moins + </string> + <string name="Less Freckles"> + Moins + </string> + <string name="Less Full"> + Moins + </string> + <string name="Less Gravity"> + Moins + </string> + <string name="Less Love"> + Moins + </string> + <string name="Less Muscles"> + Moins + </string> + <string name="Less Muscular"> + Moins + </string> + <string name="Less Rosy"> + Moins + </string> + <string name="Less Round"> + Moins + </string> + <string name="Less Saddle"> + Moins + </string> + <string name="Less Square"> + Moins + </string> + <string name="Less Volume"> + Moins + </string> + <string name="Less soul"> + Moins + </string> + <string name="Lighter"> + Plus léger + </string> + <string name="Lip Cleft"> + Fente labiale + </string> + <string name="Lip Cleft Depth"> + Profondeur de la fente labiale + </string> + <string name="Lip Fullness"> + Volume des lèvres + </string> + <string name="Lip Pinkness"> + Rougeur des lèvres + </string> + <string name="Lip Ratio"> + Proportion des lèvres + </string> + <string name="Lip Thickness"> + Épaisseur des lèvres + </string> + <string name="Lip Width"> + Largeur des lèvres + </string> + <string name="Lipgloss"> + Brillant à lèvres + </string> + <string name="Lipstick"> + Rouge à lèvres + </string> + <string name="Lipstick Color"> + Couleur du rouge à lèvres + </string> + <string name="Long"> + Long + </string> + <string name="Long Head"> + Tête longue + </string> + <string name="Long Hips"> + Hanches longues + </string> + <string name="Long Legs"> + Jambes longues + </string> + <string name="Long Neck"> + Long cou + </string> + <string name="Long Pigtails"> + Longues couettes + </string> + <string name="Long Ponytail"> + Longue queue de cheval + </string> + <string name="Long Torso"> + Torse long + </string> + <string name="Long arms"> + Longs bras + </string> + <string name="Longcuffs"> + Manches longues + </string> + <string name="Loose Pants"> + Pantalons amples + </string> + <string name="Loose Shirt"> + Chemise ample + </string> + <string name="Loose Sleeves"> + Manches amples + </string> + <string name="Love Handles"> + Poignées d'amour + </string> + <string name="Low"> + Bas + </string> + <string name="Low Heels"> + Talons bas + </string> + <string name="Low Jaw"> + Mâchoire basse + </string> + <string name="Low Platforms"> + Plateformes basses + </string> + <string name="Low and Loose"> + Bas et ample + </string> + <string name="Lower"> + Abaisser + </string> + <string name="Lower Bridge"> + Arête plus basse + </string> + <string name="Lower Cheeks"> + Joues plus basses + </string> + <string name="Male"> + Homme + </string> + <string name="Middle Part"> + Raie au milieu + </string> + <string name="More"> + Plus + </string> + <string name="More Blush"> + Plus + </string> + <string name="More Body Fat"> + Plus + </string> + <string name="More Curtains"> + Plus + </string> + <string name="More Eyeshadow"> + Plus + </string> + <string name="More Freckles"> + Plus + </string> + <string name="More Full"> + Plus + </string> + <string name="More Gravity"> + Plus + </string> + <string name="More Lipstick"> + Plus + </string> + <string name="More Love"> + Plus + </string> + <string name="More Lower Lip"> + Plus + </string> + <string name="More Muscles"> + Plus + </string> + <string name="More Muscular"> + Plus + </string> + <string name="More Rosy"> + Plus + </string> + <string name="More Round"> + Plus + </string> + <string name="More Saddle"> + Plus + </string> + <string name="More Sloped"> + Plus + </string> + <string name="More Square"> + Plus + </string> + <string name="More Upper Lip"> + Plus + </string> + <string name="More Vertical"> + Plus + </string> + <string name="More Volume"> + Plus + </string> + <string name="More soul"> + Plus + </string> + <string name="Moustache"> + Moustache + </string> + <string name="Mouth Corner"> + Coin de la bouche + </string> + <string name="Mouth Position"> + Position de la bouche + </string> + <string name="Mowhawk"> + Mowhawk + </string> + <string name="Muscular"> + Musclé + </string> + <string name="Mutton Chops"> + Rouflaquettes + </string> + <string name="Nail Polish"> + Vernis à ongles + </string> + <string name="Nail Polish Color"> + Couleur du vernis + </string> + <string name="Narrow"> + Étroit + </string> + <string name="Narrow Back"> + Arrière étroit + </string> + <string name="Narrow Front"> + Devant étroit + </string> + <string name="Narrow Lips"> + Lèvres étroites + </string> + <string name="Natural"> + Naturel + </string> + <string name="Neck Length"> + Longueur du cou + </string> + <string name="Neck Thickness"> + Épaisseur du cou + </string> + <string name="No Blush"> + Pas de blush + </string> + <string name="No Eyeliner"> + Pas de eyeliner + </string> + <string name="No Eyeshadow"> + Pas d'ombre à paupières + </string> + <string name="No Heels"> + Pas de talons + </string> + <string name="No Lipgloss"> + Pas de brillant à lèvres + </string> + <string name="No Lipstick"> + Pas de rouge à lèvres + </string> + <string name="No Part"> + Pas de raie + </string> + <string name="No Polish"> + Pas de vernis + </string> + <string name="No Red"> + Pas de rouge + </string> + <string name="No Spikes"> + Pas de spikes + </string> + <string name="No White"> + Pas de blanc + </string> + <string name="No Wrinkles"> + Pas de rides + </string> + <string name="Normal Lower"> + Normal plus bas + </string> + <string name="Normal Upper"> + Normal plus haut + </string> + <string name="Nose Left"> + Nez à gauche + </string> + <string name="Nose Right"> + Nez à droite + </string> + <string name="Nose Size"> + Taille du nez + </string> + <string name="Nose Thickness"> + Épaisseur du nez + </string> + <string name="Nose Tip Angle"> + Angle du bout du nez + </string> + <string name="Nose Tip Shape"> + Forme du bout du nez + </string> + <string name="Nose Width"> + Largeur du nez + </string> + <string name="Nostril Division"> + Division des narines + </string> + <string name="Nostril Width"> + Largeur des narines + </string> + <string name="Old"> + Vieux + </string> + <string name="Opaque"> + Opaque + </string> + <string name="Open"> + Ouvert + </string> + <string name="Open Back"> + Derrière ouvert + </string> + <string name="Open Front"> + Devant ouvert + </string> + <string name="Open Left"> + Ouvert à gauche + </string> + <string name="Open Right"> + Ouvert à droite + </string> + <string name="Orange"> + Orange + </string> + <string name="Out"> + Dehors + </string> + <string name="Out Shdw Color"> + Couleur de l'ombre externe + </string> + <string name="Out Shdw Opacity"> + Opacité de l'ombre externe + </string> + <string name="Outer Eye Corner"> + Coin de l'Å“il externe + </string> + <string name="Outer Eye Shadow"> + Ombre de l'Å“il externe + </string> + <string name="Outer Shadow"> + Ombre externe + </string> + <string name="Overbite"> + Chevauchement + </string> + <string name="Package"> + Parties + </string> + <string name="Painted Nails"> + Ongles vernis + </string> + <string name="Pale"> + Pâle + </string> + <string name="Pants Crotch"> + Entrejambe + </string> + <string name="Pants Fit"> + Taille + </string> + <string name="Pants Length"> + Longueur + </string> + <string name="Pants Waist"> + Taille + </string> + <string name="Pants Wrinkles"> + Plis + </string> + <string name="Part"> + Raie + </string> + <string name="Part Bangs"> + Séparation de la frange + </string> + <string name="Pectorals"> + Pectoraux + </string> + <string name="Pigment"> + Pigmentation + </string> + <string name="Pigtails"> + Couettes + </string> + <string name="Pink"> + Rose + </string> + <string name="Pinker"> + Plus rose + </string> + <string name="Platform Height"> + Hauteur de la plateforme + </string> + <string name="Platform Width"> + Largeur de la plateforme + </string> + <string name="Pointy"> + Pointu + </string> + <string name="Pointy Heels"> + Talons pointus + </string> + <string name="Pointy Toe"> + Orteil pointu + </string> + <string name="Ponytail"> + Queue de cheval + </string> + <string name="Poofy Skirt"> + Jupe bouffante + </string> + <string name="Pop Left Eye"> + Å’il gauche saillant + </string> + <string name="Pop Right Eye"> + Å’il droit saillant + </string> + <string name="Puffy"> + Gonflé + </string> + <string name="Puffy Eyelids"> + Paupières gonflées + </string> + <string name="Rainbow Color"> + Couleur de l'arc en ciel + </string> + <string name="Red Hair"> + Cheveux roux + </string> + <string name="Red Skin"> + Peau rouge + </string> + <string name="Regular"> + Standard + </string> + <string name="Regular Muscles"> + Muscles normaux + </string> + <string name="Right Part"> + Raie à droite + </string> + <string name="Rosy Complexion"> + Teint rosé + </string> + <string name="Round"> + Rond + </string> + <string name="Round Forehead"> + Front rond + </string> + <string name="Ruddiness"> + Rougeur + </string> + <string name="Ruddy"> + Rouge + </string> + <string name="Rumpled Hair"> + Texture + </string> + <string name="Saddle Bags"> + Culotte de cheval + </string> + <string name="Saddlebags"> + Culotte de cheval + </string> + <string name="Scrawny"> + Maigre + </string> + <string name="Scrawny Leg"> + Jambes maigres + </string> + <string name="Separate"> + Séparés + </string> + <string name="Shading"> + Dégradé + </string> + <string name="Shadow hair"> + Cheveux + </string> + <string name="Shallow"> + Creux + </string> + <string name="Shear Back"> + Coupe derrière + </string> + <string name="Shear Face"> + Visage + </string> + <string name="Shear Front"> + Devant dégagé + </string> + <string name="Shear Left"> + Gauche dégagée + </string> + <string name="Shear Left Up"> + Haut gauche dégagé + </string> + <string name="Shear Right"> + Droite dégagée + </string> + <string name="Shear Right Up"> + Haut droit dégagé + </string> + <string name="Sheared Back"> + Dégagé derrière + </string> + <string name="Sheared Front"> + Dégagé devant + </string> + <string name="Shift Left"> + Déplacer vers la gauche + </string> + <string name="Shift Mouth"> + Déplacer la bouche + </string> + <string name="Shift Right"> + Déplacer vers la droite + </string> + <string name="Shirt Bottom"> + Chemise + </string> + <string name="Shirt Fit"> + Taille + </string> + <string name="Shirt Wrinkles"> + Plis + </string> + <string name="Shoe Height"> + Hauteur de la chaussure + </string> + <string name="Short"> + Court + </string> + <string name="Short Arms"> + Bras courts + </string> + <string name="Short Legs"> + Jambes courtes + </string> + <string name="Short Neck"> + Petit cou + </string> + <string name="Short Pigtails"> + Couettes courtes + </string> + <string name="Short Ponytail"> + Queue de cheval courte + </string> + <string name="Short Sideburns"> + Favoris courts + </string> + <string name="Short Torso"> + Torse court + </string> + <string name="Short hips"> + Hanches courtes + </string> + <string name="Shoulders"> + Épaules + </string> + <string name="Side Bangs"> + Mèches sur le côté + </string> + <string name="Side Bangs Down"> + Mèches sur le côté en bas + </string> + <string name="Side Bangs Up"> + Mèches sur le côté en haut + </string> + <string name="Side Fringe"> + Frange sur le côté + </string> + <string name="Sideburns"> + Favoris + </string> + <string name="Sides Hair"> + Cheveux sur le côté + </string> + <string name="Sides Hair Down"> + Cheveux sur le côté en bas + </string> + <string name="Sides Hair Up"> + Cheveux sur le côté en haut + </string> + <string name="Skinny"> + Maigre + </string> + <string name="Skinny Neck"> + Cou maigre + </string> + <string name="Skirt Fit"> + Taille de la jupe + </string> + <string name="Skirt Length"> + Longueur de la jupe + </string> + <string name="Slanted Forehead"> + Front incliné + </string> + <string name="Sleeve Length"> + Longueur de la manche + </string> + <string name="Sleeve Looseness"> + Ampleur de la manche + </string> + <string name="Slit Back"> + Fente : Derrière + </string> + <string name="Slit Front"> + Fente : Devant + </string> + <string name="Slit Left"> + Fente : Gauche + </string> + <string name="Slit Right"> + Fente : Droite + </string> + <string name="Small"> + Petite + </string> + <string name="Small Hands"> + Petites mains + </string> + <string name="Small Head"> + Petite tête + </string> + <string name="Smooth"> + Lisse + </string> + <string name="Smooth Hair"> + Cheveux lisses + </string> + <string name="Socks Length"> + Longueur des chaussettes + </string> + <string name="Some"> + Quelques un(e)s + </string> + <string name="Soulpatch"> + Soulpatch + </string> + <string name="Sparse"> + Rares + </string> + <string name="Spiked Hair"> + Mèches en pointe + </string> + <string name="Square"> + Carré + </string> + <string name="Square Toe"> + Orteil carré + </string> + <string name="Squash Head"> + Écraser la tête + </string> + <string name="Squash/Stretch Head"> + Allonger/écraser la tête + </string> + <string name="Stretch Head"> + Allonger la tête + </string> + <string name="Sunken"> + Enfoncées + </string> + <string name="Sunken Chest"> + Poitrine enfoncée + </string> + <string name="Sunken Eyes"> + Yeux enfoncés + </string> + <string name="Sweep Back"> + En arrière + </string> + <string name="Sweep Forward"> + Vers l'avant + </string> + <string name="Swept Back"> + En arrière + </string> + <string name="Swept Back Hair"> + Cheveux en arrière + </string> + <string name="Swept Forward"> + Vers l'avant + </string> + <string name="Swept Forward Hair"> + Cheveux vers l''avant + </string> + <string name="Tall"> + Grand + </string> + <string name="Taper Back"> + Biseauter à l'arrière + </string> + <string name="Taper Front"> + Biseauter à l'avant + </string> + <string name="Thick Heels"> + Talons épais + </string> + <string name="Thick Neck"> + Cou épais + </string> + <string name="Thick Toe"> + Orteil épais + </string> + <string name="Thickness"> + Épaisseur + </string> + <string name="Thin"> + Fins + </string> + <string name="Thin Eyebrows"> + Sourcils fins + </string> + <string name="Thin Lips"> + Lèvres fines + </string> + <string name="Thin Nose"> + Nez fin + </string> + <string name="Tight Chin"> + Menton fin + </string> + <string name="Tight Cuffs"> + Jambes serrées + </string> + <string name="Tight Pants"> + Pantalons serrés + </string> + <string name="Tight Shirt"> + Chemise serrée + </string> + <string name="Tight Skirt"> + Jupe serrée + </string> + <string name="Tight Sleeves"> + Manches serrées + </string> + <string name="Tilt Left"> + Pencher sur la gauche + </string> + <string name="Tilt Right"> + Pencher sur la droite + </string> + <string name="Toe Shape"> + Forme de l'orteil + </string> + <string name="Toe Thickness"> + Épaisseur de l'orteil + </string> + <string name="Torso Length"> + Longueur du torse + </string> + <string name="Torso Muscles"> + Muscles du torse + </string> + <string name="Torso Scrawny"> + Torse maigre + </string> + <string name="Unattached"> + Séparés + </string> + <string name="Uncreased"> + Lisse + </string> + <string name="Underbite"> + Rentré + </string> + <string name="Unnatural"> + Artificiel + </string> + <string name="Upper Bridge"> + Arête supérieure + </string> + <string name="Upper Cheeks"> + Pommettes + </string> + <string name="Upper Chin Cleft"> + Fente du menton supérieure + </string> + <string name="Upper Eyelid Fold"> + Paupière supérieure + </string> + <string name="Upturned"> + En trompette + </string> + <string name="Very Red"> + Très rouge + </string> + <string name="Waist Height"> + Hauteur de la taille + </string> + <string name="Well-Fed"> + Bien nourri + </string> + <string name="White Hair"> + Cheveux blancs + </string> + <string name="Wide"> + Large + </string> + <string name="Wide Back"> + Dos large + </string> + <string name="Wide Front"> + Devant large + </string> + <string name="Wide Lips"> + Lèvres larges + </string> + <string name="Wild"> + Revêche + </string> + <string name="Wrinkles"> + Rides + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Ajouter à mes repères + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Modifier mes repères + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Mettre à jour + </string> + <string name="UpdaterNowUpdating"> + En train de charger [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + En train d'installer [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Mise à jour en cours... + </string> + <string name="UpdaterProgressBarText"> + Mise à jour en cours + </string> + <string name="UpdaterFailDownloadTitle"> + Le téléchargement de la mise à jour a échoué + </string> + <string name="UpdaterFailUpdateDescriptive"> + Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + L'installation de la mise à jour a échoué + </string> + <string name="UpdaterFailStartTitle"> + Impossible de lancer le client + </string> + <string name="only_user_message"> + Vous êtes le seul participant à cette session. + </string> + <string name="offline_message"> + [FIRST] [LAST] est déconnecté(e). + </string> + <string name="invite_message"> + Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. + </string> + <string name="generic_request_error"> + Erreur lors de la requête, veuillez réessayer ultérieurement. + </string> + <string name="insufficient_perms_error"> + Vous n'avez pas les droits requis. + </string> + <string name="session_does_not_exist_error"> + La session a expiré + </string> + <string name="no_ability_error"> + Vous n'avez pas ce pouvoir. + </string> + <string name="no_ability"> + Vous n'avez pas ce pouvoir. + </string> + <string name="not_a_mod_error"> + Vous n'êtes pas modérateur de session. + </string> + <string name="muted_error"> + 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]. + </string> + <string name="message_session_event"> + Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. + </string> + <string name="removed_from_group"> + Vous avez été supprimé du groupe. + </string> + <string name="close_on_no_ability"> + Vous ne pouvez plus participer à la session de chat. + </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 1315a4b100475d2d77b8a889fcca5a1981f05c18..b76ae370fd0cfdcd24045ffc69d8e77592640a31 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -1,77 +1,77 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<teleport_messages name=""> - <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. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. - </message> - <message name="invalid_region_handoff"> - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. - </message> - <message name="blocked_tport"> - Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. -Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. - </message> - <message name="nolandmark_tport"> - Désolé, le système n'a pas réussi à localiser la destination de votre repère. - </message> - <message name="timeout_tport"> - Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. -Veuillez réessayer dans un moment. - </message> - <message name="noaccess_tport"> - Désolé, vous n'avez pas accès à cette destination. - </message> - <message name="missing_attach_tport"> - Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. - </message> - <message name="too_many_uploads_tport"> - Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. - </message> - <message name="expired_tport"> - Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </message> - <message name="expired_region_handoff"> - Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </message> - <message name="no_host"> - Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. - </message> - <message name="no_inventory_host"> - L'inventaire est temporairement indisponible. - </message> - </message_set> - <message_set name="progress"> - <message name="sending_dest"> - Envoi vers la destination en cours. - </message> - <message name="redirecting"> - Redirection vers un emplacement différent en cours. - </message> - <message name="relaying"> - Relai vers la destination en cours. - </message> - <message name="sending_home"> - Requête de la demande d'envoi vers votre domicile en cours. - </message> - <message name="sending_landmark"> - Requête de la demande d'envoi vers le repère en cours. - </message> - <message name="completing"> - Téléportation sur le point d'aboutir. - </message> - <message name="resolving"> - Destination en cours de résolution. - </message> - <message name="contacting"> - Contact avec la nouvelle région en cours. - </message> - <message name="arriving"> - Vous arrivez... - </message> - <message name="requesting"> - Demande de téléportation en cours... - </message> - </message_set> -</teleport_messages> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<teleport_messages name=""> + <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. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. +Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. + </message> + <message name="nolandmark_tport"> + Désolé, le système n'a pas réussi à localiser la destination de votre repère. + </message> + <message name="timeout_tport"> + Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. +Veuillez réessayer dans un moment. + </message> + <message name="noaccess_tport"> + Désolé, vous n'avez pas accès à cette destination. + </message> + <message name="missing_attach_tport"> + Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. + </message> + <message name="too_many_uploads_tport"> + Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. + </message> + <message name="expired_tport"> + Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </message> + <message name="expired_region_handoff"> + Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </message> + <message name="no_host"> + Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. + </message> + <message name="no_inventory_host"> + L'inventaire est temporairement indisponible. + </message> + </message_set> + <message_set name="progress"> + <message name="sending_dest"> + Envoi vers la destination en cours. + </message> + <message name="redirecting"> + Redirection vers un emplacement différent en cours. + </message> + <message name="relaying"> + Relai vers la destination en cours. + </message> + <message name="sending_home"> + Requête de la demande d'envoi vers votre domicile en cours. + </message> + <message name="sending_landmark"> + Requête de la demande d'envoi vers le repère en cours. + </message> + <message name="completing"> + Téléportation sur le point d'aboutir. + </message> + <message name="resolving"> + Destination en cours de résolution. + </message> + <message name="contacting"> + Contact avec la nouvelle région en cours. + </message> + <message name="arriving"> + Vous arrivez... + </message> + <message name="requesting"> + Demande de téléportation en cours... + </message> + </message_set> +</teleport_messages> 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 7a5f9c9fcbc6b84f1e5ad47d480eb246479b540a..0e25cef60b7f79645597fd82a5afb50290b1b7df 100644 --- a/indra/newview/skins/default/xui/it/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_about" title="BROWSER MULTIMEDIALE"> + <floater.string name="home_page_url"> + http://it.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://it.secondlife.com/support + </floater.string> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Indietro" name="back" width="75"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index 0010f42a12a7d60c916401dd895dce55ec04559d..b1eb80149e9e827c88d6b1ba45813c80bcb73759 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> + <menu name="Me"> + <menu_item_call label="Preferenze" 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=it" /> + </menu_item_call> + </menu> <menu label="File" name="File"> <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> <menu label="Carica" name="upload"> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 8f8a969acef05613dd81f6d65f5165c3d7c9ffcd..26a64a49d397617fc9892ec9e0f1e294a61359d3 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -379,10 +379,13 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach Devi inserire sia il nome che il cognome del tuo avatar. Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso? + <url name="url"> + https://join.secondlife.com/index.php?lang=it-IT + </url> <usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/> </notification> <notification name="AddClassified"> - Gli annunci appaiono nella sezione 'Annunci' della ricerca nel database e su www.secondlife.com per una settimana. + Gli annunci appaiono nella sezione 'Annunci' della ricerca nel database e su [http://secondlife.com/community/classifieds/?lang=it-IT secondlife.com] per una settimana. Compila il tuo annuncio e clicca 'Pubblica...' per aggiungerlo al database. Ti verrà chiesto un prezzo da pagare quando clicchi su Pubblica. Pagare un prezzo più alto fa sì che il tuo annuncio compaia più in alto nella lista, e che sia più facile da trovare quando la gente ricerca per parole chiavi. @@ -403,6 +406,9 @@ Non ci sono rimborsi per la tariffa pagata. </notification> <notification name="PromptGoToEventsPage"> Vai alla pagina degli eventi di [SECOND_LIFE]? + <url name="url"> + http://secondlife.com/events/?lang=it-IT + </url> <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="SelectProposalToView"> @@ -575,6 +581,9 @@ Sposta tutti gli oggetti che vuoi acquisire su una sola regione. [EXTRA] Vuoi andare su [_URL] per maggiori informazioni su come acquistare L$? + <url name="url"> + http://secondlife.com/app/currency/?lang=it-IT + </url> <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="UnableToLinkObjects"> @@ -1128,13 +1137,16 @@ Puoi usare [SECOND_LIFE] normalmente e gli altri utenti ti vedranno correttament L'installazione di [APP_NAME] è completata. Se questa è la prima volta che usi [SECOND_LIFE], avari bisogno di creare un account prima di poterti collegare. -Vai su www.secondlife.com per creare un nuovo account? +Vai su [https://join.secondlife.com/index.php?lang=it-IT secondlife.com] per creare un nuovo account? <usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/> </notification> <notification name="LoginPacketNeverReceived"> Ci sono stati problemi durante la connessione. Potrebbero esserci problemi con la tua connessione ad internet oppure con i server di [SECOND_LIFE]. Puoi controllare la tua connessione internet e riprovare fra qualche minuto, oppure cliccare su Aiuto per collegarti al nostro sito di supporto, oppure cliccare teleporta per cercare di teleportarti a casa. + <url name="url"> + http://it.secondlife.com/support/ + </url> <form name="form"> <button name="OK" text="OK"/> <button name="Help" text="Aiuto"/> @@ -1510,7 +1522,7 @@ Verifica di avere installato l'ultima versione del programma e vai alla Kno Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di accesso? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it </url> <usetemplate name="okcancelignore" @@ -1549,7 +1561,7 @@ Verifica di avere installato l'ultima versione del programma e vai alla Kno Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it </url> <usetemplate name="okcancelignore" @@ -1583,7 +1595,7 @@ Verifica di avere installato l'ultima versione del programma e vai alla Kno Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it </url> <usetemplate name="okcancelignore" @@ -2008,10 +2020,7 @@ Trasferisci gli elementi nell'inventario? <usetemplate ignoretext="Quando esci da [APP_NAME]." name="okcancelignore" notext="Continua" yestext="Esci"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Usa questo strumento per segnalare violazioni ai Termini di Servizio e agli standard della Comunità . Vedi: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php + Usa questo strumento per segnalare violazioni ai [http://secondlife.com/corporate/tos.php?lang=it-IT Termini di Servizio] e agli [http://secondlife.com/corporate/cs.php?lang=it-IT standard della Comunità ]. Tutte gli abusi ai Termini di Servizio e agli Standard della Comunità segnalati, sono indagati e risolti. Puoi controllare la risoluzione degli abusi visitando la pagina delle Risoluzioni degli Incidenti: @@ -2366,7 +2375,7 @@ Vuoi visitare il sito di [SECOND_LIFE] per verificare la tua eta? [_URL] <url name="url" option="0"> - https://secondlife.com/account/verification.php + https://secondlife.com/account/verification.php?lang=it </url> <usetemplate ignoretext="Quando hai un avviso per mancanza della verifica dell'età ." name="okcancelignore" notext="No" yestext="Si"/> </notification> diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml index 178208903933923832c3e93e3e79a7999deb682a..e3cb7473fc47c1ee609f4e80269e057e6962cfda 100644 --- a/indra/newview/skins/default/xui/it/panel_login.xml +++ b/indra/newview/skins/default/xui/it/panel_login.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_login"> - <string name="real_url"> - http://secondlife.com/app/login/ - </string> - <string name="forgot_password_url"> - http://secondlife.com/account/request.php - </string> + <panel.string name="create_account_url"> + http://join.secondlife.com/index.php?lang=it-IT + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=it + </panel.string> +<panel name="login_widgets"> <text name="first_name_text" left="20"> Nome: </text> @@ -37,3 +38,4 @@ [VERSION] </text> </panel> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml new file mode 100644 index 0000000000000000000000000000000000000000..2aa8b7d0e4a35622f9e1a419cd0f3e2abab06d10 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_profile.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=it-IT + </string> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=it + </string> + <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index bc3cc38a407f25caebeb5543701648a2d9aeb301..6e3301fdd917733d4f909566f312d109e40b76c0 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -4,6 +4,7 @@ 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=it-IT</string> <string name="LoginInProgress"> In connessione. [APP_NAME] può sembrare rallentata. Attendi. </string> diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index 07911c68b1f62f7e52dff4d69b5451e997db31b2..723ceae552fd7942f56a815651979a31dde091c2 100644 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="[APP_NAME]ã«ã¤ã„ã¦"> - <tab_container name="about_tab"> - <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ã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚ - - ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“れã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ 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 - - - - ビジãƒã‚¹ã§æˆåŠŸã™ã‚‹ã«ã¯ã€å‹‡æ°—ã‚’æŒã£ã¦ã€èª°ã‚ˆã‚Šã‚‚å…ˆã«ã€äººã¨é•ã£ãŸã“ã¨ã‚’ã™ã‚‹ã“ã¨ã 。 --Henry Marchant - </text_editor> - </panel> - <panel label="ライセンス" 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) - expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. - 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) - jpeglib Copyright (C) 1991-1998, Thomas G. Lane. - ogg/vorbis Copyright (C) 2001, Xiphophorus - OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. - SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga - SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - xmlrpc-epi Copyright (C) 2000 Epinions, Inc. - zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. - google-perftools Copyright (c) 2005, Google Inc. - - ç„¡æ–転写ã€è¤‡è£½ã€è»¢è¼‰ã‚’ç¦ã˜ã¾ã™ã€‚ 詳細ã¯licenses.txtã‚’å‚ç…§ã—ã¦ãã ã•ã„。 - - Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) - </text_editor> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="[APP_NAME]ã«ã¤ã„ã¦"> + <tab_container name="about_tab"> + <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ã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚ + + ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“れã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ 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 + + + + ビジãƒã‚¹ã§æˆåŠŸã™ã‚‹ã«ã¯ã€å‹‡æ°—ã‚’æŒã£ã¦ã€èª°ã‚ˆã‚Šã‚‚å…ˆã«ã€äººã¨é•ã£ãŸã“ã¨ã‚’ã™ã‚‹ã“ã¨ã 。 --Henry Marchant + </text_editor> + </panel> + <panel label="ライセンス" 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) + expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. + 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) + jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + ogg/vorbis Copyright (C) 2001, Xiphophorus + OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. + SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga + SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + xmlrpc-epi Copyright (C) 2000 Epinions, Inc. + zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. + google-perftools Copyright (c) 2005, Google Inc. + + ç„¡æ–転写ã€è¤‡è£½ã€è»¢è¼‰ã‚’ç¦ã˜ã¾ã™ã€‚ 詳細ã¯licenses.txtã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) + </text_editor> + </panel> + </tab_container> +</floater> 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 bb9dcac83bb7721e92c210a437214e0a7a735134..80c76879f14c0e7ccdd3ddbfd8d6c7a8e107cb30 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -1,475 +1,475 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="åœŸåœ°æƒ…å ±"> - <floater.string name="Minutes"> - [MINUTES] 分 - </floater.string> - <floater.string name="Minute"> - 分 - </floater.string> - <floater.string name="Seconds"> - [SECONDS] ç§’ - </floater.string> - <tab_container name="landtab"> - <panel label="一般" name="land_general_panel"> - <panel.string name="new users only"> - æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ - </panel.string> - <panel.string name="anyone"> - 誰ã§ã‚‚ - </panel.string> - <panel.string name="area_text"> - é¢ç©ï¼š - </panel.string> - <panel.string name="area_size_text"> - [AREA]平方メートル - </panel.string> - <panel.string name="auction_id_text"> - オークション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"> - プãƒãƒ•ィール... - </panel.string> - <panel.string name="info_text"> - æƒ…å ±... - </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> - <text name="Name:"> - åå‰ï¼š - </text> - <line_editor name="Name"/> - <text name="Description:"> - 説明: - </text> - <text name="LandType"> - 種類: - </text> - <text name="LandTypeText"> - メインランド/ホームステッド - </text> - <text name="ContentRating"> - 区分: - </text> - <text name="ContentRatingText"> - Adult - </text> - <text name="Owner:"> - オーナー: - </text> - <text name="OwnerText"> - Leyla Linden - </text> - <button label="プãƒãƒ•ィール..." label_selected="プãƒãƒ•ィール..." name="Profile..."/> - <text name="Group:"> - グループ: - </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="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れるã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/> - <text name="For Sale:"> - è²©å£²ã®æœ‰ç„¡ï¼š - </text> - <text name="Not for sale."> - 販売対象外 - </text> - <text name="For Sale: Price L$[PRICE]."> - ä¾¡æ ¼ï¼š L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル) - </text> - <button label="土地を販売..." label_selected="土地を販売..." name="Sell Land..."/> - <text name="For sale to"> - 販売先:[BUYER] - </text> - <text name="Sell with landowners objects in parcel."> - ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚‚è²©å£²ä¾¡æ ¼ã«å«ã¾ã‚Œã¾ã™ - </text> - <text name="Selling with no objects in parcel."> - オブジェクトã¯è²©å£²å¯¾è±¡å¤–ã§ã™ - </text> - <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/> - <text name="Claimed:"> - å–得日時: - </text> - <text name="DateClaimText"> - 2006å¹´8月15æ—¥ç«æ›œæ—¥13:47:25 - </text> - <text name="PriceLabel"> - é¢ç©ï¼š - </text> - <text name="PriceText"> - 4048平方メートル - </text> - <text name="Traffic:"> - 交通é‡: - </text> - <text name="DwellText"> - 誤 - </text> - <button label="土地を購入..." label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/> - <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="土地を放棄..." name="Abandon Land..."/> - <button label="土地ã®è¿”é‚„ã‚’è¦æ±‚..." label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/> - <button label="Lindenセール..." 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"> - ä¸å‹•産: - </text> - <text name="estate_name_lbl"> - åå‰ï¼š - </text> - <text name="estate_name_text"> - メインランド - </text> - <text name="estate_owner_lbl"> - オーナー: - </text> - <text name="estate_owner_text"> - (ãªã—) - </text> - <text_editor name="covenant_editor"> - ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 - </text_editor> - <text name="covenant_timestamp_text"> - æœ€å¾Œã®æ›´æ–°1969å¹´12月31日水曜日16:00:00 - </text> - <text font="SansSerifLarge" name="region_section_lbl"> - 地域: - </text> - <text name="region_name_lbl"> - åå‰ï¼š - </text> - <text name="region_name_text"> - Leyla - </text> - <text name="region_landtype_lbl"> - 種類: - </text> - <text name="region_landtype_text"> - メインランド/ホームステッド - </text> - <text name="region_maturity_lbl"> - 区分: - </text> - <text name="region_maturity_text"> - Adult - </text> - <text name="resellable_lbl"> - å†è²©ï¼š - </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]利用å¯èƒ½ï¼‰ - </panel.string> - <panel.string left="200" name="objects_deleted_text"> - [MAX]ã®å†…[COUNT]([DELETED]を削除) - </panel.string> - <text name="parcel_object_bonus"> - 地域オブジェクトボーナスè¦å› : [BONUS] - </text> - <text name="Simulator primitive usage:" width="500"> - 地域全体ã®ãƒ—リム使用状æ³ï¼š - </text> - <text left="200" name="objects_available"> - [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ - </text> - <text name="Primitives parcel supports:" width="200"> - 区画ã§ã‚µãƒãƒ¼ãƒˆã•れるプリム数: - </text> - <text left="200" name="object_contrib_text"> - [COUNT] - </text> - <text name="Primitives on parcel:"> - 区画上ã®ãƒ—リム数: - </text> - <text left="200" name="total_objects_text"> - [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="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> - <text name="Set to group:"> - グループã«è¨å®šï¼š - </text> - <text left="200" name="group_objects_text"> - [COUNT] - </text> - <button label="表示" label_selected="表示" name="ShowGroup" right="-145"/> - <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="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> - <text name="Selected / sat upon:"> - é¸æŠžæ¸ˆã¿ï¼æ±ºå®šæ¸ˆã¿ï¼š - </text> - <text left="200" name="selected_objects_text"> - [COUNT] - </text> - <text name="Autoreturn" width="500"> - ä»–ã®ä½äººã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´(分ã€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"/> - <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="mostrecent"/> - </name_list> - </panel> - <panel label="オプション" name="land_options_panel"> - <panel.string name="search_enabled_tooltip"> - ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹ - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - 区画é¢ç©ãŒ128平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ -大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ - </panel.string> - <panel.string name="mature_check_mature"> - Matureコンテンツ - </panel.string> - <panel.string name="mature_check_adult"> - Adultコンテンツ - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Matureã¨ã•れã¦ã„ã¾ã™ã€‚ - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯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> - <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"> - オブジェクトã®é€²å…¥ï¼š - </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"> - スクリプトã®å®Ÿè¡Œï¼š - </text> - <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="check other scripts"/> - <check_box label="グループ" left="380" 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="æ¤œç´¢çµæžœã§ã“ã®åŒºç”»ã‚’表示ã•ã›ã‚‹"/> - <combo_box name="land category with adult"> - <combo_box.item label="全カテゴリ" name="item0"/> - <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"/> - <combo_box.item label="教育的" name="item5"/> - <combo_box.item label="ゲーム" name="item6"/> - <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/> - <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/> - <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/> - <combo_box.item label="ä½å®…用" name="item10"/> - <combo_box.item label="ショッピング" name="item11"/> - <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="item3"/> - <combo_box.item label="ビジãƒã‚¹" name="item4"/> - <combo_box.item label="教育的" name="item5"/> - <combo_box.item label="ゲーム" name="item6"/> - <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/> - <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/> - <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/> - <combo_box.item label="ä½å®…用" name="item10"/> - <combo_box.item label="ショッピング" name="item11"/> - <combo_box.item label="ãã®ä»–" name="item12"/> - </combo_box> - <check_box label="Matureコンテンツ" name="MatureCheck" tool_tip=""/> - <text name="Snapshot:"> - スナップショット: - </text> - <texture_picker label="" left="116" 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="Teleport Routing -- select how to handle teleports onto your land."> - <combo_box.item label="ä¸å¯" name="Blocked"/> - <combo_box.item label="ç€åœ°ç‚¹" name="LandingPoint"/> - <combo_box.item label="ã©ã“ã§ã‚‚" name="Anywhere"/> - </combo_box> - </panel> - <panel label="メディア" name="land_media_panel"> - <text name="with media:"> - 種類: - </text> - <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/> - <text name="at URL:"> - ホームURL: - </text> - <button label="è¨å®š..." label_selected="è¨å®š..." name="set_media_url"/> - <text name="CurrentURL:"> - ç¾åœ¨ã® URL: - </text> - <button label="リセット..." label_selected="リセット..." name="reset_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="ï¼»å†ç”Ÿï¼½/ï¼»ãƒãƒ¼ãƒ‰ï¼½ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•れるテã‚スト"/> - <text name="Media texture:"> - テクスム-ãƒ£å–æ›¿ï¼š - </text> - <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> - <text name="replace_texture_help" width="290"> - ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ãƒ—レイをクリックã™ã‚‹ã¨ã€ãƒ ービーや Web ページを表示ã—ã¾ã™ã€‚ - -テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </text> - <check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•れã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/> - <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> - サイズ: - </text> - <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> - <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> - <text name="pixels"> - ピクセル - </text> - <text name="Options:"> - オプション: - </text> - <check_box label="ループ" name="media_loop" tool_tip="メディアをループå†ç”Ÿã—ã¾ã™ã€‚ メディアã®å†ç”ŸãŒçµ‚ã‚ã£ãŸã‚‰ã€æœ€åˆã‹ã‚‰å†ç”Ÿã—ç›´ã—ã¾ã™ã€‚"/> - </panel> - <panel label="オーディオ" name="land_audio_panel"> - <text name="MusicURL:"> - 音楽 URL: - </text> - <text name="Sound:"> - サウンド: - </text> - <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"/> - </panel> - <panel label="アクセス" name="land_access_panel"> - <panel.string name="estate_override"> - 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨å®šã•れã¦ã„ã¾ã™ã€‚ - </panel.string> - <text name="Limit access to this parcel to:"> - ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ - </text> - <check_box label="パブリック・アクセスを許å¯" name="public_access"/> - <text name="Only Allow"> - 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ブãƒãƒƒã‚¯ï¼š - </text> - <check_box label="Linden Labã«æ”¯æ‰•ã„æƒ…å ±ã‚’ç™»éŒ²ã—ã¦ã„ãªã„ä½äºº" name="limit_payment" tool_tip="æ”¯æ‰•ã„æƒ…å ±æœªç¢ºèªã®ä½äººã‚’排除ã™ã‚‹"/> - <check_box label="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„æˆäººã®ä½äºº" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã‚’ç¦æ¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…å ±ã¯ [SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/> - <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"/> - </combo_box> - <spinner label="ä¾¡æ ¼ï¼ˆL$):" name="PriceSpin"/> - <spinner label="アクセス時間:" name="HoursSpin"/> - <text label="常ã«è¨±å¯" name="AllowedText"> - 許å¯ã•れãŸä½äºº - </text> - <name_list name="AccessList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> - <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_allowed"/> - <button label="削除" label_selected="削除" name="remove_allowed"/> - <text label="ç¦æ¢" name="BanCheck"> - ç¦æ¢ã•れãŸä½äºº - </text> - <name_list name="BannedList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> - <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_banned"/> - <button label="削除" label_selected="削除" name="remove_banned"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterland" title="åœŸåœ°æƒ…å ±"> + <floater.string name="Minutes"> + [MINUTES] 分 + </floater.string> + <floater.string name="Minute"> + 分 + </floater.string> + <floater.string name="Seconds"> + [SECONDS] ç§’ + </floater.string> + <tab_container name="landtab"> + <panel label="一般" name="land_general_panel"> + <panel.string name="new users only"> + æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ + </panel.string> + <panel.string name="anyone"> + 誰ã§ã‚‚ + </panel.string> + <panel.string name="area_text"> + é¢ç©ï¼š + </panel.string> + <panel.string name="area_size_text"> + [AREA]平方メートル + </panel.string> + <panel.string name="auction_id_text"> + オークション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"> + プãƒãƒ•ィール... + </panel.string> + <panel.string name="info_text"> + æƒ…å ±... + </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> + <text name="Name:"> + åå‰ï¼š + </text> + <line_editor name="Name"/> + <text name="Description:"> + 説明: + </text> + <text name="LandType"> + 種類: + </text> + <text name="LandTypeText"> + メインランド/ホームステッド + </text> + <text name="ContentRating"> + 区分: + </text> + <text name="ContentRatingText"> + Adult + </text> + <text name="Owner:"> + オーナー: + </text> + <text name="OwnerText"> + Leyla Linden + </text> + <button label="プãƒãƒ•ィール..." label_selected="プãƒãƒ•ィール..." name="Profile..."/> + <text name="Group:"> + グループ: + </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="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れるã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/> + <text name="For Sale:"> + è²©å£²ã®æœ‰ç„¡ï¼š + </text> + <text name="Not for sale."> + 販売対象外 + </text> + <text name="For Sale: Price L$[PRICE]."> + ä¾¡æ ¼ï¼š L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル) + </text> + <button label="土地を販売..." label_selected="土地を販売..." name="Sell Land..."/> + <text name="For sale to"> + 販売先:[BUYER] + </text> + <text name="Sell with landowners objects in parcel."> + ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚‚è²©å£²ä¾¡æ ¼ã«å«ã¾ã‚Œã¾ã™ + </text> + <text name="Selling with no objects in parcel."> + オブジェクトã¯è²©å£²å¯¾è±¡å¤–ã§ã™ + </text> + <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/> + <text name="Claimed:"> + å–得日時: + </text> + <text name="DateClaimText"> + 2006å¹´8月15æ—¥ç«æ›œæ—¥13:47:25 + </text> + <text name="PriceLabel"> + é¢ç©ï¼š + </text> + <text name="PriceText"> + 4048平方メートル + </text> + <text name="Traffic:"> + 交通é‡: + </text> + <text name="DwellText"> + 誤 + </text> + <button label="土地を購入..." label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/> + <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="土地を放棄..." name="Abandon Land..."/> + <button label="土地ã®è¿”é‚„ã‚’è¦æ±‚..." label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/> + <button label="Lindenセール..." 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"> + ä¸å‹•産: + </text> + <text name="estate_name_lbl"> + åå‰ï¼š + </text> + <text name="estate_name_text"> + メインランド + </text> + <text name="estate_owner_lbl"> + オーナー: + </text> + <text name="estate_owner_text"> + (ãªã—) + </text> + <text_editor name="covenant_editor"> + ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 + </text_editor> + <text name="covenant_timestamp_text"> + æœ€å¾Œã®æ›´æ–°1969å¹´12月31日水曜日16:00:00 + </text> + <text font="SansSerifLarge" name="region_section_lbl"> + 地域: + </text> + <text name="region_name_lbl"> + åå‰ï¼š + </text> + <text name="region_name_text"> + Leyla + </text> + <text name="region_landtype_lbl"> + 種類: + </text> + <text name="region_landtype_text"> + メインランド/ホームステッド + </text> + <text name="region_maturity_lbl"> + 区分: + </text> + <text name="region_maturity_text"> + Adult + </text> + <text name="resellable_lbl"> + å†è²©ï¼š + </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]利用å¯èƒ½ï¼‰ + </panel.string> + <panel.string left="200" name="objects_deleted_text"> + [MAX]ã®å†…[COUNT]([DELETED]を削除) + </panel.string> + <text name="parcel_object_bonus"> + 地域オブジェクトボーナスè¦å› : [BONUS] + </text> + <text name="Simulator primitive usage:" width="500"> + 地域全体ã®ãƒ—リム使用状æ³ï¼š + </text> + <text left="200" name="objects_available"> + [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ + </text> + <text name="Primitives parcel supports:" width="200"> + 区画ã§ã‚µãƒãƒ¼ãƒˆã•れるプリム数: + </text> + <text left="200" name="object_contrib_text"> + [COUNT] + </text> + <text name="Primitives on parcel:"> + 区画上ã®ãƒ—リム数: + </text> + <text left="200" name="total_objects_text"> + [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="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <text name="Set to group:"> + グループã«è¨å®šï¼š + </text> + <text left="200" name="group_objects_text"> + [COUNT] + </text> + <button label="表示" label_selected="表示" name="ShowGroup" right="-145"/> + <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="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <text name="Selected / sat upon:"> + é¸æŠžæ¸ˆã¿ï¼æ±ºå®šæ¸ˆã¿ï¼š + </text> + <text left="200" name="selected_objects_text"> + [COUNT] + </text> + <text name="Autoreturn" width="500"> + ä»–ã®ä½äººã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´(分ã€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"/> + <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="mostrecent"/> + </name_list> + </panel> + <panel label="オプション" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹ + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + 区画é¢ç©ãŒ128平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ +大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ + </panel.string> + <panel.string name="mature_check_mature"> + Matureコンテンツ + </panel.string> + <panel.string name="mature_check_adult"> + Adultコンテンツ + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Matureã¨ã•れã¦ã„ã¾ã™ã€‚ + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯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> + <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"> + オブジェクトã®é€²å…¥ï¼š + </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"> + スクリプトã®å®Ÿè¡Œï¼š + </text> + <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="check other scripts"/> + <check_box label="グループ" left="380" 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="æ¤œç´¢çµæžœã§ã“ã®åŒºç”»ã‚’表示ã•ã›ã‚‹"/> + <combo_box name="land category with adult"> + <combo_box.item label="全カテゴリ" name="item0"/> + <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"/> + <combo_box.item label="教育的" name="item5"/> + <combo_box.item label="ゲーム" name="item6"/> + <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/> + <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/> + <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/> + <combo_box.item label="ä½å®…用" name="item10"/> + <combo_box.item label="ショッピング" name="item11"/> + <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="item3"/> + <combo_box.item label="ビジãƒã‚¹" name="item4"/> + <combo_box.item label="教育的" name="item5"/> + <combo_box.item label="ゲーム" name="item6"/> + <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/> + <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/> + <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/> + <combo_box.item label="ä½å®…用" name="item10"/> + <combo_box.item label="ショッピング" name="item11"/> + <combo_box.item label="ãã®ä»–" name="item12"/> + </combo_box> + <check_box label="Matureコンテンツ" name="MatureCheck" tool_tip=""/> + <text name="Snapshot:"> + スナップショット: + </text> + <texture_picker label="" left="116" 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="Teleport Routing -- select how to handle teleports onto your land."> + <combo_box.item label="ä¸å¯" name="Blocked"/> + <combo_box.item label="ç€åœ°ç‚¹" name="LandingPoint"/> + <combo_box.item label="ã©ã“ã§ã‚‚" name="Anywhere"/> + </combo_box> + </panel> + <panel label="メディア" name="land_media_panel"> + <text name="with media:"> + 種類: + </text> + <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/> + <text name="at URL:"> + ホームURL: + </text> + <button label="è¨å®š..." label_selected="è¨å®š..." name="set_media_url"/> + <text name="CurrentURL:"> + ç¾åœ¨ã® URL: + </text> + <button label="リセット..." label_selected="リセット..." name="reset_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="ï¼»å†ç”Ÿï¼½/ï¼»ãƒãƒ¼ãƒ‰ï¼½ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•れるテã‚スト"/> + <text name="Media texture:"> + テクスム+ãƒ£å–æ›¿ï¼š + </text> + <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <text name="replace_texture_help" width="290"> + ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ãƒ—レイをクリックã™ã‚‹ã¨ã€ãƒ ービーや Web ページを表示ã—ã¾ã™ã€‚ + +テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </text> + <check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•れã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/> + <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> + サイズ: + </text> + <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <text name="pixels"> + ピクセル + </text> + <text name="Options:"> + オプション: + </text> + <check_box label="ループ" name="media_loop" tool_tip="メディアをループå†ç”Ÿã—ã¾ã™ã€‚ メディアã®å†ç”ŸãŒçµ‚ã‚ã£ãŸã‚‰ã€æœ€åˆã‹ã‚‰å†ç”Ÿã—ç›´ã—ã¾ã™ã€‚"/> + </panel> + <panel label="オーディオ" name="land_audio_panel"> + <text name="MusicURL:"> + 音楽 URL: + </text> + <text name="Sound:"> + サウンド: + </text> + <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"/> + </panel> + <panel label="アクセス" name="land_access_panel"> + <panel.string name="estate_override"> + 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨å®šã•れã¦ã„ã¾ã™ã€‚ + </panel.string> + <text name="Limit access to this parcel to:"> + ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ + </text> + <check_box label="パブリック・アクセスを許å¯" name="public_access"/> + <text name="Only Allow"> + 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ブãƒãƒƒã‚¯ï¼š + </text> + <check_box label="Linden Labã«æ”¯æ‰•ã„æƒ…å ±ã‚’ç™»éŒ²ã—ã¦ã„ãªã„ä½äºº" name="limit_payment" tool_tip="æ”¯æ‰•ã„æƒ…å ±æœªç¢ºèªã®ä½äººã‚’排除ã™ã‚‹"/> + <check_box label="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„æˆäººã®ä½äºº" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã‚’ç¦æ¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…å ±ã¯ [SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/> + <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"/> + </combo_box> + <spinner label="ä¾¡æ ¼ï¼ˆL$):" name="PriceSpin"/> + <spinner label="アクセス時間:" name="HoursSpin"/> + <text label="常ã«è¨±å¯" name="AllowedText"> + 許å¯ã•れãŸä½äºº + </text> + <name_list name="AccessList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> + <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_allowed"/> + <button label="削除" label_selected="削除" name="remove_allowed"/> + <text label="ç¦æ¢" name="BanCheck"> + ç¦æ¢ã•れãŸä½äºº + </text> + <name_list name="BannedList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> + <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_banned"/> + <button label="削除" label_selected="削除" name="remove_banned"/> + </panel> + </tab_container> +</floater> 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 1bc12b839cea273f9e2d18eef0ac61318b1c60a5..a1c30ec5726bebfb671d308f003a3ec18c4d8e4f 100644 --- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml @@ -1,183 +1,183 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Animation Preview" title=""> - <floater.string name="failed_to_initialize"> - ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—㟠- </floater.string> - <floater.string name="anim_too_long"> - アニメーションファイルã®é•·ã•ã¯[LENGTH]ç§’ã§ã™ã€‚ - -ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®æœ€å¤§ã®é•·ã•ã¯[MAX_LENGTH]ç§’ã§ã™ã€‚ - </floater.string> - <floater.string name="failed_file_read"> - アニメーションファイルをèªã¿å–れã¾ã›ã‚“。 - -[STATUS] - </floater.string> - <floater.string name="E_ST_OK"> - Ok - </floater.string> - <floater.string name="E_ST_EOF"> - ä¸å®Œå…¨ãªãƒ•ァイル。 - </floater.string> - <floater.string name="E_ST_NO_CONSTRAINT"> - 制約定義をèªã¿ã¨ã‚Œã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_FILE"> - BVH ファイルを開ã‘ã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_HIER"> - 無効㪠HIERARCHY ヘッダーã§ã™ã€‚. - </floater.string> - <floater.string name="E_ST_NO_JOINT"> - ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_NAME"> - JOINT ãƒãƒ¼ãƒ ã‚’å–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_OFFSET"> - OFFSET ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_CHANNELS"> - CHANNELS ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_ROTATION"> - å›žè»¢é †åºã‚’å–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_AXIS"> - 回転軸をå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_MOTION"> - MOTION ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_FRAMES"> - フレーム数をå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_FRAME_TIME"> - フレームタイムをå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_POS"> - ãƒã‚¸ã‚·ãƒ§ãƒ³å€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_ROT"> - 回転値をå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_XLT_FILE"> - Cannot open translation file. - </floater.string> - <floater.string name="E_ST_NO_XLT_HEADER"> - Cannot read translation header. - </floater.string> - <floater.string name="E_ST_NO_XLT_NAME"> - Cannot read translation names. - </floater.string> - <floater.string name="E_ST_NO_XLT_IGNORE"> - Cannot read translation ignore value. - </floater.string> - <floater.string name="E_ST_NO_XLT_RELATIVE"> - Cannot read translation relative value. - </floater.string> - <floater.string name="E_ST_NO_XLT_OUTNAME"> - Cannot read translation outname value. - </floater.string> - <floater.string name="E_ST_NO_XLT_MATRIX"> - Cannot read translation matrix. - </floater.string> - <floater.string name="E_ST_NO_XLT_MERGECHILD"> - Mergechild åã‚’å–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_XLT_MERGEPARENT"> - Mergeparent åã‚’å–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_XLT_PRIORITY"> - プãƒãƒ‘ティ値をå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_XLT_LOOP"> - ループ値をå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_XLT_EASEIN"> - Cannot get easeIn values. - </floater.string> - <floater.string name="E_ST_NO_XLT_EASEOUT"> - easeOut 値をå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_XLT_HAND"> - Hand morph 値をå–å¾—ã§ãã¾ã›ã‚“。 - </floater.string> - <floater.string name="E_ST_NO_XLT_EMOTE"> - エモートåã‚’èªã¿ã¨ã‚Œã¾ã›ã‚“。 - </floater.string> - <text name="name_label"> - åå‰ï¼š - </text> - <text name="description_label"> - 説明: - </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"/> - <text name="hand_label"> - 手ã®å‹•ã - </text> - <combo_box label="" name="hand_pose_combo" tool_tip="ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®æ‰‹ã®å‹•ãをコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> - <combo_box.item label="広ãŒã‚‹" name="Spread"/> - <combo_box.item label="リラックス" name="Relaxed"/> - <combo_box.item label="両方を指ã™" name="PointBoth"/> - <combo_box.item label="拳" name="Fist"/> - <combo_box.item label="リラックス左" name="RelaxedLeft"/> - <combo_box.item label="左を指ã™" name="PointLeft"/> - <combo_box.item label="拳左" name="FistLeft"/> - <combo_box.item label="リラックスå³" name="RelaxedRight"/> - <combo_box.item label="å³ã‚’指ã™" name="PointRight"/> - <combo_box.item label="拳å³" name="FistRight"/> - <combo_box.item label="敬礼å³" name="SaluteRight"/> - <combo_box.item label="入力ã™ã‚‹" name="Typing"/> - <combo_box.item label="ピース・サインå³" name="PeaceRight"/> - </combo_box> - <text name="emote_label"> - è¡¨ç¾ - </text> - <combo_box label="" name="emote_combo" tool_tip="アニメーションã®é¡”を表情をコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> - <combo_box.item label="None]" 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"/> - </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"/> - </combo_box> - <spinner label="フェーズイï¾(ç§’)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンド・イン時間(秒)"/> - <spinner label="フェーズアウト(ç§’)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンド・アウト時間(秒)"/> - <button label="" name="play_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="å–り消ã—" name="cancel_btn"/> - <button label="アップロードL$[AMOUNT]" name="ok_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + ãƒ¢ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—㟠+ </floater.string> + <floater.string name="anim_too_long"> + アニメーションファイルã®é•·ã•ã¯[LENGTH]ç§’ã§ã™ã€‚ + +ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®æœ€å¤§ã®é•·ã•ã¯[MAX_LENGTH]ç§’ã§ã™ã€‚ + </floater.string> + <floater.string name="failed_file_read"> + アニメーションファイルをèªã¿å–れã¾ã›ã‚“。 + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + Ok + </floater.string> + <floater.string name="E_ST_EOF"> + ä¸å®Œå…¨ãªãƒ•ァイル。 + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + 制約定義をèªã¿ã¨ã‚Œã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_FILE"> + BVH ファイルを開ã‘ã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_HIER"> + 無効㪠HIERARCHY ヘッダーã§ã™ã€‚. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_NAME"> + JOINT ãƒãƒ¼ãƒ ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + OFFSET ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + CHANNELS ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + å›žè»¢é †åºã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + 回転軸をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + MOTION ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + フレーム数をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + フレームタイムをå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_POS"> + ãƒã‚¸ã‚·ãƒ§ãƒ³å€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_ROT"> + 回転値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + Cannot open translation file. + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Cannot read translation header. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Cannot read translation names. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Cannot read translation ignore value. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Cannot read translation relative value. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Cannot read translation outname value. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Cannot read translation matrix. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Mergechild åã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Mergeparent åã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + プãƒãƒ‘ティ値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + ループ値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + Cannot get easeIn values. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + easeOut 値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Hand morph 値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + エモートåã‚’èªã¿ã¨ã‚Œã¾ã›ã‚“。 + </floater.string> + <text name="name_label"> + åå‰ï¼š + </text> + <text name="description_label"> + 説明: + </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"/> + <text name="hand_label"> + 手ã®å‹•ã + </text> + <combo_box label="" name="hand_pose_combo" tool_tip="ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®æ‰‹ã®å‹•ãをコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> + <combo_box.item label="広ãŒã‚‹" name="Spread"/> + <combo_box.item label="リラックス" name="Relaxed"/> + <combo_box.item label="両方を指ã™" name="PointBoth"/> + <combo_box.item label="拳" name="Fist"/> + <combo_box.item label="リラックス左" name="RelaxedLeft"/> + <combo_box.item label="左を指ã™" name="PointLeft"/> + <combo_box.item label="拳左" name="FistLeft"/> + <combo_box.item label="リラックスå³" name="RelaxedRight"/> + <combo_box.item label="å³ã‚’指ã™" name="PointRight"/> + <combo_box.item label="拳å³" name="FistRight"/> + <combo_box.item label="敬礼å³" name="SaluteRight"/> + <combo_box.item label="入力ã™ã‚‹" name="Typing"/> + <combo_box.item label="ピース・サインå³" name="PeaceRight"/> + </combo_box> + <text name="emote_label"> + è¡¨ç¾ + </text> + <combo_box label="" name="emote_combo" tool_tip="アニメーションã®é¡”を表情をコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> + <combo_box.item label="None]" 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"/> + </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"/> + </combo_box> + <spinner label="フェーズイï¾(ç§’)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンド・イン時間(秒)"/> + <spinner label="フェーズアウト(ç§’)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンド・アウト時間(秒)"/> + <button label="" name="play_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="å–り消ã—" name="cancel_btn"/> + <button label="アップロードL$[AMOUNT]" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml index eebc7eb88e6a4218b26f0cb88e7e17a1e1f9c3f8..df60f52ee8e047f818777888d00f9aa9ddb74107 100644 --- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater min_width="275" name="avatarpicker" title="ä½äººã‚’é¸æŠž" width="275"> - <tab_container name="ResidentChooserTabs" width="265"> - <panel label="検索" name="SearchPanel" width="145"> - <text name="InstructSearchResidentName"> - åå‰ã®ä¸€éƒ¨ã‚’入力: - </text> - <button label="検索" label_selected="検索" name="Find"/> - </panel> - <panel label="コーリングカード" name="CallingCardsPanel" width="145"> - <text name="InstructSelectCallingCard"> - ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é¸æŠžï¼š - </text> - </panel> - <panel label="自分ã®è¿‘ã" name="NearMePanel" width="145"> - <text name="InstructSelectResident"> - è¿‘ãã®äººã‚’é¸æŠžï¼š - </text> - <button label="リスト更新" label_selected="リスト更新" name="Refresh"/> - <slider label="範囲" name="near_me_range"/> - <text name="meters" width="50"> - メートル - </text> - </panel> - </tab_container> - <button label="OK" label_selected="OK" name="Select"/> - <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> - <string name="not_found"> - 「[TEXT]ã€ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠- </string> - <string name="no_one_near"> - è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“ - </string> - <string name="no_results"> - æ¤œç´¢çµæžœï¼šã‚¼ãƒ - </string> - <string name="searching"> - 検索ä¸... - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater min_width="275" name="avatarpicker" title="ä½äººã‚’é¸æŠž" width="275"> + <tab_container name="ResidentChooserTabs" width="265"> + <panel label="検索" name="SearchPanel" width="145"> + <text name="InstructSearchResidentName"> + åå‰ã®ä¸€éƒ¨ã‚’入力: + </text> + <button label="検索" label_selected="検索" name="Find"/> + </panel> + <panel label="コーリングカード" name="CallingCardsPanel" width="145"> + <text name="InstructSelectCallingCard"> + ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é¸æŠžï¼š + </text> + </panel> + <panel label="自分ã®è¿‘ã" name="NearMePanel" width="145"> + <text name="InstructSelectResident"> + è¿‘ãã®äººã‚’é¸æŠžï¼š + </text> + <button label="リスト更新" label_selected="リスト更新" name="Refresh"/> + <slider label="範囲" name="near_me_range"/> + <text name="meters" width="50"> + メートル + </text> + </panel> + </tab_container> + <button label="OK" label_selected="OK" name="Select"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> + <string name="not_found"> + 「[TEXT]ã€ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+ </string> + <string name="no_one_near"> + è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“ + </string> + <string name="no_results"> + æ¤œç´¢çµæžœï¼šã‚¼ãƒ + </string> + <string name="searching"> + 検索ä¸... + </string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml index 4e89e11d0d2c3158179414e7f34e789f59455ddd..d2f4798949f49d33ec75dbc78a2b1eeb72b8474a 100644 --- a/indra/newview/skins/default/xui/ja/floater_beacons.xml +++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml @@ -1,21 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="ビーコン(標è˜ï¼‰"> - <panel name="beacons_panel"> - <text name="label_show"> - 表示: - </text> - <check_box label="ビーコン(標è˜ï¼‰" name="beacons"/> - <check_box label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="highlights"/> - <text name="beacon_width_label" tool_tip="ビーコン(標è˜ï¼‰ã®å¹…"> - 幅: - </text> - <text name="label_objects"> - 対象オブジェクト: - </text> - <check_box label="物ç†çš„" name="physical"/> - <check_box label="スクリプト" name="scripted"/> - <check_box label="触れる" name="touch_only"/> - <check_box label="音æº" name="sounds"/> - <check_box label="パーティクルæº" name="particles"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="beacons" title="ビーコン(標è˜ï¼‰"> + <panel name="beacons_panel"> + <text name="label_show"> + 表示: + </text> + <check_box label="ビーコン(標è˜ï¼‰" name="beacons"/> + <check_box label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="highlights"/> + <text name="beacon_width_label" tool_tip="ビーコン(標è˜ï¼‰ã®å¹…"> + 幅: + </text> + <text name="label_objects"> + 対象オブジェクト: + </text> + <check_box label="物ç†çš„" name="physical"/> + <check_box label="スクリプト" name="scripted"/> + <check_box label="触れる" name="touch_only"/> + <check_box label="音æº" name="sounds"/> + <check_box label="パーティクルæº" name="particles"/> + </panel> +</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 8b5e88fa7f499c981fe9268a894046621e3ff299..02bc0dd5f775fc566271bc48cf19a638c9421f92 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"/> - <check_box label="横æ–é¢ã‚’表示" name="GridCrossSection"/> - <text name="grid_opacity_label" tool_tip="グリッドã®é€æ˜Žåº¦"> - 逿˜Žåº¦ï¼š - </text> - <slider label="グリッドã®ä¸é€æ˜Žåº¦" name="GridOpacity"/> -</floater> +<?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"/> + <check_box label="横æ–é¢ã‚’表示" name="GridCrossSection"/> + <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 b86a3647fe3609148efd2af73ee1a25f3abb4af6..9a3d432228d108db03462afffb94d2a5e38628d7 100644 --- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml @@ -1,53 +1,53 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="コンテンツ権é™ã‚’編集"> - <floater.string name="nothing_to_modify_text"> - é¸æŠžã—ãŸä¸ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™ - </floater.string> - <floater.string name="status_text"> - [NAME]ã«æ¨©é™ã‚’è¨å®šä¸ã§ã™ã€‚ - </floater.string> - <floater.string name="start_text"> - 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã—ã¦ã„ã¾ã™ - </floater.string> - <floater.string name="done_text"> - 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå®Œäº†ã—ã¾ã—㟠- </floater.string> - <check_box label="アニメーション" name="check_animation"/> - <icon name="icon_animation" tool_tip="アニメーション"/> - <check_box label="身体部ä½" name="check_bodypart"/> - <icon name="icon_bodypart" tool_tip="身体部ä½"/> - <check_box label="æœ" name="check_clothing"/> - <icon name="icon_clothing" tool_tip="衣類"/> - <check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture"/> - <icon name="icon_gesture" tool_tip="ジェスãƒãƒ£ãƒ¼"/> - <check_box label="ノートカード" name="check_notecard"/> - <icon name="icon_notecard" tool_tip="ノートカード"/> - <check_box label="オブジェクト" name="check_object"/> - <icon name="icon_object" tool_tip="オブジェクト"/> - <check_box label="スクリプト" name="check_script"/> - <icon name="icon_script" tool_tip="スクリプト"/> - <check_box label="サウンド" name="check_sound"/> - <icon name="icon_sound" tool_tip="サウンド"/> - <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/> - <button label="√ ã™ã¹ã¦" label_selected="å…¨ã¦" name="check_all"/> - <button label="クリア" label_selected="ãªã—" name="check_none"/> - <text name="newperms"> - æ–°ã—ã„ã‚³ãƒ³ãƒ†ãƒ³ãƒ„æ¨©é™ - </text> - <text name="GroupLabel"> - グループ: - </text> - <check_box label="共有" name="share_with_group"/> - <text name="AnyoneLabel"> - ã™ã¹ã¦ã®äººï¼š - </text> - <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 initial_value="true" label="å†è²©/プレゼント" name="next_owner_transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> - <button label="OK" name="apply"/> - <button label="ã‚ャンセル" name="close"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterbulkperms" title="コンテンツ権é™ã‚’編集"> + <floater.string name="nothing_to_modify_text"> + é¸æŠžã—ãŸä¸ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™ + </floater.string> + <floater.string name="status_text"> + [NAME]ã«æ¨©é™ã‚’è¨å®šä¸ã§ã™ã€‚ + </floater.string> + <floater.string name="start_text"> + 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã—ã¦ã„ã¾ã™ + </floater.string> + <floater.string name="done_text"> + 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå®Œäº†ã—ã¾ã—㟠+ </floater.string> + <check_box label="アニメーション" name="check_animation"/> + <icon name="icon_animation" tool_tip="アニメーション"/> + <check_box label="身体部ä½" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="身体部ä½"/> + <check_box label="æœ" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="衣類"/> + <check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture"/> + <icon name="icon_gesture" tool_tip="ジェスãƒãƒ£ãƒ¼"/> + <check_box label="ノートカード" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="ノートカード"/> + <check_box label="オブジェクト" name="check_object"/> + <icon name="icon_object" tool_tip="オブジェクト"/> + <check_box label="スクリプト" name="check_script"/> + <icon name="icon_script" tool_tip="スクリプト"/> + <check_box label="サウンド" name="check_sound"/> + <icon name="icon_sound" tool_tip="サウンド"/> + <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/> + <button label="√ ã™ã¹ã¦" label_selected="å…¨ã¦" name="check_all"/> + <button label="クリア" label_selected="ãªã—" name="check_none"/> + <text name="newperms"> + æ–°ã—ã„ã‚³ãƒ³ãƒ†ãƒ³ãƒ„æ¨©é™ + </text> + <text name="GroupLabel"> + グループ: + </text> + <check_box label="共有" name="share_with_group"/> + <text name="AnyoneLabel"> + ã™ã¹ã¦ã®äººï¼š + </text> + <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 initial_value="true" label="å†è²©/プレゼント" name="next_owner_transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> + <button label="OK" name="apply"/> + <button label="ã‚ャンセル" name="close"/> +</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 fc0418f8088061bb5cf44394128a940a8e8ef67e..f807e9157365648f444a5ef3aed8391d930d2f60 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml @@ -1,26 +1,26 @@ -<?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]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ - </text> - <button label="å–æ¶ˆ" label_selected="å–æ¶ˆ" name="cancel_btn"/> - <button label="購入" label_selected="購入" name="buy_btn"/> - <text name="title_buy_text"> - 購入 - </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> +<?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]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ + </text> + <button label="å–æ¶ˆ" label_selected="å–æ¶ˆ" name="cancel_btn"/> + <button label="購入" label_selected="購入" name="buy_btn"/> + <text name="title_buy_text"> + 購入 + </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 06e42a29d9b0224cbfeb2e731fdbf86216353a8e..7e32e5b3c5b357827fcafdb134e2afe9e0d5d57d 100644 --- a/indra/newview/skins/default/xui/ja/floater_camera.xml +++ b/indra/newview/skins/default/xui/ja/floater_camera.xml @@ -1,23 +1,23 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="camera_floater"> - <floater.string name="rotate_tooltip"> - フォーカスをä¸å¿ƒã«ã‚«ãƒ¡ãƒ©ã‚’回転 - </floater.string> - <floater.string name="zoom_tooltip"> - フォーカスã«å‘ã‘ã¦ã‚«ãƒ¡ãƒ©ã‚’ズーム- </floater.string> - <floater.string name="move_tooltip"> - カメラを上下左å³ã«ç§»å‹• - </floater.string> - <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«ç§»å‹•"/> - <joystick_zoom name="zoom" tool_tip="å‘ã„ã¦ã‚‹æ–¹æ³•ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/> - <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/> - </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="オブジェクトを見る"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + フォーカスをä¸å¿ƒã«ã‚«ãƒ¡ãƒ©ã‚’回転 + </floater.string> + <floater.string name="zoom_tooltip"> + フォーカスã«å‘ã‘ã¦ã‚«ãƒ¡ãƒ©ã‚’ズーム+ </floater.string> + <floater.string name="move_tooltip"> + カメラを上下左å³ã«ç§»å‹• + </floater.string> + <panel name="controls"> + <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«ç§»å‹•"/> + <joystick_zoom name="zoom" tool_tip="å‘ã„ã¦ã‚‹æ–¹æ³•ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/> + <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/> + </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="オブジェクトを見る"/> + </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 cd871f721432a5833cbf203a1d581b06182eaf76..d041f44e085226d6d02d466e228dd74a42b737a1 100644 --- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml @@ -1,31 +1,31 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="カラー・ピッカー"> - <text name="r_val_text"> - 赤: - </text> - <text name="g_val_text"> - 緑: - </text> - <text name="b_val_text"> - é’: - </text> - <text name="h_val_text"> - 色相: - </text> - <text name="s_val_text"> - 色調: - </text> - <text name="l_val_text"> - è¼åº¦ï¼š - </text> - <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="é¸æŠž" name="select_btn"/> - <text name="Current color:"> - ç¾åœ¨ã®è‰²ï¼š - </text> - <text name="(Drag below to save.)"> - ドラッグã—ã¦ä¿å˜ - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="ColorPicker" title="カラー・ピッカー"> + <text name="r_val_text"> + 赤: + </text> + <text name="g_val_text"> + 緑: + </text> + <text name="b_val_text"> + é’: + </text> + <text name="h_val_text"> + 色相: + </text> + <text name="s_val_text"> + 色調: + </text> + <text name="l_val_text"> + è¼åº¦ï¼š + </text> + <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="é¸æŠž" name="select_btn"/> + <text name="Current color:"> + ç¾åœ¨ã®è‰²ï¼š + </text> + <text name="(Drag below to save.)"> + ドラッグã—ã¦ä¿å˜ + </text> +</floater> 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 e21b06988c3158fc5de9463bb87176ed1a698a8d..25de45c09446e81b141826012127db4d3315a616 100644 --- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml @@ -1,97 +1,97 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<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> - <check_box label="準備" name="check prelude" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚"/> - <check_box label="太陽固定" name="check fixed sun" tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•産]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰"/> - <check_box label="テレãƒãƒ¼ãƒˆã®ãƒ›ãƒ¼ãƒ をリセット" name="check reset home" tool_tip="ä½äººãŒãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§åŽ»ã£ãŸã¨ãã€å½¼ã‚‰ã®ãƒ›ãƒ¼ãƒ を目的地ã«ãƒªã‚»ãƒƒãƒˆã™ã‚‹ã€‚"/> - <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="is sandbox" tool_tip="ã“れãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ"/> - <button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹" name="Bake Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å˜ã—ã¾ã™ã€‚"/> - <button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/> - <button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚"/> - <text name="estate id"> - ä¸å‹•産ID: - </text> - <text name="parent id"> - 親ID: - </text> - <line_editor name="parentestate" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®è¦ªä¸å‹•産ã§ã™ã€‚"/> - <text name="Grid Pos: "> - グリッドä½ç½®ï¼š - </text> - <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$: - </text> - <button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" tool_tip="ä¸Šè¨˜ã®æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> - <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> - <button label="åœ°åŸŸã‚’é¸æŠž" label_selected="åœ°åŸŸã‚’é¸æŠž" name="Select Region" tool_tip="土地ツールã§åœ°åŸŸå…¨ä½“ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> - <button label="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" label_selected="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" name="Autosave now" tool_tip="Gzip状態を自動ä¿å˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å˜ã—ã¾ã™ã€‚"/> - </panel> - <panel label="オブジェクト" name="objects"> - <panel.string name="no_target"> - (ターゲットãªã—) - </panel.string> - <text name="Sim Name:"> - シムå: - </text> - <text name="region name"> - ウェルシュ - </text> - <check_box label="スクリプトを無効化" name="disable scripts" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/> - <check_box label="è¡çªã‚’無効化" name="disable collisions" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®éžã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆè¡çªã‚’無効化"/> - <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable physics" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ç‰©ç†çš„作用をã™ã¹ã¦ç„¡åŠ¹åŒ–"/> - <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> - <button label="対象ã®è¨å®š" label_selected="対象ã®è¨å®š" name="Set Target" tool_tip="オブジェクト削除ã®å¯¾è±¡ã¨ãªã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚’è¨å®šã—ã¦ãã ã•ã„。"/> - <text name="target_avatar_name"> - (対象ãªã—) - </text> - <button label="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target's Scripted Objects On Others Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„ãªã„スクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/> - <button label="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るスクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/> - <button label="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" label_selected="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" name="Delete *ALL* Of Target's Objects" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/> - <button label="トップ・コライダーをå–å¾—" label_selected="トップ・コライダーをå–å¾—" name="Get Top Colliders" tool_tip="最も段階ã®ç‹ã„コールãƒãƒƒã‚¯ãŒç™ºç”Ÿã—ãŸã‚ªãƒ–ジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> - <button label="トップ・スクリプトをå–å¾—" label_selected="トップ・スクリプトをå–å¾—" name="Get Top Scripts" tool_tip="スクリプトã®èµ·å‹•ã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> - <button label="スクリプト・ダイジェスト" label_selected="スクリプト・ダイジェスト" name="Scripts digest" tool_tip="ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トã¨ãれらã®ä½¿ç”¨å›žæ•°ã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> - </panel> - <panel label="è¦æ±‚" name="request"> - <text name="Destination:"> - 目的地: - </text> - <combo_box name="destination"> - <combo_box.item label="é¸æŠž" name="item1"/> - <combo_box.item label="エージェント地域" name="item2"/> - </combo_box> - <text name="Request:"> - è¦æ±‚: - </text> - <combo_box name="request"> - <combo_box.item label="コライダー<ステップ>" name="item1"/> - <combo_box.item label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>" name="item2"/> - <combo_box.item label="オブジェクト<パターン>" name="item3"/> - <combo_box.item label="rez <asset_id>" name="item4"/> - </combo_box> - <text name="Parameter:"> - パラメーター: - </text> - <button label="リクエストã™ã‚‹" label_selected="リクエストã™ã‚‹" name="Make Request"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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> + <check_box label="準備" name="check prelude" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚"/> + <check_box label="太陽固定" name="check fixed sun" tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•産]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰"/> + <check_box label="テレãƒãƒ¼ãƒˆã®ãƒ›ãƒ¼ãƒ をリセット" name="check reset home" tool_tip="ä½äººãŒãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§åŽ»ã£ãŸã¨ãã€å½¼ã‚‰ã®ãƒ›ãƒ¼ãƒ を目的地ã«ãƒªã‚»ãƒƒãƒˆã™ã‚‹ã€‚"/> + <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="is sandbox" tool_tip="ã“れãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ"/> + <button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹" name="Bake Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å˜ã—ã¾ã™ã€‚"/> + <button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/> + <button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚"/> + <text name="estate id"> + ä¸å‹•産ID: + </text> + <text name="parent id"> + 親ID: + </text> + <line_editor name="parentestate" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®è¦ªä¸å‹•産ã§ã™ã€‚"/> + <text name="Grid Pos: "> + グリッドä½ç½®ï¼š + </text> + <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$: + </text> + <button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" tool_tip="ä¸Šè¨˜ã®æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> + <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> + <button label="åœ°åŸŸã‚’é¸æŠž" label_selected="åœ°åŸŸã‚’é¸æŠž" name="Select Region" tool_tip="土地ツールã§åœ°åŸŸå…¨ä½“ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> + <button label="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" label_selected="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" name="Autosave now" tool_tip="Gzip状態を自動ä¿å˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å˜ã—ã¾ã™ã€‚"/> + </panel> + <panel label="オブジェクト" name="objects"> + <panel.string name="no_target"> + (ターゲットãªã—) + </panel.string> + <text name="Sim Name:"> + シムå: + </text> + <text name="region name"> + ウェルシュ + </text> + <check_box label="スクリプトを無効化" name="disable scripts" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/> + <check_box label="è¡çªã‚’無効化" name="disable collisions" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®éžã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆè¡çªã‚’無効化"/> + <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable physics" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ç‰©ç†çš„作用をã™ã¹ã¦ç„¡åŠ¹åŒ–"/> + <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> + <button label="対象ã®è¨å®š" label_selected="対象ã®è¨å®š" name="Set Target" tool_tip="オブジェクト削除ã®å¯¾è±¡ã¨ãªã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚’è¨å®šã—ã¦ãã ã•ã„。"/> + <text name="target_avatar_name"> + (対象ãªã—) + </text> + <button label="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target's Scripted Objects On Others Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„ãªã„スクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/> + <button label="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るスクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/> + <button label="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" label_selected="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" name="Delete *ALL* Of Target's Objects" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ ï¼ˆã‚³ãƒ”ãƒ¼ç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•れã¾ã™ã€‚"/> + <button label="トップ・コライダーをå–å¾—" label_selected="トップ・コライダーをå–å¾—" name="Get Top Colliders" tool_tip="最も段階ã®ç‹ã„コールãƒãƒƒã‚¯ãŒç™ºç”Ÿã—ãŸã‚ªãƒ–ジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> + <button label="トップ・スクリプトをå–å¾—" label_selected="トップ・スクリプトをå–å¾—" name="Get Top Scripts" tool_tip="スクリプトã®èµ·å‹•ã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> + <button label="スクリプト・ダイジェスト" label_selected="スクリプト・ダイジェスト" name="Scripts digest" tool_tip="ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トã¨ãれらã®ä½¿ç”¨å›žæ•°ã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> + </panel> + <panel label="è¦æ±‚" name="request"> + <text name="Destination:"> + 目的地: + </text> + <combo_box name="destination"> + <combo_box.item label="é¸æŠž" name="item1"/> + <combo_box.item label="エージェント地域" name="item2"/> + </combo_box> + <text name="Request:"> + è¦æ±‚: + </text> + <combo_box name="request"> + <combo_box.item label="コライダー<ステップ>" name="item1"/> + <combo_box.item label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>" name="item2"/> + <combo_box.item label="オブジェクト<パターン>" name="item3"/> + <combo_box.item label="rez <asset_id>" name="item4"/> + </combo_box> + <text name="Parameter:"> + パラメーター: + </text> + <button label="リクエストã™ã‚‹" label_selected="リクエストã™ã‚‹" name="Make Request"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml index 309a35a2a283465aef0afd134d5a76ab505a8f68..a8cc4827c5c2da17b08d76b5dba6bc7c31817455 100644 --- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml @@ -1,28 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢è¨å®š"> - <text name="Filtering:"> - フィルタリング: - </text> - <check_box label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰" name="ani"/> - <text name="Antialiasing:"> - アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°: - </text> - <combo_box label="アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°" name="fsaa"> - <combo_box.item label="無効" 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="ガンマ:" name="gamma"/> - <text name="(brightness, lower is brighter)"> - (0 ã§ãƒ‡ãƒ•ォルトã€ä½Žã„ã»ã©æ˜Žã‚‹ã„) - </text> - <text name="Enable VBO:"> - VBO を有効化: - </text> - <check_box label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" tool_tip="最新ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€æ—§åž‹ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ VBO ã®å®Ÿè£…ãŒè²§å¼±ãªå ´åˆãŒå¤šãã€ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ãªãŒã‚‹ãŠãれãŒã‚りã¾ã™ã€‚"/> - <slider label="テクスãƒãƒ£ï¾’モリ(MB):" name="GrapicsCardTextureMemory" tool_tip="テクスãƒãƒ£ãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‹ãƒ¡ãƒ¢ãƒªã®åˆè¨ˆã€‚ ビデオ・カード・メモリをデフォルトã«ã—ã¾ã™ã€‚ ã“ã®æ•°å€¤ã‚’減らã™ã¨ã€ãƒ‘ãƒ•ã‚©ãƒ¼ãƒžãƒ³ã‚¹ãŒæ”¹å–„ã•れã¾ã™ãŒã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ãŒã¼ã‚„ã‘ãŸæ„Ÿã˜ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚"/> - <spinner label="フォグã®è·é›¢æ¯”率:" name="fog"/> - <button label="OK" label_selected="OK" name="OK"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Hardware Settings Floater" title="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢è¨å®š"> + <text name="Filtering:"> + フィルタリング: + </text> + <check_box label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰" name="ani"/> + <text name="Antialiasing:"> + アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°: + </text> + <combo_box label="アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°" name="fsaa"> + <combo_box.item label="無効" 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="ガンマ:" name="gamma"/> + <text name="(brightness, lower is brighter)"> + (0 ã§ãƒ‡ãƒ•ォルトã€ä½Žã„ã»ã©æ˜Žã‚‹ã„) + </text> + <text name="Enable VBO:"> + VBO を有効化: + </text> + <check_box label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" tool_tip="最新ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€æ—§åž‹ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ VBO ã®å®Ÿè£…ãŒè²§å¼±ãªå ´åˆãŒå¤šãã€ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ãªãŒã‚‹ãŠãれãŒã‚りã¾ã™ã€‚"/> + <slider label="テクスãƒãƒ£ï¾’モリ(MB):" name="GrapicsCardTextureMemory" tool_tip="テクスãƒãƒ£ãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‹ãƒ¡ãƒ¢ãƒªã®åˆè¨ˆã€‚ ビデオ・カード・メモリをデフォルトã«ã—ã¾ã™ã€‚ ã“ã®æ•°å€¤ã‚’減らã™ã¨ã€ãƒ‘ãƒ•ã‚©ãƒ¼ãƒžãƒ³ã‚¹ãŒæ”¹å–„ã•れã¾ã™ãŒã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ãŒã¼ã‚„ã‘ãŸæ„Ÿã˜ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚"/> + <spinner label="フォグã®è·é›¢æ¯”率:" name="fog"/> + <button label="OK" label_selected="OK" name="OK"/> +</floater> 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 42a4a2fd7f8d6cdcca35133f32566e89e78c92ba..57ed139e546f61f3835f104cb1e210b9759ba655 100644 --- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Image Preview" title=""> - <text name="name_label"> - åå‰ï¼š - </text> - <text name="description_label"> - 説明: - </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"/> - </combo_box> - <text name="bad_image_text"> - イメージをèªã¿å–れã¾ã›ã‚“。 - -24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å˜ã—ã¦ãã ã•ã„。 - </text> - <check_box label="ãƒã‚¹ã®ãªã„圧縮を使用" name="lossless_check"/> - <button label="å–り消ã—" name="cancel_btn"/> - <button label="アップロードL$[AMOUNT]" name="ok_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Image Preview" title=""> + <text name="name_label"> + åå‰ï¼š + </text> + <text name="description_label"> + 説明: + </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"/> + </combo_box> + <text name="bad_image_text"> + イメージをèªã¿å–れã¾ã›ã‚“。 + +24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å˜ã—ã¦ãã ã•ã„。 + </text> + <check_box label="ãƒã‚¹ã®ãªã„圧縮を使用" name="lossless_check"/> + <button label="å–り消ã—" name="cancel_btn"/> + <button label="アップロードL$[AMOUNT]" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml index bc34878fde0e8a78534f8907abb3bb5fa715a0e8..a3fddc7b8dded5155d8cbc47394a840ec155f417 100644 --- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã®ãƒ—ãƒãƒ‘ティ"> - <floater.string name="unknown"> - (䏿˜Žï¼‰ - </floater.string> - <floater.string name="public"> - (公共) - </floater.string> - <floater.string name="you_can"> - ã§ãã‚‹ã“ã¨ï¼š - </floater.string> - <floater.string name="owner_can"> - ã‚ªãƒ¼ãƒŠãƒ¼ã¯æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ï¼š - </floater.string> - <text name="LabelItemNameTitle"> - åå‰ï¼š - </text> - <text name="LabelItemDescTitle"> - 説明: - </text> - <text name="LabelCreatorTitle"> - クリエーター - </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> - <button label="æƒ…å ±" label_selected="" name="BtnCreator"/> - <text name="LabelOwnerTitle"> - オーナー: - </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> - <button label="æƒ…å ±" label_selected="" name="BtnOwner"/> - <text name="LabelAcquiredTitle"> - 入手日時: - </text> - <text name="LabelAcquiredDate"> - 2006å¹´5月24日水曜日12:50:46 - </text> - <text name="OwnerLabel"> - ã‚ãªãŸï¼š - </text> - <check_box label="編集" name="CheckOwnerModify"/> - <check_box label="コピー" name="CheckOwnerCopy"/> - <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckOwnerTransfer"/> - <text name="AnyoneLabel"> - 全員: - </text> - <check_box label="コピー" name="CheckEveryoneCopy"/> - <text name="GroupLabel"> - グループ: - </text> - <check_box label="共有" name="CheckShareWithGroup"/> - <text name="NextOwnerLabel" width="158"> - æ¬¡ã®æ‰€æœ‰è€…: - </text> - <check_box label="編集" name="CheckNextOwnerModify"/> - <check_box label="コピー" name="CheckNextOwnerCopy"/> - <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckNextOwnerTransfer"/> - <check_box label="売り出ã—ä¸" name="CheckPurchase"/> - <combo_box name="combobox sale copy"> - <combo_box.item label="コピー" name="Copy"/> - <combo_box.item label="オリジナル" name="Original"/> - </combo_box> - <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="item properties" title="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã®ãƒ—ãƒãƒ‘ティ"> + <floater.string name="unknown"> + (䏿˜Žï¼‰ + </floater.string> + <floater.string name="public"> + (公共) + </floater.string> + <floater.string name="you_can"> + ã§ãã‚‹ã“ã¨ï¼š + </floater.string> + <floater.string name="owner_can"> + ã‚ªãƒ¼ãƒŠãƒ¼ã¯æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ï¼š + </floater.string> + <text name="LabelItemNameTitle"> + åå‰ï¼š + </text> + <text name="LabelItemDescTitle"> + 説明: + </text> + <text name="LabelCreatorTitle"> + クリエーター + </text> + <text name="LabelCreatorName"> + Nicole Linden + </text> + <button label="æƒ…å ±" label_selected="" name="BtnCreator"/> + <text name="LabelOwnerTitle"> + オーナー: + </text> + <text name="LabelOwnerName"> + Thrax Linden + </text> + <button label="æƒ…å ±" label_selected="" name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + 入手日時: + </text> + <text name="LabelAcquiredDate"> + 2006å¹´5月24日水曜日12:50:46 + </text> + <text name="OwnerLabel"> + ã‚ãªãŸï¼š + </text> + <check_box label="編集" name="CheckOwnerModify"/> + <check_box label="コピー" name="CheckOwnerCopy"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + 全員: + </text> + <check_box label="コピー" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + グループ: + </text> + <check_box label="共有" name="CheckShareWithGroup"/> + <text name="NextOwnerLabel" width="158"> + æ¬¡ã®æ‰€æœ‰è€…: + </text> + <check_box label="編集" name="CheckNextOwnerModify"/> + <check_box label="コピー" name="CheckNextOwnerCopy"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckNextOwnerTransfer"/> + <check_box label="売り出ã—ä¸" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="コピー" name="Copy"/> + <combo_box.item label="オリジナル" name="Original"/> + </combo_box> + <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> +</floater> 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 49a42a716585c9c811240ee41c0ade28d97912ae..3cff79430d30e230245cf68dba5e6b2bf929579c 100644 --- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="自分ã®åœŸåœ°"> - <scroll_list name="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="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]平方メートル - </text> - <text name="current_label"> - ç¾åœ¨ã®ä¿æœ‰åœ°ï¼š - </text> - <text name="current_text"> - [AREA]平方メートル - </text> - <text name="available_label"> - 土地購入å¯ï¼š - </text> - <text name="available_text"> - [AREA]平方メートル - </text> - <string name="area_string"> - [AREA]平方メートル - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="land holdings floater" title="自分ã®åœŸåœ°"> + <scroll_list name="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="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]平方メートル + </text> + <text name="current_label"> + ç¾åœ¨ã®ä¿æœ‰åœ°ï¼š + </text> + <text name="current_text"> + [AREA]平方メートル + </text> + <text name="available_label"> + 土地購入å¯ï¼š + </text> + <text name="available_text"> + [AREA]平方メートル + </text> + <string name="area_string"> + [AREA]平方メートル + </string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml index b108a3e70cabdf6f8671798140022bfd704a74c9..ce1a1ecf928b5388ba1d52f1a3675627fe722ec7 100644 --- a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml @@ -1,15 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="スクリプト:新ã—ã„スクリプト"> - <floater.string name="not_allowed"> - ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºã¾ãŸã¯ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºã¾ãŸã¯ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚ - </floater.string> - <floater.string name="script_running"> - å®Ÿè¡Œä¸ - </floater.string> - <floater.string name="Title"> - スクリプト: [NAME] - </floater.string> - <button label="リセット" label_selected="リセット" name="Reset"/> - <check_box initial_value="true" label="実行ä¸" name="running"/> - <check_box initial_value="true" label="Mono" name="mono"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script ed float" title="スクリプト:新ã—ã„スクリプト"> + <floater.string name="not_allowed"> + ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºã¾ãŸã¯ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºã¾ãŸã¯ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚ + </floater.string> + <floater.string name="script_running"> + å®Ÿè¡Œä¸ + </floater.string> + <floater.string name="Title"> + スクリプト: [NAME] + </floater.string> + <button label="リセット" label_selected="リセット" name="Reset"/> + <check_box initial_value="true" label="実行ä¸" name="running"/> + <check_box initial_value="true" label="Mono" name="mono"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml index aefe24ae48d693a6ebfb1c8751cb271278364f77..f3cba7e6747cb49ad75bb3990ec477e3800ba5fd 100644 --- a/indra/newview/skins/default/xui/ja/floater_map.xml +++ b/indra/newview/skins/default/xui/ja/floater_map.xml @@ -1,54 +1,54 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> - <floater.string name="mini_map_north"> - 北 - </floater.string> - <floater.string name="mini_map_east"> - æ± - </floater.string> - <floater.string name="mini_map_west"> - 西 - </floater.string> - <floater.string name="mini_map_south"> - å— - </floater.string> - <floater.string name="mini_map_southeast"> - å—æ± - </floater.string> - <floater.string name="mini_map_northeast"> - åŒ—æ± - </floater.string> - <floater.string name="mini_map_southwest"> - å—西 - </floater.string> - <floater.string name="mini_map_northwest"> - 北西 - </floater.string> - <floater.string name="ToolTipMsg"> - [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ã) - </floater.string> - <text label="北" name="floater_map_north" text="北"> - 北 - </text> - <text label="æ±" name="floater_map_east" text="æ±"> - æ± - </text> - <text label="西" name="floater_map_west" text="西"> - 西 - </text> - <text label="å—" name="floater_map_south" text="å—"> - å— - </text> - <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> - å—æ± - </text> - <text label="北æ±" name="floater_map_northeast" text="北æ±"> - åŒ—æ± - </text> - <text label="å—西" name="floater_map_southwest" text="å—西"> - å—西 - </text> - <text label="北西" name="floater_map_northwest" text="北西"> - 北西 - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Map"> + <floater.string name="mini_map_north"> + 北 + </floater.string> + <floater.string name="mini_map_east"> + æ± + </floater.string> + <floater.string name="mini_map_west"> + 西 + </floater.string> + <floater.string name="mini_map_south"> + å— + </floater.string> + <floater.string name="mini_map_southeast"> + å—æ± + </floater.string> + <floater.string name="mini_map_northeast"> + åŒ—æ± + </floater.string> + <floater.string name="mini_map_southwest"> + å—西 + </floater.string> + <floater.string name="mini_map_northwest"> + 北西 + </floater.string> + <floater.string name="ToolTipMsg"> + [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ã) + </floater.string> + <text label="北" name="floater_map_north" text="北"> + 北 + </text> + <text label="æ±" name="floater_map_east" text="æ±"> + æ± + </text> + <text label="西" name="floater_map_west" text="西"> + 西 + </text> + <text label="å—" name="floater_map_south" text="å—"> + å— + </text> + <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> + å—æ± + </text> + <text label="北æ±" name="floater_map_northeast" text="北æ±"> + åŒ—æ± + </text> + <text label="å—西" name="floater_map_southwest" text="å—西"> + å—西 + </text> + <text label="北西" name="floater_map_northwest" text="北西"> + 北西 + </text> +</floater> 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 5e60b9f1a2ef9dc91c72e1023ce1e78591d7179a..3bcc40f9ddc952e5837ce55cfcfeb3c1b8d53ef9 100644 --- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml @@ -1,30 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" 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> - <layout_stack name="stack1"> - <layout_panel name="nav_controls"> - <button label="戻る" name="back"/> - <button label="進む" name="forward"/> - <button label="æ›´æ–°" name="reload"/> - <button label="閲覧" name="go"/> - </layout_panel> - <layout_panel name="time_controls"> - <button label="å·»ãæˆ»ã—" name="rewind"/> - <button label="åœæ¢" name="stop"/> - <button label="æ—©é€ã‚Š" name="seek"/> - </layout_panel> - <layout_panel name="parcel_owner_controls"> - <button label="ç¾åœ¨ã® URL を区画ã«é€ä¿¡" name="assign"/> - </layout_panel> - <layout_panel name="external_controls"> - <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser"/> - <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always"/> - <button label="é–‰ã˜ã‚‹" name="close"/> - </layout_panel> - </layout_stack> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" 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> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="戻る" name="back"/> + <button label="進む" name="forward"/> + <button label="æ›´æ–°" name="reload"/> + <button label="閲覧" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="å·»ãæˆ»ã—" name="rewind"/> + <button label="åœæ¢" name="stop"/> + <button label="æ—©é€ã‚Š" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="ç¾åœ¨ã® URL を区画ã«é€ä¿¡" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser"/> + <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always"/> + <button label="é–‰ã˜ã‚‹" name="close"/> + </layout_panel> + </layout_stack> +</floater> 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 1f7fcb949500401508390c654175a625280069bd..6167b6db91ca3e8eb1e4aa388346d169adefc40d 100644 --- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml @@ -1,18 +1,18 @@ -<?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"/> - <text name="total_leaked_label"> - ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB - </text> - <text name="note_label_1"> - [NOTE1] - </text> - <text name="note_label_2"> - [NOTE2] - </text> - <button label="é–‹å§‹" name="start_btn"/> - <button label="åœæ¢" name="stop_btn"/> - <button label="解放" name="release_btn"/> - <button label="é–‰ã˜ã‚‹" name="close_btn"/> -</floater> +<?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"/> + <text name="total_leaked_label"> + ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB + </text> + <text name="note_label_1"> + [NOTE1] + </text> + <text name="note_label_2"> + [NOTE2] + </text> + <button label="é–‹å§‹" name="start_btn"/> + <button label="åœæ¢" name="stop_btn"/> + <button label="解放" name="release_btn"/> + <button label="é–‰ã˜ã‚‹" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml index e6aeccc517546927db5ebb0b1f318daf9a4bef85..8ba297c7a02997f70aae0baa743df920c9a0f62e 100644 --- a/indra/newview/skins/default/xui/ja/floater_moveview.xml +++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml @@ -1,35 +1,35 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> - <string name="walk_forward_tooltip"> - å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ - </string> - <string name="walk_back_tooltip"> - 後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰ - </string> - <string name="run_forward_tooltip"> - å‰ã«èµ°ã‚‹ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ - </string> - <string name="run_back_tooltip"> - 後ã‚ã«èµ°ã‚‹ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ - </string> - <string name="fly_forward_tooltip"> - å‰ã«é£›ã¶ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ - </string> - <string name="fly_back_tooltip"> - 後ã‚ã«é£›ã¶ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ - </string> - <panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/> - <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_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/> - <joystick_turn name="backward btn" tool_tip="後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰"/> - </panel> - <panel name="panel_modes"> - <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> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="move_floater"> + <string name="walk_forward_tooltip"> + å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ + </string> + <string name="walk_back_tooltip"> + 後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰ + </string> + <string name="run_forward_tooltip"> + å‰ã«èµ°ã‚‹ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ + </string> + <string name="run_back_tooltip"> + 後ã‚ã«èµ°ã‚‹ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ + </string> + <string name="fly_forward_tooltip"> + å‰ã«é£›ã¶ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ + </string> + <string name="fly_back_tooltip"> + 後ã‚ã«é£›ã¶ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ + </string> + <panel name="panel_actions"> + <button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/> + <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_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/> + <joystick_turn name="backward btn" tool_tip="後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰"/> + </panel> + <panel name="panel_modes"> + <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_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml index d175009ef31da5eb87ec7ad71b6e0e8e54d48938..bef2435fe235d116b1b3160e894b50c0056a1630 100644 --- a/indra/newview/skins/default/xui/ja/floater_pay.xml +++ b/indra/newview/skins/default/xui/ja/floater_pay.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <text name="payee_label"> - 支払ã„: - </text> - <icon name="icon_person" tool_tip="ä½äºº"/> - <text name="payee_name"> - [FIRST] [LAST] - </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"> - 金é¡ã®æŒ‡å®šï¼š - </text> - <button label="支払ã„" label_selected="支払ã„" name="pay btn"/> - <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <text name="payee_label"> + 支払ã„: + </text> + <icon name="icon_person" tool_tip="ä½人"/> + <text name="payee_name"> + [FIRST] [LAST] + </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"> + 金é¡ã®æŒ‡å®šï¼š + </text> + <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_pay_object.xml b/indra/newview/skins/default/xui/ja/floater_pay_object.xml index 5a3edb290866e4cf07a51d499c9126bce50a3213..b304e291d3e487af5a420d601abbaf945049bd00 100644 --- a/indra/newview/skins/default/xui/ja/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/ja/floater_pay_object.xml @@ -1,29 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <string name="payee_group"> - グループã¸ã®æ”¯æ‰•ã„: - </string> - <string name="payee_resident"> - ä½äººã¸ã®æ”¯æ‰•ã„: - </string> - <icon name="icon_person" tool_tip="ä½äºº"/> - <text name="payee_name"> - [FIRST] [LAST] - </text> - <text name="object_name_label"> - オブジェクトを介ã—ã¦ï¼š - </text> - <icon name="icon_object" tool_tip="オブジェクト"/> - <text name="object_name_text"> - ... - </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"> - 金é¡ã‚’指定: - </text> - <button label="支払ã„" label_selected="支払ã„" name="pay btn"/> - <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <string name="payee_group"> + グループã¸ã®æ”¯æ‰•ã„: + </string> + <string name="payee_resident"> + ä½äººã¸ã®æ”¯æ‰•ã„: + </string> + <icon name="icon_person" tool_tip="ä½äºº"/> + <text name="payee_name"> + [FIRST] [LAST] + </text> + <text name="object_name_label"> + オブジェクトを介ã—ã¦ï¼š + </text> + <icon name="icon_object" tool_tip="オブジェクト"/> + <text name="object_name_text"> + ... + </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"> + 金é¡ã‚’指定: + </text> + <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_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml index 95cffd33f2c08ea301c21973997d1dadbd4290cb..629c1fd33910b88a6c855bb6d68d326d4b52bb92 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview_anim"> - <floater.string name="Title"> - アニメーション: [NAME] - </floater.string> - <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="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_anim"> + <floater.string name="Title"> + アニメーション: [NAME] + </floater.string> + <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="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml index 48a64e28a6e21a401086dd3600e4eee50377c5bc..ba3bb028b2600bc5f709a9600ec17aff16b2a4be 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šæƒ…å ±"> - <floater.string name="Title"> - クラシファイド広告: [NAME] - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="classified_preview" title="ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šæƒ…å ±"> + <floater.string name="Title"> + クラシファイド広告: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_event.xml b/indra/newview/skins/default/xui/ja/floater_preview_event.xml index 61c17e2d3c966e815b0436eb2b45abb5f4610214..21f57ca7a3ef1763f1138d8bbdd7b7e1423a69a6 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_event.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="ã‚¤ãƒ™ãƒ³ãƒˆæƒ…å ±"> - <floater.string name="Title"> - イベント: [NAME] - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="ã‚¤ãƒ™ãƒ³ãƒˆæƒ…å ±"> + <floater.string name="Title"> + イベント: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml index c996ed8591cf4222d52a871393aab2c774b12eb0..682b295a146092739d4fae03bd9bd46830373c55 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml index c996ed8591cf4222d52a871393aab2c774b12eb0..682b295a146092739d4fae03bd9bd46830373c55 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> 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 ba272bdffd0d813c5d1fbb46e3b7aa8a7d6e7276..0ab1efd127d501674cc0e691dbde4e149c8c58d9 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml @@ -1,22 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="メモ:"> - <floater.string name="no_object"> - ã“ã®ãƒŽãƒ¼ãƒˆã‚’å«ã‚“ã オブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </floater.string> - <floater.string name="not_allowed"> - ã“ã®ãƒŽãƒ¼ãƒˆã‚’見る権é™ãŒã‚りã¾ã›ã‚“。 - </floater.string> - <floater.string name="Title"> - ノートカード: [NAME] - </floater.string> - <floater.string label="ä¿å˜" label_selected="ä¿å˜" name="Save"> - ä¿å˜ - </floater.string> - <text name="desc txt"> - 説明: - </text> - <text_editor name="Notecard Editor"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž - </text_editor> - <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview notecard" title="メモ:"> + <floater.string name="no_object"> + ã“ã®ãƒŽãƒ¼ãƒˆã‚’å«ã‚“ã オブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="not_allowed"> + ã“ã®ãƒŽãƒ¼ãƒˆã‚’見る権é™ãŒã‚りã¾ã›ã‚“。 + </floater.string> + <floater.string name="Title"> + ノートカード: [NAME] + </floater.string> + <floater.string label="ä¿å˜" label_selected="ä¿å˜" name="Save"> + ä¿å˜ + </floater.string> + <text name="desc txt"> + 説明: + </text> + <text_editor name="Notecard Editor"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž + </text_editor> + <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> +</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 e52a3a4e9249c9425c2fc786f490ec64a637c9b1..09c6e46fb50345e0b089e29d3ad618d2a080db79 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/ja/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"> - サウンド: [NAME] - </floater.string> - <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="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_sound"> + <floater.string name="Title"> + サウンド: [NAME] + </floater.string> + <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="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚"/> +</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 c83130f3bb01f21703aa38b3ee1a2cab43a7ee25..32b83f295db50bc5caab2615099e154ff6a8045c 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml @@ -1,17 +1,17 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview_texture"> - <floater.string name="Title"> - テクスãƒãƒ£ï¼š [NAME] - </floater.string> - <floater.string name="Copy"> - æŒã¡ç‰©ã«ã‚³ãƒ”ー - </floater.string> - <text name="desc txt"> - 説明: - </text> - <button label="ä¿å˜" name="Keep"/> - <button label="削除" name="Discard"/> - <text name="dimensions"> - [WIDTH]px x [HEIGHT]px - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_texture"> + <floater.string name="Title"> + テクスãƒãƒ£ï¼š [NAME] + </floater.string> + <floater.string name="Copy"> + æŒã¡ç‰©ã«ã‚³ãƒ”ー + </floater.string> + <text name="desc txt"> + 説明: + </text> + <button label="ä¿å˜" name="Keep"/> + <button label="削除" name="Discard"/> + <text name="dimensions"> + [WIDTH]px x [HEIGHT]px + </text> +</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 2b07deb10329bfc5bb31544f81d21104eff0e752..ac5b2c0a2de24fe9541965b946c8e36dbe90a6b5 100644 --- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml @@ -1,103 +1,103 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="嫌ãŒã‚‰ã›ã®å ±å‘Š"> - <floater.string name="Screenshot"> - スクリーンショット - </floater.string> - <check_box label="ã“ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’使用" name="screen_check"/> - <text name="reporter_title"> - å ±å‘Šè€…ï¼š - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut - </text> - <text name="sim_title"> - 地域: - </text> - <text name="sim_field"> - 地域å - </text> - <text name="pos_title"> - ä½ç½®ï¼š - </text> - <text name="pos_field"> - {128.1, 128.1, 15.4} - </text> - <text name="select_object_label"> - ボタンをクリック。悪æ„ã®ã‚るオブジェクト: - </text> - <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/> - <text name="object_name_label"> - オブジェクト: - </text> - <text name="object_name"> - Consetetur Sadipscing - </text> - <text name="owner_name_label"> - オーナー: - </text> - <text name="owner_name"> - Hendrerit Vulputate - </text> - <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"/> - <combo_box.item label="攻撃>コンãƒãƒƒãƒˆãƒ»ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹/å±é™ºãªã‚¨ãƒªã‚¢" name="Assault__Combat_sandbox___unsafe_area"/> - <combo_box.item label="攻撃>安全ãªã‚¨ãƒªã‚¢" name="Assault__Safe_area"/> - <combo_box.item label="攻撃>æ¦å™¨ãƒ†ã‚¹ãƒˆç”¨ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹" name="Assault__Weapons_testing_sandbox"/> - <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="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³" 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"/> - <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žç¹°ã‚Šè¿”ã—スパム" name="Disturbing_the_peace__Repetitive_spam"/> - <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="è©æ¬ºï¼ž US$" name="Fraud__US$"/> - <combo_box.item label="嫌ãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム" name="Harassment__Advert_farms___visual_spam"/> - <combo_box.item label="嫌ãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸å‚·" name="Harassment__Defaming_individuals_or_groups"/> - <combo_box.item label="嫌ãŒã‚‰ã›ï¼žç§»å‹•ã®å¦¨å®³" name="Harassment__Impeding_movement"/> - <combo_box.item label="嫌ãŒã‚‰ã›ï¼žæ€§çš„ãªå«ŒãŒã‚‰ã›" name="Harassment__Sexual_harassment"/> - <combo_box.item label="嫌ãŒã‚‰ã›ï¼žåˆ©ç”¨è¦ç´„(ToS)ã«é•åã™ã‚‹è¡Œç‚ºã‚’行ã†ã‚ˆã†ä»–者を勧誘/扇動" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> - <combo_box.item label="嫌ãŒã‚‰ã›ï¼žæš´è¨€" name="Harassment__Verbal_abuse"/> - <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="ã‚ã„ã›ã¤ï¼žMature地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" 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__Encroachment__Objects_textures"/> - <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>パーティクル" name="Land__Encroachment__Particles"/> - <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>樹木/æ¤ç‰©" name="Land__Encroachment__Trees_plants"/> - <combo_box.item label="è³ã‘/ギャンブル" name="Wagering_gambling"/> - <combo_box.item label="ãã®ä»–" name="Other"/> - </combo_box> - <text name="abuser_name_title"> - 迷惑ユーザーã®åå‰ï¼š - </text> - <button label="é¸æŠž" label_selected="" name="select_abuser" tool_tip="嫌ãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’リストã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。"/> - <text name="abuser_name_title2"> - 嫌ãŒã‚‰ã›ã®èµ·ããŸå ´æ‰€ï¼š - </text> - <text name="sum_title"> - 概è¦ï¼š - </text> - <text name="dscr_title"> - 詳細: - </text> - <text name="bug_aviso"> - ã§ãã‚‹ã ã‘具体的ã«ãŠé¡˜ã„ã—ã¾ã™ã€‚ - </text> - <text name="incomplete_title"> - 注æ„:ä¸å®Œå…¨ãªãƒ¬ãƒãƒ¼ãƒˆã¯èª¿æŸ»ã•れã¾ã›ã‚“。 - </text> - <button label="嫌ãŒã‚‰ã›ã®å ±å‘Š" label_selected="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="send_btn"/> - <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_report_abuse" title="嫌ãŒã‚‰ã›ã®å ±å‘Š"> + <floater.string name="Screenshot"> + スクリーンショット + </floater.string> + <check_box label="ã“ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’使用" name="screen_check"/> + <text name="reporter_title"> + å ±å‘Šè€…ï¼š + </text> + <text name="reporter_field"> + Loremipsum Dolorsitamut + </text> + <text name="sim_title"> + 地域: + </text> + <text name="sim_field"> + 地域å + </text> + <text name="pos_title"> + ä½ç½®ï¼š + </text> + <text name="pos_field"> + {128.1, 128.1, 15.4} + </text> + <text name="select_object_label"> + ボタンをクリック。悪æ„ã®ã‚るオブジェクト: + </text> + <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/> + <text name="object_name_label"> + オブジェクト: + </text> + <text name="object_name"> + Consetetur Sadipscing + </text> + <text name="owner_name_label"> + オーナー: + </text> + <text name="owner_name"> + Hendrerit Vulputate + </text> + <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"/> + <combo_box.item label="攻撃>コンãƒãƒƒãƒˆãƒ»ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹/å±é™ºãªã‚¨ãƒªã‚¢" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="攻撃>安全ãªã‚¨ãƒªã‚¢" name="Assault__Safe_area"/> + <combo_box.item label="攻撃>æ¦å™¨ãƒ†ã‚¹ãƒˆç”¨ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹" name="Assault__Weapons_testing_sandbox"/> + <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="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³" 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"/> + <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žç¹°ã‚Šè¿”ã—スパム" name="Disturbing_the_peace__Repetitive_spam"/> + <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="è©æ¬ºï¼ž US$" name="Fraud__US$"/> + <combo_box.item label="嫌ãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="嫌ãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸å‚·" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="嫌ãŒã‚‰ã›ï¼žç§»å‹•ã®å¦¨å®³" name="Harassment__Impeding_movement"/> + <combo_box.item label="嫌ãŒã‚‰ã›ï¼žæ€§çš„ãªå«ŒãŒã‚‰ã›" name="Harassment__Sexual_harassment"/> + <combo_box.item label="嫌ãŒã‚‰ã›ï¼žåˆ©ç”¨è¦ç´„(ToS)ã«é•åã™ã‚‹è¡Œç‚ºã‚’行ã†ã‚ˆã†ä»–者を勧誘/扇動" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="嫌ãŒã‚‰ã›ï¼žæš´è¨€" name="Harassment__Verbal_abuse"/> + <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="ã‚ã„ã›ã¤ï¼žMature地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" 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__Encroachment__Objects_textures"/> + <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>パーティクル" name="Land__Encroachment__Particles"/> + <combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>樹木/æ¤ç‰©" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="è³ã‘/ギャンブル" name="Wagering_gambling"/> + <combo_box.item label="ãã®ä»–" name="Other"/> + </combo_box> + <text name="abuser_name_title"> + 迷惑ユーザーã®åå‰ï¼š + </text> + <button label="é¸æŠž" label_selected="" name="select_abuser" tool_tip="嫌ãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’リストã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。"/> + <text name="abuser_name_title2"> + 嫌ãŒã‚‰ã›ã®èµ·ããŸå ´æ‰€ï¼š + </text> + <text name="sum_title"> + 概è¦ï¼š + </text> + <text name="dscr_title"> + 詳細: + </text> + <text name="bug_aviso"> + ã§ãã‚‹ã ã‘具体的ã«ãŠé¡˜ã„ã—ã¾ã™ã€‚ + </text> + <text name="incomplete_title"> + 注æ„:ä¸å®Œå…¨ãªãƒ¬ãƒãƒ¼ãƒˆã¯èª¿æŸ»ã•れã¾ã›ã‚“。 + </text> + <button label="嫌ãŒã‚‰ã›ã®å ±å‘Š" label_selected="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="send_btn"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml index fc805e879b8f9d1abe82601c3a784f0f8cf19a0f..ef021ce713170e7ed1357aa5e8d9beed45acc2e7 100644 --- a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script" short_title="[All scripts]" title="[All scripts]"/> +<?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/ja/floater_script_preview.xml b/indra/newview/skins/default/xui/ja/floater_script_preview.xml index 583a2f8b91adb822601cde4d971c3f43a5508899..82fe741d676f264e504c642888afa33176f727eb 100644 --- a/indra/newview/skins/default/xui/ja/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_script_preview.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview lsl text" title="スクリプト:回転スクリプト"> - <floater.string name="Title"> - スクリプト: [NAME] - </floater.string> - <text name="desc txt"> - 説明: - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview lsl text" title="スクリプト:回転スクリプト"> + <floater.string name="Title"> + スクリプト: [NAME] + </floater.string> + <text name="desc txt"> + 説明: + </text> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_script_queue.xml b/indra/newview/skins/default/xui/ja/floater_script_queue.xml index 5e059b91caa192feb762fef36ed13cbfd7378166..22a79e16d68b4dd86da8946737bfc1d8b36c5dac 100644 --- a/indra/newview/skins/default/xui/ja/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/ja/floater_script_queue.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="進æ—ã®ãƒªã‚»ãƒƒãƒˆ"> - <floater.string name="Starting"> - [COUNT] アイテム㮠[START] ã‚’é–‹å§‹ã—ã¾ã™ã€‚ - </floater.string> - <floater.string name="Done"> - 完了。 - </floater.string> - <floater.string name="Resetting"> - ãƒªã‚»ãƒƒãƒˆä¸ - </floater.string> - <floater.string name="Running"> - å®Ÿè¡Œä¸ - </floater.string> - <floater.string name="NotRunning"> - 実行ã•れã¦ã„ã¾ã›ã‚“ - </floater.string> - <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="close"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="queue" title="進æ—ã®ãƒªã‚»ãƒƒãƒˆ"> + <floater.string name="Starting"> + [COUNT] アイテム㮠[START] ã‚’é–‹å§‹ã—ã¾ã™ã€‚ + </floater.string> + <floater.string name="Done"> + 完了。 + </floater.string> + <floater.string name="Resetting"> + ãƒªã‚»ãƒƒãƒˆä¸ + </floater.string> + <floater.string name="Running"> + å®Ÿè¡Œä¸ + </floater.string> + <floater.string name="NotRunning"> + 実行ã•れã¦ã„ã¾ã›ã‚“ + </floater.string> + <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="close"/> +</floater> 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 f373a7215e029a3574acd39473c1f72e2eb528ed..96a9a76a7256a19aaf0c49472a2370885b6f61a0 100644 --- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml @@ -1,70 +1,70 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater height="496" min_height="496" name="sell land" title="土地を販売"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - 区画: - </text> - <text name="info_parcel"> - 区画å - </text> - <text name="info_size_label"> - サイズ: - </text> - <text name="info_size"> - [AREA]平方メートル - </text> - <text bottom_delta="-57" name="info_action"> - ã“ã®åŒºç”»ã‚’販売㙠-ã‚‹ã«ã¯: - </text> - <icon bottom_delta="-86" name="step_price"/> - <text name="price_label"> - ä¾¡æ ¼ã‚’è¨å®šï¼š - </text> - <text name="price_text"> - 驿£ä¾¡æ ¼ã‚’é¸ã‚“ã§ãã ã•ã„。 - </text> - <text name="price_ld"> - L$ - </text> - <text left_delta="106" name="price_per_m" width="230"> - (1平方メートル当ãŸã‚ŠL$ [PER_METER]) - </text> - <text name="sell_to_label"> - 土地ã®è²©å£²å…ˆï¼š - </text> - <text name="sell_to_text" right="-6"> - 誰ã«ã§ã‚‚販売ã™ã‚‹ã‹ã€ç‰¹å®šã®äººã«ã®ã¿è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„ - </text> - <combo_box name="sell_to"> - <combo_box.item label="1ã¤é¸æŠžï¼ï¼" name="--selectone--"/> - <combo_box.item label="誰ã§ã‚‚" name="Anyone"/> - <combo_box.item label="特定ã®äººï¼š" name="Specificuser:"/> - </combo_box> - <button label="é¸æŠž..." name="sell_to_select_agent"/> - <text name="sell_objects_label"> - 土地ã¨å…±ã«ã‚ªãƒ–ジェクトを販売ã—ã¾ã™ã‹ï¼Ÿ - </text> - <text name="sell_objects_text"> - 区画上ã«ã‚ã‚‹è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã¯æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•れã¾ã™ - </text> - <radio_group bottom_delta="-76" height="72" name="sell_objects"> - <radio_item name="no"> - ã„ã„ãˆã€ã‚ªãƒ–ジェクト所有権 -ã‚’ä¿æŒã—ã¾ã™ - </radio_item> - <radio_item bottom="-56" name="yes"> - ã¯ã„ã€åœŸåœ°ã¨ä¸€ç·’ã«ã‚ªãƒ–ジェ -クトを売りã¾ã™ - </radio_item> - </radio_group> - <button label="オブジェクトを表示" name="show_objects" width="138"/> - <text name="nag_message_label"> - 注æ„:返å“や交æ›ã¯ã§ãã¾ã›ã‚“ - </text> - <button bottom="-489" label="販売を決定" name="sell_btn"/> - <button label="å–り消ã—" name="cancel_btn"/> - </panel> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater height="496" min_height="496" name="sell land" title="土地を販売"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + 区画: + </text> + <text name="info_parcel"> + 区画å + </text> + <text name="info_size_label"> + サイズ: + </text> + <text name="info_size"> + [AREA]平方メートル + </text> + <text bottom_delta="-57" name="info_action"> + ã“ã®åŒºç”»ã‚’販売㙠+ã‚‹ã«ã¯: + </text> + <icon bottom_delta="-86" name="step_price"/> + <text name="price_label"> + ä¾¡æ ¼ã‚’è¨å®šï¼š + </text> + <text name="price_text"> + 驿£ä¾¡æ ¼ã‚’é¸ã‚“ã§ãã ã•ã„。 + </text> + <text name="price_ld"> + L$ + </text> + <text left_delta="106" name="price_per_m" width="230"> + (1平方メートル当ãŸã‚ŠL$ [PER_METER]) + </text> + <text name="sell_to_label"> + 土地ã®è²©å£²å…ˆï¼š + </text> + <text name="sell_to_text" right="-6"> + 誰ã«ã§ã‚‚販売ã™ã‚‹ã‹ã€ç‰¹å®šã®äººã«ã®ã¿è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„ + </text> + <combo_box name="sell_to"> + <combo_box.item label="1ã¤é¸æŠžï¼ï¼" name="--selectone--"/> + <combo_box.item label="誰ã§ã‚‚" name="Anyone"/> + <combo_box.item label="特定ã®äººï¼š" name="Specificuser:"/> + </combo_box> + <button label="é¸æŠž..." name="sell_to_select_agent"/> + <text name="sell_objects_label"> + 土地ã¨å…±ã«ã‚ªãƒ–ジェクトを販売ã—ã¾ã™ã‹ï¼Ÿ + </text> + <text name="sell_objects_text"> + 区画上ã«ã‚ã‚‹è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã¯æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•れã¾ã™ + </text> + <radio_group bottom_delta="-76" height="72" name="sell_objects"> + <radio_item name="no"> + ã„ã„ãˆã€ã‚ªãƒ–ジェクト所有権 +ã‚’ä¿æŒã—ã¾ã™ + </radio_item> + <radio_item bottom="-56" name="yes"> + ã¯ã„ã€åœŸåœ°ã¨ä¸€ç·’ã«ã‚ªãƒ–ジェ +クトを売りã¾ã™ + </radio_item> + </radio_group> + <button label="オブジェクトを表示" name="show_objects" width="138"/> + <text name="nag_message_label"> + 注æ„:返å“や交æ›ã¯ã§ãã¾ã›ã‚“ + </text> + <button bottom="-489" label="販売を決定" name="sell_btn"/> + <button label="å–り消ã—" name="cancel_btn"/> + </panel> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml index 6ad4976b1c3665800380c3f575799349015998ab..cb7950bf5332b4ce8842c789451b2d82f8035ffa 100644 --- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="デãƒãƒƒã‚°è¨å®š"> - <combo_box name="boolean_combo"> - <combo_box.item label="TRUE" name="TRUE"/> - <combo_box.item label="FALSE" name="FALSE"/> - </combo_box> - <color_swatch label="色" 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"/> - <spinner label="x" name="val_spinner_4"/> - <button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="settings_debug" title="デãƒãƒƒã‚°è¨å®š"> + <combo_box name="boolean_combo"> + <combo_box.item label="TRUE" name="TRUE"/> + <combo_box.item label="FALSE" name="FALSE"/> + </combo_box> + <color_swatch label="色" 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"/> + <spinner label="x" name="val_spinner_4"/> + <button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml index 698beccb071afda917ca444bcb7de287608e843a..2a45d8556bc68c8b4b346da52489e232b32d2a8e 100644 --- a/indra/newview/skins/default/xui/ja/floater_stats.xml +++ b/indra/newview/skins/default/xui/ja/floater_stats.xml @@ -1,71 +1,71 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Statistics" title="統計ãƒãƒ¼"> - <scroll_container name="statistics_scroll"> - <container_view name="statistics_view"> - <stat_view label="ベーシック" name="basic"> - <stat_bar label="FPS" name="fps"/> - <stat_bar label="帯域幅" name="bandwidth"/> - <stat_bar label="パケットãƒã‚¹" name="packet_loss"/> - <stat_bar label="シム㮠Ping" name="ping"/> - </stat_view> - <stat_view label="詳細" name="advanced"> - <stat_view label="レンダリング" name="render"> - <stat_bar label="KTris ã®æç”»" name="ktrisframe"/> - <stat_bar label="KTris ã®æç”»" name="ktrissec"/> - <stat_bar label="オブジェクトåˆè¨ˆ" name="objs"/> - <stat_bar label="æ–°ã—ã„オブジェクト" name="newobjs"/> - </stat_view> - <stat_view label="テクスãƒãƒ£" name="texture"> - <stat_bar label="カウント" name="numimagesstat"/> - <stat_bar label="未処ç†ã®ã‚«ã‚¦ãƒ³ãƒˆ" name="numrawimagesstat"/> - <stat_bar label="GL メモリ" name="gltexmemstat"/> - <stat_bar label="フォーマット済メモリ" name="formattedmemstat"/> - <stat_bar label="未処ç†ã®ãƒ¡ãƒ¢ãƒª" name="rawmemstat"/> - <stat_bar label="çµ±åˆãƒ¡ãƒ¢ãƒª" name="glboundmemstat"/> - </stat_view> - <stat_view label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="network"> - <stat_bar label="パケットイン" name="packetsinstat"/> - <stat_bar label="パケットアウト" name="packetsoutstat"/> - <stat_bar label="オブジェクト" name="objectkbitstat"/> - <stat_bar label="テクスãƒãƒ£" name="texturekbitstat"/> - <stat_bar label="アセット" name="assetkbitstat"/> - <stat_bar label="レイヤー" name="layerskbitstat"/> - <stat_bar label="実際ã®å—ä¿¡" name="actualinkbitstat"/> - <stat_bar label="実際ã®é€ä¿¡" name="actualoutkbitstat"/> - <stat_bar label="VFS ä¿ç•™ä¸ã®æ“作" name="vfspendingoperations"/> - </stat_view> - </stat_view> - <stat_view label="シミュレーター" name="sim"> - <stat_bar label="時間ã®é…れ" name="simtimedilation"/> - <stat_bar label="シムFPS" name="simfps"/> - <stat_bar label="物ç†çš„作用 FPS" name="simphysicsfps"/> - <stat_view label="物ç†çš„作用ã®è©³ç´°" name="physicsdetail"> - <stat_bar label="ピン留ã‚オブジェクト" name="physicspinnedtasks"/> - <stat_bar label="低 LOD オブジェクト" name="physicslodtasks"/> - <stat_bar label="メモリé…分" name="physicsmemoryallocated"/> - <stat_bar label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®æ›´æ–°/ç§’" name="simagentups"/> - <stat_bar label="メインエージェント" name="simmainagents"/> - <stat_bar label="ãƒãƒ£ã‚¤ãƒ«ãƒ‰ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆ" name="simchildagents"/> - <stat_bar label="オブジェクト" name="simobjects"/> - <stat_bar label="アクティブãªã‚ªãƒ–ジェクト" name="simactiveobjects"/> - <stat_bar label="アクティブãªã‚¹ã‚¯ãƒªãƒ—ト" name="simactivescripts"/> - <stat_bar label="スクリプトイベント" name="simscripteps"/> - <stat_bar label="パケットイン" name="siminpps"/> - <stat_bar label="パケットアウト" name="simoutpps"/> - <stat_bar label="ä¿ç•™ä¸ã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰" name="simpendingdownloads"/> - <stat_bar label="ä¿ç•™ä¸ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰" name="simpendinguploads"/> - <stat_bar label="未é€ä¿¡ãƒã‚¤ãƒˆåˆè¨ˆ" name="simtotalunackedbytes"/> - </stat_view> - <stat_view label="時間(ms)" name="simperf"> - <stat_bar label="フレーム時間åˆè¨ˆ" name="simframemsec"/> - <stat_bar label="ç·æ™‚é–“æ•°" name="simnetmsec"/> - <stat_bar label="物ç†çš„作用時間" name="simsimphysicsmsec"/> - <stat_bar label="シミュレーション時間" name="simsimothermsec"/> - <stat_bar label="エージェント時間" name="simagentmsec"/> - <stat_bar label="イメージ時間" name="simimagesmsec"/> - <stat_bar label="スクリプト時間" name="simscriptmsec"/> - </stat_view> - </stat_view> - </container_view> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="統計ãƒãƒ¼"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="ベーシック" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="帯域幅" name="bandwidth"/> + <stat_bar label="パケットãƒã‚¹" name="packet_loss"/> + <stat_bar label="シム㮠Ping" name="ping"/> + </stat_view> + <stat_view label="詳細" name="advanced"> + <stat_view label="レンダリング" name="render"> + <stat_bar label="KTris ã®æç”»" name="ktrisframe"/> + <stat_bar label="KTris ã®æç”»" name="ktrissec"/> + <stat_bar label="オブジェクトåˆè¨ˆ" name="objs"/> + <stat_bar label="æ–°ã—ã„オブジェクト" name="newobjs"/> + </stat_view> + <stat_view label="テクスãƒãƒ£" name="texture"> + <stat_bar label="カウント" name="numimagesstat"/> + <stat_bar label="未処ç†ã®ã‚«ã‚¦ãƒ³ãƒˆ" name="numrawimagesstat"/> + <stat_bar label="GL メモリ" name="gltexmemstat"/> + <stat_bar label="フォーマット済メモリ" name="formattedmemstat"/> + <stat_bar label="未処ç†ã®ãƒ¡ãƒ¢ãƒª" name="rawmemstat"/> + <stat_bar label="çµ±åˆãƒ¡ãƒ¢ãƒª" name="glboundmemstat"/> + </stat_view> + <stat_view label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="network"> + <stat_bar label="パケットイン" name="packetsinstat"/> + <stat_bar label="パケットアウト" name="packetsoutstat"/> + <stat_bar label="オブジェクト" name="objectkbitstat"/> + <stat_bar label="テクスãƒãƒ£" name="texturekbitstat"/> + <stat_bar label="アセット" name="assetkbitstat"/> + <stat_bar label="レイヤー" name="layerskbitstat"/> + <stat_bar label="実際ã®å—ä¿¡" name="actualinkbitstat"/> + <stat_bar label="実際ã®é€ä¿¡" name="actualoutkbitstat"/> + <stat_bar label="VFS ä¿ç•™ä¸ã®æ“作" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="シミュレーター" name="sim"> + <stat_bar label="時間ã®é…れ" name="simtimedilation"/> + <stat_bar label="シムFPS" name="simfps"/> + <stat_bar label="物ç†çš„作用 FPS" name="simphysicsfps"/> + <stat_view label="物ç†çš„作用ã®è©³ç´°" name="physicsdetail"> + <stat_bar label="ピン留ã‚オブジェクト" name="physicspinnedtasks"/> + <stat_bar label="低 LOD オブジェクト" name="physicslodtasks"/> + <stat_bar label="メモリé…分" name="physicsmemoryallocated"/> + <stat_bar label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®æ›´æ–°/ç§’" name="simagentups"/> + <stat_bar label="メインエージェント" name="simmainagents"/> + <stat_bar label="ãƒãƒ£ã‚¤ãƒ«ãƒ‰ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆ" name="simchildagents"/> + <stat_bar label="オブジェクト" name="simobjects"/> + <stat_bar label="アクティブãªã‚ªãƒ–ジェクト" name="simactiveobjects"/> + <stat_bar label="アクティブãªã‚¹ã‚¯ãƒªãƒ—ト" name="simactivescripts"/> + <stat_bar label="スクリプトイベント" name="simscripteps"/> + <stat_bar label="パケットイン" name="siminpps"/> + <stat_bar label="パケットアウト" name="simoutpps"/> + <stat_bar label="ä¿ç•™ä¸ã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰" name="simpendingdownloads"/> + <stat_bar label="ä¿ç•™ä¸ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰" name="simpendinguploads"/> + <stat_bar label="未é€ä¿¡ãƒã‚¤ãƒˆåˆè¨ˆ" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="時間(ms)" name="simperf"> + <stat_bar label="フレーム時間åˆè¨ˆ" name="simframemsec"/> + <stat_bar label="ç·æ™‚é–“æ•°" name="simnetmsec"/> + <stat_bar label="物ç†çš„作用時間" name="simsimphysicsmsec"/> + <stat_bar label="シミュレーション時間" name="simsimothermsec"/> + <stat_bar label="エージェント時間" name="simagentmsec"/> + <stat_bar label="イメージ時間" name="simimagesmsec"/> + <stat_bar label="スクリプト時間" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index 880f42840cfd03b647687556b255fc9a8a32f59c..5ce2c291beb4156236d57df02c778e7264d7d06d 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -1,477 +1,477 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="制作ツール" title=""> - <floater.string name="status_rotate"> - 色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転 - </floater.string> - <floater.string name="status_scale"> - é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™ - </floater.string> - <floater.string name="status_move"> - 移動:ドラッグã€ã‚³ãƒ”ー: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 - </floater.string> - <floater.string name="status_place"> - インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ - </floater.string> - <floater.string name="status_selectland"> - 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž - </floater.string> - <floater.string name="grid_screen_text"> - ç”»é¢ - </floater.string> - <floater.string name="grid_local_text"> - ãƒãƒ¼ã‚«ãƒ« - </floater.string> - <floater.string name="grid_world_text"> - 世界 - </floater.string> - <floater.string name="grid_reference_text"> - å‚ç…§ - </floater.string> - <floater.string name="grid_attachment_text"> - アタッãƒãƒ¡ãƒ³ãƒˆ - </floater.string> - <button label="" label_selected="" name="button focus" tool_tip="フォーカス"/> - <button label="" label_selected="" name="button move" tool_tip="å‹•ã‹ã™"/> - <button label="" label_selected="" name="button edit" tool_tip="編集"/> - <button label="" label_selected="" name="button create" tool_tip="作æˆ"/> - <button label="" label_selected="" name="button land" tool_tip="土地"/> - <text name="text status"> - 移動ã™ã‚‹ã«ã¯ãƒ‰ãƒ©ãƒƒã‚°ã€ã‚³ãƒ”ーã™ã‚‹ã«ã¯Shiftã‚ーを押ã—ãªãŒã‚‰ãƒ‰ãƒ©ãƒƒã‚° - </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_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_group> - <radio_group name="edit_radio_group"> - <radio_item label="移動" name="radio position"/> - <radio_item label="回転(Ctrl)" name="radio rotate"/> - <radio_item label="引伸ã°ã™ï¼ˆCtrl+Shift)" name="radio stretch"/> - <radio_item label="テクスãƒãƒ£ãƒ¼ã‚’é¸æŠž" name="radio select face"/> - </radio_group> - <check_box label="リンク部分を編集" name="checkbox edit linked parts"/> - <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" 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="ToolCube" tool_tip="ã‚ューブ"/> - <button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/> - <button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/> - <button label="" label_selected="" name="ToolTetrahedron" tool_tip="4é¢ä½“"/> - <button label="" label_selected="" name="ToolCylinder" tool_tip="シリンダー"/> - <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="ToolHemiSphere" tool_tip="åŠçƒ"/> - <button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/> - <button label="" label_selected="" name="ToolTube" tool_tip="ãƒãƒ¥ãƒ¼ãƒ–"/> - <button label="" label_selected="" name="ToolRing" tool_tip="リング"/> - <button label="" label_selected="" name="ToolTree" tool_tip="樹木"/> - <button label="" label_selected="" name="ToolGrass" tool_tip="è‰åœ°"/> - <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿æŒ" name="checkbox sticky"/> - <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’コピー" name="checkbox copy selection"/> - <check_box initial_value="true" label="ä¸å¤®ã«ã‚³ãƒ”ー" name="checkbox copy centers"/> - <check_box label="回転ã•ã›ã¦ã‚³ãƒ”ー" name="checkbox copy rotates"/> - <radio_group name="land_radio_group"> - <radio_item label="åœŸåœ°ã‚’é¸æŠž" name="radio select land"/> - <radio_item label="ãªã‚‰ã™" name="radio flatten"/> - <radio_item label="隆起" name="radio raise"/> - <radio_item label="低ãã™ã‚‹" name="radio lower"/> - <radio_item label="滑らã‹ã«ã™ã‚‹" name="radio smooth"/> - <radio_item label="凸凹ã«ã™ã‚‹" name="radio noise"/> - <radio_item label="å…ƒã«æˆ»ã™" name="radio revert"/> - </radio_group> - <text name="Bulldozer:"> - ブルドーザー: - </text> - <text name="Dozer Size:"> - サイズ - </text> - <text name="Strength:"> - 強度 - </text> - <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’ä¿®æ£"/> - <text name="obj_count"> - オブジェクト: [COUNT] - </text> - <text name="prim_count"> - プリム: [COUNT] - </text> - <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30"> - <panel label="一般" name="General"> - <panel.string name="text deed continued"> - è²æ¸¡ - </panel.string> - <panel.string name="text deed"> - è²æ¸¡ - </panel.string> - <panel.string name="text modify info 1"> - ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ - </panel.string> - <panel.string name="text modify info 2"> - ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ - </panel.string> - <panel.string name="text modify info 3"> - ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 - </panel.string> - <panel.string name="text modify info 4"> - ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 - </panel.string> - <panel.string name="text modify warning"> - ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆå…¨ä½“ã‚’é¸æŠžã—ã¦æ¨©é™ã®è¨å®šã‚’行ã£ã¦ãã ã•ã„。 - </panel.string> - <panel.string name="Cost Default"> - ä¾¡æ ¼ï¼š L$ - </panel.string> - <panel.string name="Cost Total"> - åˆè¨ˆä¾¡æ ¼ï¼š L$ - </panel.string> - <panel.string name="Cost Per Unit"> - å˜ä¾¡ï¼š L$ - </panel.string> - <panel.string name="Cost Mixed"> - æ··åˆä¾¡æ ¼ - </panel.string> - <panel.string name="Sale Mixed"> - æ··åˆè²©å£² - </panel.string> - <text name="Name:"> - åå‰ï¼š - </text> - <text name="Description:"> - 説明: - </text> - <text name="Creator:"> - クリエーター - </text> - <text name="Creator Name"> - Thrax Linden - </text> - <text name="Owner:"> - オーナー: - </text> - <text name="Owner Name"> - Thrax Linden - </text> - <text name="Group:"> - グループ: - </text> - <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="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 役割制é™ã‚’有効ã«ã™ã‚‹ã«ã¯ã€è²æ¸¡ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/> - <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="Open"/> - </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="Original"/> - </combo_box> - <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> - <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®ã‚ªãƒ–ジェクトを人ã«è¦‹ã›ã‚‹"/> - <panel name="perms_build"> - <text name="perm_modify"> - ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ - </text> - <text name="Anyone can:"> - 全員: - </text> - <check_box label="コピー" name="checkbox allow everyone copy"/> - <text name="Next owner can:"> - æ¬¡ã®æ‰€æœ‰è€…: - </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="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> - <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="形状" name="Object"> - <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="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/> - <text name="label position"> - ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ - </text> - <spinner label="X" name="Pos X"/> - <spinner label="Y" name="Pos Y"/> - <spinner label="Z" name="Pos Z"/> - <text name="label size"> - サイズ(メートル) - </text> - <spinner label="X" name="Scale X"/> - <spinner label="Y" name="Scale Y"/> - <spinner label="Z" name="Scale Z"/> - <text name="label rotation"> - 回転(度) - </text> - <spinner label="X" name="Rot X"/> - <spinner label="Y" name="Rot Y"/> - <spinner label="Z" name="Rot Z"/> - <combo_box name="comboBaseType"> - <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="Torus"/> - <combo_box.item label="ãƒãƒ¥ãƒ¼ãƒ–" name="Tube"/> - <combo_box.item label="リング" name="Ring"/> - <combo_box.item label="スカルプト" name="Sculpted"/> - </combo_box> - <combo_box name="material"> - <combo_box.item label="石æ" name="Stone"/> - <combo_box.item label="金属" name="Metal"/> - <combo_box.item label="ガラス" name="Glass"/> - <combo_box.item label="木æ" name="Wood"/> - <combo_box.item label="肌" name="Flesh"/> - <combo_box.item label="プラスãƒãƒƒã‚¯" name="Plastic"/> - <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"/> - <text name="text hollow"> - ä¸ç©ºï¼ˆç©ºæ´žï¼‰ - </text> - <text name="text skew"> - 傾斜 - </text> - <text name="Hollow Shape"> - ä¸ç©ºï¼ˆç©ºæ´žï¼‰ã®å½¢ - </text> - <combo_box name="hole"> - <combo_box.item label="デフォルト" name="Default"/> - <combo_box.item label="サークル" name="Circle"/> - <combo_box.item label="æ£æ–¹å½¢" name="Square"/> - <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"/> - <text name="scale_taper"> - テーパー - </text> - <text name="scale_hole"> - 穴寸法 - </text> - <spinner label="X" name="Taper Scale X"/> - <spinner label="Y" name="Taper Scale Y"/> - <text name="text topshear"> - 上部層 - </text> - <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"/> - <text name="text taper2"> - テーパー - </text> - <spinner label="X" name="Taper X"/> - <spinner label="Y" name="Taper Y"/> - <text name="text radius delta"> - åŠå¾„ - </text> - <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="スカルプトã•れãŸãƒ—リムã®ãƒŽãƒ¼ãƒžãƒ«ã‚’逆転ã•ã›ã€è£è¿”ã—ã«è¡¨ç¤º"/> - <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="Torus"/> - <combo_box.item label="å¹³é¢" name="Plane"/> - <combo_box.item label="シリンダー" name="Cylinder"/> - </combo_box> - </panel> - <panel label="特徴" name="Features"> - <text name="select_single"> - プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„ - </text> - <text name="edit_object"> - オブジェクトã®ç‰¹å¾´ã‚’編集: - </text> - <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="オブジェクトãŒç™ºå…‰"/> - <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> - <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/> - <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/> - <spinner label="å¼±ã¾ã‚‹" label_width="72" name="Light Falloff" width="135"/> - </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="写真をクリックã—ã¦é¸æŠž"/> - <color_swatch label="色" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> - <text name="color trans"> - é€éŽåº¦ % - </text> - <text name="glow label"> - ã‚°ãƒãƒ¼ - </text> - <check_box label="明るã•全開" name="checkbox fullbright"/> - <text name="tex gen"> - マッピング - </text> - <combo_box name="combobox texgen"> - <combo_box.item label="デフォルト" name="Default"/> - <combo_box.item label="å¹³é¢" name="Planar"/> - </combo_box> - <text name="label shininess"> - è¼ã - </text> - <combo_box name="combobox shininess"> - <combo_box.item label="ãªã—" name="None"/> - <combo_box.item label="低" name="Low"/> - <combo_box.item label="ä¸" name="Medium"/> - <combo_box.item label="高" name="High"/> - </combo_box> - <text name="label bumpiness"> - 凹凸 - </text> - <combo_box name="combobox bumpiness"> - <combo_box.item label="ãªã—" name="None"/> - <combo_box.item label="明るã•" name="Brightness"/> - <combo_box.item label="æš—ã•" name="Darkness"/> - <combo_box.item label="木目調" name="woodgrain"/> - <combo_box.item label="木ã®çš®" name="bark"/> - <combo_box.item label="レンガ" name="bricks"/> - <combo_box.item label="ãƒã‚§ãƒƒã‚«ãƒ¼" name="checker"/> - <combo_box.item label="コンクリート" name="concrete"/> - <combo_box.item label="クラスティ・タイル" name="crustytile"/> - <combo_box.item label="カットストーン" name="cutstone"/> - <combo_box.item label="ディスク" name="discs"/> - <combo_box.item label="ç ‚åˆ©" name="gravel"/> - <combo_box.item label="ペトリ" name="petridish"/> - <combo_box.item label="羽目æ¿" name="siding"/> - <combo_box.item label="ストーン・タイル" name="stonetile"/> - <combo_box.item label="ã—ã£ãã„" name="stucco"/> - <combo_box.item label="å¸ã„è¾¼ã¿" name="suction"/> - <combo_box.item label="織目" name="weave"/> - </combo_box> - <text name="tex scale"> - é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ - </text> - <spinner label="水平(U)" name="TexScaleU"/> - <check_box label="å転" name="checkbox flip s"/> - <spinner label="垂直(V)" name="TexScaleV"/> - <check_box label="å転" name="checkbox flip t"/> - <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply"/> - <text name="tex offset"> - Texture Offset - </text> - <spinner label="水平(U)" name="TexOffsetU"/> - <spinner label="垂直(V)" name="TexOffsetV"/> - </panel> - <panel label="ä¸èº«" name="Contents"> - <button label="æ–°ã—ã„スクリプト" label_selected="æ–°ã—ã„スクリプト" name="button new script" width="120"/> - <button label="権é™" left_delta="130" name="button permissions" width="80"/> - </panel> - </tab_container> - <panel name="land info panel"> - <text name="label_parcel_info"> - åŒºç”»æƒ…å ± - </text> - <text name="label_area_price" width="200"> - ä¾¡æ ¼ï¼š[AREA]平方メートルã‚ãŸã‚ŠL$[PRICE] - </text> - <text name="label_area" width="200"> - é¢ç©ï¼š[AREA]平方メートル - </text> - <button label="åœŸåœ°æƒ…å ±..." label_selected="åœŸåœ°æƒ…å ±..." name="button about land"/> - <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有権別ã«åŒºç”»ã‚’色分ã‘ã—ã¾ã™ï¼š - -ç·‘ = ã‚ãªãŸã®åœŸåœ° -アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 -赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° -黄色 = 売り出ã—ä¸ -ç´« = オークション -グレー = パブリック"/> - <text name="label_parcel_modify"> - 区画ã®ç·¨é›† - </text> - <button label="å†åˆ†å‰²" label_selected="å†åˆ†å‰²" name="button subdivide land"/> - <button label="çµ±åˆã™ã‚‹" label_selected="çµ±åˆã™ã‚‹" name="button join land"/> - <text name="label_parcel_trans"> - 土地å–引 - </text> - <button label="土地を購入" label_selected="土地を購入" name="button buy land"/> - <button label="土地を放棄" label_selected="土地を放棄" name="button abandon land"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="toolbox floater" short_title="制作ツール" title=""> + <floater.string name="status_rotate"> + 色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転 + </floater.string> + <floater.string name="status_scale"> + é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™ + </floater.string> + <floater.string name="status_move"> + 移動:ドラッグã€ã‚³ãƒ”ー: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 + </floater.string> + <floater.string name="status_place"> + インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ + </floater.string> + <floater.string name="status_selectland"> + 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž + </floater.string> + <floater.string name="grid_screen_text"> + ç”»é¢ + </floater.string> + <floater.string name="grid_local_text"> + ãƒãƒ¼ã‚«ãƒ« + </floater.string> + <floater.string name="grid_world_text"> + 世界 + </floater.string> + <floater.string name="grid_reference_text"> + å‚ç…§ + </floater.string> + <floater.string name="grid_attachment_text"> + アタッãƒãƒ¡ãƒ³ãƒˆ + </floater.string> + <button label="" label_selected="" name="button focus" tool_tip="フォーカス"/> + <button label="" label_selected="" name="button move" tool_tip="å‹•ã‹ã™"/> + <button label="" label_selected="" name="button edit" tool_tip="編集"/> + <button label="" label_selected="" name="button create" tool_tip="作æˆ"/> + <button label="" label_selected="" name="button land" tool_tip="土地"/> + <text name="text status"> + 移動ã™ã‚‹ã«ã¯ãƒ‰ãƒ©ãƒƒã‚°ã€ã‚³ãƒ”ーã™ã‚‹ã«ã¯Shiftã‚ーを押ã—ãªãŒã‚‰ãƒ‰ãƒ©ãƒƒã‚° + </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_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_group> + <radio_group name="edit_radio_group"> + <radio_item label="移動" name="radio position"/> + <radio_item label="回転(Ctrl)" name="radio rotate"/> + <radio_item label="引伸ã°ã™ï¼ˆCtrl+Shift)" name="radio stretch"/> + <radio_item label="テクスãƒãƒ£ãƒ¼ã‚’é¸æŠž" name="radio select face"/> + </radio_group> + <check_box label="リンク部分を編集" name="checkbox edit linked parts"/> + <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" 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="ToolCube" tool_tip="ã‚ューブ"/> + <button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/> + <button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/> + <button label="" label_selected="" name="ToolTetrahedron" tool_tip="4é¢ä½“"/> + <button label="" label_selected="" name="ToolCylinder" tool_tip="シリンダー"/> + <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="ToolHemiSphere" tool_tip="åŠçƒ"/> + <button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/> + <button label="" label_selected="" name="ToolTube" tool_tip="ãƒãƒ¥ãƒ¼ãƒ–"/> + <button label="" label_selected="" name="ToolRing" tool_tip="リング"/> + <button label="" label_selected="" name="ToolTree" tool_tip="樹木"/> + <button label="" label_selected="" name="ToolGrass" tool_tip="è‰åœ°"/> + <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿æŒ" name="checkbox sticky"/> + <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’コピー" name="checkbox copy selection"/> + <check_box initial_value="true" label="ä¸å¤®ã«ã‚³ãƒ”ー" name="checkbox copy centers"/> + <check_box label="回転ã•ã›ã¦ã‚³ãƒ”ー" name="checkbox copy rotates"/> + <radio_group name="land_radio_group"> + <radio_item label="åœŸåœ°ã‚’é¸æŠž" name="radio select land"/> + <radio_item label="ãªã‚‰ã™" name="radio flatten"/> + <radio_item label="隆起" name="radio raise"/> + <radio_item label="低ãã™ã‚‹" name="radio lower"/> + <radio_item label="滑らã‹ã«ã™ã‚‹" name="radio smooth"/> + <radio_item label="凸凹ã«ã™ã‚‹" name="radio noise"/> + <radio_item label="å…ƒã«æˆ»ã™" name="radio revert"/> + </radio_group> + <text name="Bulldozer:"> + ブルドーザー: + </text> + <text name="Dozer Size:"> + サイズ + </text> + <text name="Strength:"> + 強度 + </text> + <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’ä¿®æ£"/> + <text name="obj_count"> + オブジェクト: [COUNT] + </text> + <text name="prim_count"> + プリム: [COUNT] + </text> + <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30"> + <panel label="一般" name="General"> + <panel.string name="text deed continued"> + è²æ¸¡ + </panel.string> + <panel.string name="text deed"> + è²æ¸¡ + </panel.string> + <panel.string name="text modify info 1"> + ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="text modify info 2"> + ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="text modify info 3"> + ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 + </panel.string> + <panel.string name="text modify info 4"> + ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 + </panel.string> + <panel.string name="text modify warning"> + ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆå…¨ä½“ã‚’é¸æŠžã—ã¦æ¨©é™ã®è¨å®šã‚’行ã£ã¦ãã ã•ã„。 + </panel.string> + <panel.string name="Cost Default"> + ä¾¡æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Total"> + åˆè¨ˆä¾¡æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Per Unit"> + å˜ä¾¡ï¼š L$ + </panel.string> + <panel.string name="Cost Mixed"> + æ··åˆä¾¡æ ¼ + </panel.string> + <panel.string name="Sale Mixed"> + æ··åˆè²©å£² + </panel.string> + <text name="Name:"> + åå‰ï¼š + </text> + <text name="Description:"> + 説明: + </text> + <text name="Creator:"> + クリエーター + </text> + <text name="Creator Name"> + Thrax Linden + </text> + <text name="Owner:"> + オーナー: + </text> + <text name="Owner Name"> + Thrax Linden + </text> + <text name="Group:"> + グループ: + </text> + <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="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 役割制é™ã‚’有効ã«ã™ã‚‹ã«ã¯ã€è²æ¸¡ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/> + <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="Open"/> + </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="Original"/> + </combo_box> + <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> + <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®ã‚ªãƒ–ジェクトを人ã«è¦‹ã›ã‚‹"/> + <panel name="perms_build"> + <text name="perm_modify"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </text> + <text name="Anyone can:"> + 全員: + </text> + <check_box label="コピー" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + æ¬¡ã®æ‰€æœ‰è€…: + </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="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> + <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="形状" name="Object"> + <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="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/> + <text name="label position"> + ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ + </text> + <spinner label="X" name="Pos X"/> + <spinner label="Y" name="Pos Y"/> + <spinner label="Z" name="Pos Z"/> + <text name="label size"> + サイズ(メートル) + </text> + <spinner label="X" name="Scale X"/> + <spinner label="Y" name="Scale Y"/> + <spinner label="Z" name="Scale Z"/> + <text name="label rotation"> + 回転(度) + </text> + <spinner label="X" name="Rot X"/> + <spinner label="Y" name="Rot Y"/> + <spinner label="Z" name="Rot Z"/> + <combo_box name="comboBaseType"> + <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="Torus"/> + <combo_box.item label="ãƒãƒ¥ãƒ¼ãƒ–" name="Tube"/> + <combo_box.item label="リング" name="Ring"/> + <combo_box.item label="スカルプト" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="石æ" name="Stone"/> + <combo_box.item label="金属" name="Metal"/> + <combo_box.item label="ガラス" name="Glass"/> + <combo_box.item label="木æ" name="Wood"/> + <combo_box.item label="肌" name="Flesh"/> + <combo_box.item label="プラスãƒãƒƒã‚¯" name="Plastic"/> + <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"/> + <text name="text hollow"> + ä¸ç©ºï¼ˆç©ºæ´žï¼‰ + </text> + <text name="text skew"> + 傾斜 + </text> + <text name="Hollow Shape"> + ä¸ç©ºï¼ˆç©ºæ´žï¼‰ã®å½¢ + </text> + <combo_box name="hole"> + <combo_box.item label="デフォルト" name="Default"/> + <combo_box.item label="サークル" name="Circle"/> + <combo_box.item label="æ£æ–¹å½¢" name="Square"/> + <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"/> + <text name="scale_taper"> + テーパー + </text> + <text name="scale_hole"> + 穴寸法 + </text> + <spinner label="X" name="Taper Scale X"/> + <spinner label="Y" name="Taper Scale Y"/> + <text name="text topshear"> + 上部層 + </text> + <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"/> + <text name="text taper2"> + テーパー + </text> + <spinner label="X" name="Taper X"/> + <spinner label="Y" name="Taper Y"/> + <text name="text radius delta"> + åŠå¾„ + </text> + <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="スカルプトã•れãŸãƒ—リムã®ãƒŽãƒ¼ãƒžãƒ«ã‚’逆転ã•ã›ã€è£è¿”ã—ã«è¡¨ç¤º"/> + <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="Torus"/> + <combo_box.item label="å¹³é¢" name="Plane"/> + <combo_box.item label="シリンダー" name="Cylinder"/> + </combo_box> + </panel> + <panel label="特徴" name="Features"> + <text name="select_single"> + プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„ + </text> + <text name="edit_object"> + オブジェクトã®ç‰¹å¾´ã‚’編集: + </text> + <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="オブジェクトãŒç™ºå…‰"/> + <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> + <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/> + <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/> + <spinner label="å¼±ã¾ã‚‹" label_width="72" name="Light Falloff" width="135"/> + </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="写真をクリックã—ã¦é¸æŠž"/> + <color_swatch label="色" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> + <text name="color trans"> + é€éŽåº¦ % + </text> + <text name="glow label"> + ã‚°ãƒãƒ¼ + </text> + <check_box label="明るã•全開" name="checkbox fullbright"/> + <text name="tex gen"> + マッピング + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="デフォルト" name="Default"/> + <combo_box.item label="å¹³é¢" name="Planar"/> + </combo_box> + <text name="label shininess"> + è¼ã + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="ãªã—" name="None"/> + <combo_box.item label="低" name="Low"/> + <combo_box.item label="ä¸" name="Medium"/> + <combo_box.item label="高" name="High"/> + </combo_box> + <text name="label bumpiness"> + 凹凸 + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="ãªã—" name="None"/> + <combo_box.item label="明るã•" name="Brightness"/> + <combo_box.item label="æš—ã•" name="Darkness"/> + <combo_box.item label="木目調" name="woodgrain"/> + <combo_box.item label="木ã®çš®" name="bark"/> + <combo_box.item label="レンガ" name="bricks"/> + <combo_box.item label="ãƒã‚§ãƒƒã‚«ãƒ¼" name="checker"/> + <combo_box.item label="コンクリート" name="concrete"/> + <combo_box.item label="クラスティ・タイル" name="crustytile"/> + <combo_box.item label="カットストーン" name="cutstone"/> + <combo_box.item label="ディスク" name="discs"/> + <combo_box.item label="ç ‚åˆ©" name="gravel"/> + <combo_box.item label="ペトリ" name="petridish"/> + <combo_box.item label="羽目æ¿" name="siding"/> + <combo_box.item label="ストーン・タイル" name="stonetile"/> + <combo_box.item label="ã—ã£ãã„" name="stucco"/> + <combo_box.item label="å¸ã„è¾¼ã¿" name="suction"/> + <combo_box.item label="織目" name="weave"/> + </combo_box> + <text name="tex scale"> + é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ + </text> + <spinner label="水平(U)" name="TexScaleU"/> + <check_box label="å転" name="checkbox flip s"/> + <spinner label="垂直(V)" name="TexScaleV"/> + <check_box label="å転" name="checkbox flip t"/> + <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply"/> + <text name="tex offset"> + Texture Offset + </text> + <spinner label="水平(U)" name="TexOffsetU"/> + <spinner label="垂直(V)" name="TexOffsetV"/> + </panel> + <panel label="ä¸èº«" name="Contents"> + <button label="æ–°ã—ã„スクリプト" label_selected="æ–°ã—ã„スクリプト" name="button new script" width="120"/> + <button label="権é™" left_delta="130" name="button permissions" width="80"/> + </panel> + </tab_container> + <panel name="land info panel"> + <text name="label_parcel_info"> + åŒºç”»æƒ…å ± + </text> + <text name="label_area_price" width="200"> + ä¾¡æ ¼ï¼š[AREA]平方メートルã‚ãŸã‚ŠL$[PRICE] + </text> + <text name="label_area" width="200"> + é¢ç©ï¼š[AREA]平方メートル + </text> + <button label="åœŸåœ°æƒ…å ±..." label_selected="åœŸåœ°æƒ…å ±..." name="button about land"/> + <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有権別ã«åŒºç”»ã‚’色分ã‘ã—ã¾ã™ï¼š + +ç·‘ = ã‚ãªãŸã®åœŸåœ° +アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 +赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° +黄色 = 売り出ã—ä¸ +ç´« = オークション +グレー = パブリック"/> + <text name="label_parcel_modify"> + 区画ã®ç·¨é›† + </text> + <button label="å†åˆ†å‰²" label_selected="å†åˆ†å‰²" name="button subdivide land"/> + <button label="çµ±åˆã™ã‚‹" label_selected="çµ±åˆã™ã‚‹" name="button join land"/> + <text name="label_parcel_trans"> + 土地å–引 + </text> + <button label="土地を購入" label_selected="土地を購入" name="button buy land"/> + <button label="土地を放棄" label_selected="土地を放棄" name="button abandon land"/> + </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 c7d2cbee043a7e80e2cfb761d12f99467e5528d4..e5b2a44521776b16208c7403daed00894391fa79 100644 --- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml @@ -1,16 +1,16 @@ -<?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"> - [ACCTTYPE]ã€[PAYMENTINFO] -プãƒãƒ•ィール: [SL_PROFILE] - </string> - <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/> - <button label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend_btn"/> -</floater> +<?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"> + [ACCTTYPE]ã€[PAYMENTINFO] +プãƒãƒ•ィール: [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/> + <button label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml index b3287a1a35157d7e0ea72a1ed259ddb5852f6ef5..ef63f3f4e094bbdf5dd24dec54b6b31fe47d1df6 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Avatar Icon Menu"> - <menu_item_call label="プãƒãƒ•ィールを表示..." name="Show Profile"/> - <menu_item_call label="IMã‚’é€ä¿¡..." name="Send IM"/> - <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ ..." name="Add Friend"/> - <menu_item_call label="フレンドを削除..." name="Remove Friend"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="プãƒãƒ•ィールを表示..." name="Show Profile"/> + <menu_item_call label="IMã‚’é€ä¿¡..." name="Send IM"/> + <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ ..." name="Add Friend"/> + <menu_item_call label="フレンドを削除..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml index fbaa33035fc5afd9ed473bc6c2e4a5a83da6c5e2..4708b1446c7e7a544d2fdcf7255c58b067b76dab 100644 --- a/indra/newview/skins/default/xui/ja/menu_favorites.xml +++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Teleport To Landmark"/> - <menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/> - <menu_item_call label="SLurl をコピー" name="Copy slurl"/> - <menu_item_call label="地図ã«è¡¨ç¤º" name="Show On Map"/> - <menu_item_call label="コピー" name="Landmark Copy"/> - <menu_item_call label="貼り付ã‘" name="Landmark Paste"/> - <menu_item_call label="削除" name="Delete"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Teleport To Landmark"/> + <menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/> + <menu_item_call label="SLurl をコピー" name="Copy slurl"/> + <menu_item_call label="地図ã«è¡¨ç¤º" name="Show On Map"/> + <menu_item_call label="コピー" name="Landmark Copy"/> + <menu_item_call label="貼り付ã‘" name="Landmark Paste"/> + <menu_item_call label="削除" name="Delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml index 762f9f616d9bb3dc7d3c72e30263c75808264526..3787f7d64506c3bc4020c0d0070b22f73a7ebf2d 100644 --- a/indra/newview/skins/default/xui/ja/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/ja/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="グループã«å‚åŠ ..." name="item_join"/> - <menu_item_call label="æ–°ã—ã„グループ..." name="item_new"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="グループã«å‚åŠ ..." name="item_join"/> + <menu_item_call label="æ–°ã—ã„グループ..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index e3420c0c1555c8accc8a6bb456647a4e882c0273..3162477c5c31db949e1a932d82b925c4733ede5b 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -1,76 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <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="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> - <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 label="種類を変更" name="Change Type"> - <menu_item_call label="デフォルト" name="Default"/> - <menu_item_call label="手袋" name="Gloves"/> - <menu_item_call label="ジャケット" name="Jacket"/> - <menu_item_call label="パンツ" name="Pants"/> - <menu_item_call label="シェイプ" name="Shape"/> - <menu_item_call label="é´" name="Shoes"/> - <menu_item_call label="シャツ" name="Shirt"/> - <menu_item_call label="スカート" name="Skirt"/> - <menu_item_call label="下ç€ãƒ‘ンツ" name="Underpants"/> - <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Undershirt"/> - </menu> - <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Landmark Open"/> - <menu_item_call label="é–‹ã" name="Animation Open"/> - <menu_item_call label="é–‹ã" name="Sound Open"/> - <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="Properties"/> - <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="Delete"/> - <menu_item_call label="アイテムをå–り外ã™" name="Take Off Items"/> - <menu_item_call label="æœè£…ã«è¿½åŠ " name="Add To Outfit"/> - <menu_item_call label="æœè£…ã‚’ç½®æ›" name="Replace Outfit"/> - <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/> - <menu_item_call label="å†ç”Ÿ" name="Sound Play"/> - <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="Detach From Yourself"/> - <menu_item_call label="装ç€" name="Object Wear"/> - <menu label="装ç€å…ˆ" name="Attach To"/> - <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="Take Off"/> - <menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <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="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> + <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 label="種類を変更" name="Change Type"> + <menu_item_call label="デフォルト" name="Default"/> + <menu_item_call label="手袋" name="Gloves"/> + <menu_item_call label="ジャケット" name="Jacket"/> + <menu_item_call label="パンツ" name="Pants"/> + <menu_item_call label="シェイプ" name="Shape"/> + <menu_item_call label="é´" name="Shoes"/> + <menu_item_call label="シャツ" name="Shirt"/> + <menu_item_call label="スカート" name="Skirt"/> + <menu_item_call label="下ç€ãƒ‘ンツ" name="Underpants"/> + <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Undershirt"/> + </menu> + <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Landmark Open"/> + <menu_item_call label="é–‹ã" name="Animation Open"/> + <menu_item_call label="é–‹ã" name="Sound Open"/> + <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="Properties"/> + <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="Delete"/> + <menu_item_call label="アイテムをå–り外ã™" name="Take Off Items"/> + <menu_item_call label="æœè£…ã«è¿½åŠ " name="Add To Outfit"/> + <menu_item_call label="æœè£…ã‚’ç½®æ›" name="Replace Outfit"/> + <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/> + <menu_item_call label="å†ç”Ÿ" name="Sound Play"/> + <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="Detach From Yourself"/> + <menu_item_call label="装ç€" name="Object Wear"/> + <menu label="装ç€å…ˆ" name="Attach To"/> + <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="Take Off"/> + <menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_landmark.xml b/indra/newview/skins/default/xui/ja/menu_landmark.xml index 778eb72e7012aca7dd456a6fde7a06cda4d4abd2..de35bf2401019e37e9e8aa909fec12f420e03ab7 100644 --- a/indra/newview/skins/default/xui/ja/menu_landmark.xml +++ b/indra/newview/skins/default/xui/ja/menu_landmark.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<toggleable_menu name="landmark_overflow_menu"> - <menu_item_call label="SLurl をコピー" name="copy"/> - <menu_item_call label="削除" name="delete"/> - <menu_item_call label="ピックを作æˆ" name="pick"/> -</toggleable_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="SLurl をコピー" name="copy"/> + <menu_item_call label="削除" name="delete"/> + <menu_item_call label="ピックを作æˆ" name="pick"/> +</toggleable_menu> 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 f080647be27ae6285ac3ba68eec33e3a4345ddfa..e1bddd872d7bf69e46d4d25d21165b295cac0c60 100644 --- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> - <menu_item_call label="ズーム(近)" name="Zoom Close"/> - <menu_item_call label="ズーム(ä¸ï¼‰" name="Zoom Medium"/> - <menu_item_call label="ズーム(é )" name="Zoom Far"/> - <menu_item_call label="追跡をやã‚ã‚‹" name="Stop Tracking"/> - <menu_item_call label="世界地図" name="World Map"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="popup"> + <menu_item_call label="ズーム(近)" name="Zoom Close"/> + <menu_item_call label="ズーム(ä¸ï¼‰" name="Zoom Medium"/> + <menu_item_call label="ズーム(é )" name="Zoom Far"/> + <menu_item_call label="追跡をやã‚ã‚‹" name="Stop Tracking"/> + <menu_item_call label="世界地図" name="World Map"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml index e10c436208db9b83bee1805ddcd24361b46351ab..4c9874c645b75002547caddc135583269ee99769 100644 --- a/indra/newview/skins/default/xui/ja/menu_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Navbar Menu"> - <menu_item_check label="座標を表示" name="Show Coordinates"/> - <menu_item_call label="ランドマーク" name="Landmark"/> - <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="Select All"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="座標を表示" name="Show Coordinates"/> + <menu_item_call label="ランドマーク" name="Landmark"/> + <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="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml index a0880bd555a07a37f16e06715b329467a4adcba9..011d3d25268161081f484d4af0764b18ff23dc23 100644 --- a/indra/newview/skins/default/xui/ja/menu_picks.xml +++ b/indra/newview/skins/default/xui/ja/menu_picks.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Picks"> - <menu_item_call label="æƒ…å ±" name="pick_info"/> - <menu_item_call label="編集" name="pick_edit"/> - <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="pick_teleport"/> - <menu_item_call label="地図" name="pick_map"/> - <menu_item_call label="削除" name="pick_delete"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="æƒ…å ±" name="pick_info"/> + <menu_item_call label="編集" name="pick_edit"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="pick_teleport"/> + <menu_item_call label="地図" name="pick_map"/> + <menu_item_call label="削除" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml index 01095387b4c274b44445f69553c7588334763023..a9f05e126d154d4ab1676a1b0b2e119ec14ae9cc 100644 --- a/indra/newview/skins/default/xui/ja/menu_place.xml +++ b/indra/newview/skins/default/xui/ja/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="ランドマークを作æˆ" name="landmark"/> - <menu_item_call label="ピックを作æˆ" name="pick"/> - <menu_item_call label="å…¥å ´è¨±å¯ã‚’購入" name="pass"/> - <menu_item_call label="編集" name="edit"/> -</toggleable_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="ランドマークを作æˆ" name="landmark"/> + <menu_item_call label="ピックを作æˆ" name="pick"/> + <menu_item_call label="å…¥å ´è¨±å¯ã‚’購入" name="pass"/> + <menu_item_call label="編集" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 1be2954f3fe39435214b6d901f5c13a8ab1bc602..2e06c5349417a5a0c38f7b5ce2e517bac5f098f9 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="地図" name="show_on_map"/> -</menu> +<?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="地図" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 57e7931ce609b941197a49330c67ce008ea11866..9c5eb64cb829efd856ed10fe4625edc22ee7d3fb 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/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="ä½äººã®ãƒ—ãƒãƒ•ィールを表示" name="show_agent"/> - <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> - <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="ä½äººã®ãƒ—ãƒãƒ•ィールを表示" name="show_agent"/> + <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> + <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml index 2970256cfe1a34406b692c39980c8ad93c23b05d..2c453922d0c9d4d7203fdda0170aa10f0cd3946c 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_group.xml +++ b/indra/newview/skins/default/xui/ja/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="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ã‚’è¡¨ç¤º" name="show_group"/> - <menu_item_call label="グループをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> - <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ã‚’è¡¨ç¤º" name="show_group"/> + <menu_item_call label="グループをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> + <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_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 8abb5cead666f9e9ba71659abb6e63d272ff6bc0..c2f4f24db6a83b4debe39d08a69d0d9cdf7f76ea 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_external"/> - <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> -</context_menu> +<?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_external"/> + <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml index 1746e163b6b5b4afa1948e3f0e52697a7d72d3e5..b478d9d6c03dda9c4c7cc66f3421b36608c1e6fe 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_object"/> - <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> - <menu_item_call label="オブジェクトåをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> - <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_object"/> + <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> + <menu_item_call label="オブジェクトåをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> + <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml index 05639f086e817d1b10346eec056f724d33b79311..38e31de3f7c58505420934b17eb12d4e8114b6ad 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="åŒºç”»æƒ…å ±ã‚’è¡¨ç¤º" name="show_parcel"/> - <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="åŒºç”»æƒ…å ±ã‚’è¡¨ç¤º" name="show_parcel"/> + <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml index e66da8e9b9306c41ea3f71e07bffe54a203e3d98..d280ecf6899e09c693bff831fc786a17a0256420 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="å ´æ‰€ã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_place"/> - <menu_item_call label="ç¾åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_location"/> - <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="å ´æ‰€ã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_place"/> + <menu_item_call label="ç¾åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_location"/> + <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml index 0239e0e0e673728fdf5c30cf63f8c7075dc65b6d..355f6eb018349afdce299ff273fc0b83bbe15667 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<context_menu name="Url Popup"> - <menu_item_call label="ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport"/> - <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> -</context_menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport"/> + <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" 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 bb33a14be4a8e0fedc25f0af6dfa188ea9cb54ab..77aeeefe02d20ac70b3d190831f886809476171c 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> + <menu name="Me"> + <menu_item_call label="環境è¨å®š" 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=ja" /> + </menu_item_call> + </menu> <menu label="ファイル" name="File"> <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> <menu label="アップãƒãƒ¼ãƒ‰" name="upload"> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index ce50a33f1cdd657a55a43708af39839550edb83f..fca7c8918358fb07052cddbf1a7c9b45055c09c4 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -1,2685 +1,2685 @@ -<?xml version="1.0" encoding="utf-8"?> -<notifications> - <global name="skipnexttime"> - 今後ã¯è¡¨ç¤ºã—ãªã„ - </global> - <global name="alwayschoose"> - 常ã«ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠž - </global> - <global name="implicitclosebutton"> - é–‰ã˜ã‚‹ - </global> - <template name="okbutton"> - <form> - <button name="OK" text="$yestext"/> - </form> - </template> - <template name="okignore"/> - <template name="okcancelbuttons"> - <form> - <button name="Cancel" text="$notext"/> - </form> - </template> - <template name="okcancelignore"/> - <template name="okhelpbuttons"> - <form> - <button name="Help" text="$helptext"/> - </form> - </template> - <template name="yesnocancelbuttons"> - <form> - <button name="Yes" text="$yestext"/> - <button name="No" text="$notext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="䏿˜Žãªè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert"> - ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä»Šå—ã‘å–ã£ãŸè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 - -エラー詳細: 「[_NAME]ã€ã¨ã„ã†è¦å‘Šã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FloaterNotFound"> - フãƒãƒ¼ã‚¿ãƒ»ã‚¨ãƒ©ãƒ¼ï¼šä¸‹è¨˜ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š -[CONTROLS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TutorialNotFound"> - ç¾åœ¨åˆ©ç”¨å¯èƒ½ãªãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã¯ã‚りã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GenericAlert"> - [MESSAGE] - </notification> - <notification name="GenericAlertYesCancel"> - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ã¯ã„"/> - </notification> - <notification name="BadInstallation"> - [APP_NAME] をアップデートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ 最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 http://get.secondlife.com - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LoginFailedNoNetwork"> - [SECOND_LIFE_GRID] ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -「[DIAGNOSTIC]〠-インターãƒãƒƒãƒˆæŽ¥ç¶šãŒæ£å¸¸ã‹ã”確èªãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MessageTemplateNotFound"> - メッセージテンプレート [PATH] ãŒã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="WearableSave"> - ç¾åœ¨ã®è¡£æœ/ボディーパーツã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> - </notification> - <notification name="CompileQueueSaveText"> - 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テã‚ストã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CompileQueueSaveBytecode"> - 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="WriteAnimationFail"> - ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãè¾¼ã¿ã«å•題ãŒã‚りã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="UploadAuctionSnapshotFail"> - 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] - </notification> - <notification name="UnableToViewContentsMoreThanOne"> - 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="SaveClothingBodyChanges"> - è¡£æœï¼èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å˜"/> - </notification> - <notification name="GrantModifyRights"> - ä»–ã®ä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒæ‰€æœ‰ã—ã¦ã„ã‚‹ -ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 -[FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="GrantModifyRightsMultiple"> - 変更権é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒä½œæˆã—ãŸå…¨ã¦ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã«ã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 -é¸æŠžã—ãŸä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="RevokeModifyRights"> - [FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="RevokeModifyRightsMultiple"> - é¸æŠžã—ãŸä½äººã‹ã‚‰å¤‰æ›´æ¨©é™ã‚’å–り下ã’ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="UnableToCreateGroup"> - グループを作æˆã§ãã¾ã›ã‚“。 -[MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PanelGroupApply"> - [NEEDS_APPLY_MESSAGE] -[WANT_APPLY_MESSAGE] - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="変更を無視" yestext="変更をé©ç”¨"/> - </notification> - <notification name="MustSpecifyGroupNoticeSubject"> - グループ通知ã®é€ä¿¡ã«ã¯ã€ä»¶åã®è¨˜å…¥ãŒå¿…è¦ã§ã™ã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AddGroupOwnerWarning"> - ã‚ãªãŸã¯ [ROLE_NAME]ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -任命ã•れãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€ -彼らを役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。 -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="グループオーナーを新ã—ãè¿½åŠ ã™ã‚‹å‰ã«ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="AssignDangerousActionWarning"> - ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ -与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ - - *è¦å‘Š* -ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ -自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€ -自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã« -任命ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰ -実行ã—ã¦ãã ã•ã„。 - -ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="AssignDangerousAbilityWarning"> - ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ -与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ - - *è¦å‘Š* -ã“ã®èƒ½åŠ›ã‚’ã‚‚ã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ -自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã€ -自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚ - -ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="JoinGroupCanAfford"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã«ã¯ã€L$[COST]ã‹ã‹ã‚Šã¾ã™ã€‚ -続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚åŠ "/> - </notification> - <notification name="JoinGroupCannotAfford"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$[COST]å¿…è¦ã§ã™ã€‚ -L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="CreateGroupCost"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$100 ã‹ã‹ã‚Šã¾ã™ã€‚ -一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ -48時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—入会ã—ã¦ã‚‚らã£ã¦ãã ã•ã„。 - <usetemplate canceltext="ã‚ャンセル" name="okcancelbuttons" notext="ã‚ャンセル" yestext="L$100 ã§ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/> - </notification> - <notification name="LandBuyPass"> - L$[COST]ã§ [TIME]時間ã“ã®åœŸåœ°[PARCEL_NAME]ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -å…¥å ´è¨±å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SalePriceRestriction"> - ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€ -売å´ä¾¡æ ¼ã¯L$0以上ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -売å´ä¾¡æ ¼ã‚’L$0ã«è¨å®šã™ã‚‹å ´åˆã¯ã€ -売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ConfirmLandSaleChange"> - é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—ä¸ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ -売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmLandSaleToAnyoneChange"> - 注:「誰ã«ã§ã‚‚売å´ã™ã‚‹ã€ã‚’クリックã™ã‚‹ã¨ã€ -ã‚ãªãŸã®åœŸåœ°ã¯[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã®ã©ã“ã‹ã‚‰ã§ã‚‚ -(ã“ã®åœ°åŸŸã«ãªã„コミュニティをå«ã‚€ï¼‰è³¼å…¥ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ - -é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€ -売り出ã—ä¸ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ -売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ReturnObjectsDeededToGroup"> - ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ—[NAME]共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - -*è¦å‘Š* ã“れã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•れãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedByUser"> - ã“ã®åŒºç”»ã§ã€ -ä½äºº[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]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚ - -*è¦å‘Š* ã“れã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•れãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnAllTopObjects"> - å…¨ã¦ã®ãƒªã‚¹ãƒˆã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’æ‰€æœ‰è€…ã«æœ¬å½“ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DisableAllTopObjects"> - ã“ã®åœ°åŸŸå†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByGroup"> - ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—[NAME] -ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトをオーナーã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ - -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="UnableToDisableOutsideScripts"> - スクリプトを無効ã«ã§ãã¾ã›ã‚“。 -ã“ã®åœ°åŸŸå…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ -æ¦å™¨ã‚’使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - </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"> - スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼ - </notification> - <notification name="ErrorUploadingPostcard"> - 次ã®ç†ç”±ã§ã€ã‚¹ãƒŠãƒƒãƒ—ショットã®é€ä¿¡æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸï¼š [REASON] - </notification> - <notification name="ErrorUploadingReportScreenshot"> - 次ã®ç†ç”±ã§ã€ãƒ¬ãƒãƒ¼ãƒˆã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] - </notification> - <notification name="MustAgreeToLogIn"> - [SECOND_LIFE] ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CouldNotPutOnOutfit"> - æœè£…を装ç€ã§ãã¾ã›ã‚“。 -æœè£…フォルダã«è¡£æœã€èº«ä½“部ä½ã€ä»˜å±žå“ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="CannotWearTrash"> - ゴミ箱ã«ã‚ã‚‹æœã‚„ボディーパーツã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotWearInfoNotComplete"> - ã¾ã èªã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ を装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„り直ã—ã¦ãã ã•ã„。 - </notification> - <notification name="MustHaveAccountToLogIn"> - ãŠã£ã¨! 記入æ¼ã‚ŒãŒã‚りã¾ã™ã‚ˆã€‚ -ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - -[SECOND_LIFE]ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ - <url name="url"> - https://join.secondlife.com/index.php?lang=ja-JP - </url> - <usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/> - </notification> - <notification name="AddClassified"> - 検索ディレクトリã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイドã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã€ -クラシファイド広告ãŒ1週間掲載ã•れã¾ã™ã€‚ -広告を記入後ã€ã€Œå…¬é–‹ã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã« -è¿½åŠ ã—ã¾ã™ã€‚ -「公開ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•金é¡ã‚’å°‹ãられã¾ã™ã€‚ -å¤šãæ‰•ã†ã»ã©ã€åºƒå‘ŠãŒã‚¯ãƒ©ã‚·ãƒ•ァイド・リストã¨ã‚ーワード検索 -ã®ä¸Šä½ã«è¡¨ç¤ºã•れã¾ã™ã€‚ - <usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DeleteClassified"> - クラシファイド広告[NAME]ã®å‰Šé™¤ã‚’ã—ã¾ã™ã‹ï¼Ÿ -æ”¯æ‰•ã„æ¸ˆã¿ã®æ–™é‡‘ã¯è¿”金ã•れã¾ã›ã‚“。 - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ClassifiedSave"> - クラシファイド広告[NAME]ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> - </notification> - <notification name="DeleteAvatarPick"> - ピック[PICK]を削除ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="PromptGoToEventsPage"> - [SECOND_LIFE]イベント・ウェブ・ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://jp.secondlife.com/events/ - </url> - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SelectProposalToView"> - 表示ã™ã‚‹ææ¡ˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="SelectHistoryItemToView"> - 表示ã™ã‚‹å±¥æ´ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ResetShowNextTimeDialogs"> - ã“れらã®ãƒãƒƒãƒ—アップ全ã¦ã‚’å†åº¦æœ‰åŠ¹åŒ–ã—ã¾ã™ã‹ï¼Ÿï¼ˆä»¥å‰ã€Œä»Šå¾Œã¯è¡¨ç¤ºã—ãªã„ã€ã¨æŒ‡å®šã—ã¦ã„ã¾ã™ï¼‰ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - スã‚ップå¯èƒ½ãªãƒãƒƒãƒ—アップ全ã¦ã‚’無効化ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="CacheWillClear"> - [APP_NAME]ã®å†èµ·å‹•後ã«ã‚ャッシュãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚ - </notification> - <notification name="CacheWillBeMoved"> - [APP_NAME]ã®å†èµ·å‹•後ã«ã‚ャッシュãŒç§»å‹•ã•れã¾ã™ã€‚ -注æ„:ã“れã«ã‚ˆã‚Šã‚ャッシュãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚ - </notification> - <notification name="ChangeConnectionPort"> - ãƒãƒ¼ãƒˆã®è¨å®šã¯ã€[APP_NAME]ã®å†èµ·å‹•å¾Œã«æœ‰åйã«ãªã‚Šã¾ã™ã€‚ - </notification> - <notification name="ChangeSkin"> - æ–°ã—ã„スã‚ンã¯[APP_NAME]ã‚’å†èµ·å‹•ã™ã‚‹ã¨ç¾ã‚Œã¾ã™ - </notification> - <notification name="GoToAuctionPage"> - [SECOND_LIFE]ウェブ・ページã«ç§»å‹•ã—〠入æœã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] - </url> - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SaveChanges"> - 変更をä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> - </notification> - <notification name="GestureSaveFailedTooManySteps"> - ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ -ステップãŒå¤šã™ãŽã¾ã™ã€‚ -ステップをã„ãã¤ã‹å‰Šé™¤ã—ã¦ã‹ã‚‰å†ä¿å˜ã—ã¦ãã ã•ã„ - </notification> - <notification name="GestureSaveFailedTryAgain"> - ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚å°‘ã—å¾…ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="GestureSaveFailedObjectNotFound"> - ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ - </notification> - <notification name="GestureSaveFailedReason"> - 次ã®ç†ç”±ã§ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã®ä¿å˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="SaveNotecardFailObjectNotFound"> - ノートカードã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ - </notification> - <notification name="SaveNotecardFailReason"> - 次ã®ç†ç”±ã§ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ScriptCannotUndo"> - ã‚ãªãŸã®ã‚¹ã‚¯ãƒªãƒ—トã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€å¤‰æ›´ã‚’å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -サーãƒãƒ¼ã®æœ€æ–°ä¿å˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ -(**è¦å‘Š**:ã“ã®æ“ä½œå¾Œå…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“) - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="SaveScriptFailReason"> - 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="SaveScriptFailObjectNotFound"> - スクリプトã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚スクリプトãŒå…¥ã£ãŸã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトã¯ç¯„囲外ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 - </notification> - <notification name="SaveBytecodeFailReason"> - 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="StartRegionEmpty"> - ãƒã‚°ã‚¤ãƒ³ä½ç½®ãŒä¸æ˜Žã§ã™ã€‚ -ãƒã‚°ã‚¤ãƒ³ä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œè‡ªå®…(ホーム)ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CouldNotStartStopScript"> - スクリプトã®èµ·å‹•ã¾ãŸã¯åœæ¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚¹ã‚¯ãƒªãƒ—ãƒˆãŒæ ¼ç´ã•れã¦ã„るオブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ - </notification> - <notification name="CannotDownloadFile"> - ファイルをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotWriteFile"> - ファイル[[FILE]]を書ãè¾¼ã‚ã¾ã›ã‚“。 - </notification> - <notification name="UnsupportedHardware"> - è¦å‘Šï¼š ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ 㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 ã“ã®ã¾ã¾ [APP_NAME] を使用ã™ã‚‹ã¨ã€ãƒ‘フォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。 - -最低動作環境 -[_URL] ã§è©³ã—ã„æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ - <url name="url" option="0"> - http://secondlife.com/support/sysreqs.php?lang=ja - </url> - <usetemplate ignoretext="使用ã—ã¦ã„るコンピューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="UnknownGPU"> - ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€ç¾åœ¨ [APP_NAME] ãŒèªè˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæè¼‰ã•れã¦ã„ã¾ã™ã€‚ -[APP_NAME] ã§ã¾ã テストã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ [APP_NAME] ã¯æ£å¸¸ã«å®Ÿè¡Œã•れるå¯èƒ½æ€§ãŒé«˜ã„ã§ã™ãŒã€è¡¨ç¤ºè¨å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 -(環境è¨å®š > 表示) - <form name="form"> - <ignore name="ignore" text="使用ä¸ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè˜ã•れã¾ã›ã‚“ã§ã—ãŸ"/> - </form> - </notification> - <notification name="DisplaySettingsNoShaders"> - [APP_NAME] ã¯ã€ -グラフィック・ドライãƒã®åˆæœŸåŒ–ä¸ã«ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚ -一般的ãªãƒ‰ãƒ©ã‚¤ãƒãƒ»ã‚¨ãƒ©ãƒ¼ã‚’回é¿ã™ã‚‹ãŸã‚ã€ã€Œå“質ãŠã‚ˆã³ãƒ‘フォーマンスã€ã¯ã€Œä½Žã€ã«è¨å®šã•れã¾ã™ã€‚ -ã“れã«ã‚ˆã‚Šã€ã„ãã¤ã‹ã®ã‚°ãƒ©ãƒ•ィックス機能ã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚ -グラフィックカード・ドライãƒã®ã‚¢ãƒƒãƒ—デートをãŠå‹§ã‚ã—ã¾ã™ã€‚ -「グラフィックã®å“質ã€ã¯ã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œè¡¨ç¤ºã€ã‹ã‚‰ä¸Šã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="RegionNoTerraforming"> - ã“ã®åœ°åŸŸ[REGION] ã¯ã€ãƒ†ãƒ©ãƒ•ォーミングãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotCopyWarning"> - ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを -許ã•れã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’る㨠-æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ 本当㫠-ã“れをã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="CannotGiveItem"> - æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ を渡ã›ã¾ã›ã‚“。 - </notification> - <notification name="TransactionCancelled"> - å–引ãŒã‚ャンセルã•れã¾ã—ãŸã€‚ - </notification> - <notification name="TooManyItems"> - 一度ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªäº¤æ›ã§ã€42以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯é€ã‚Œã¾ã›ã‚“。 - </notification> - <notification name="NoItems"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã§ãる権é™ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="CannotCopyCountItems"> - ã‚ãªãŸã¯é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®[COUNT]ã®ã‚³ãƒ”ーを -許ã•れã¦ã„ã¾ã›ã‚“。 -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ -本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="CannotGiveCategory"> - é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’è²æ¸¡ã§ãる権é™ãŒã‚りã¾ã›ã‚“ - </notification> - <notification name="FreezeAvatar"> - ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ -ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ -ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/> - </notification> - <notification name="FreezeAvatarFullname"> - [AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ -フリーズã•れãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/> - </notification> - <notification name="EjectAvatarFullname"> - ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰[AVATAR_NAME]を追放ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ¢" yestext="追放"/> - </notification> - <notification name="EjectAvatarNoBan"> - ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> - </notification> - <notification name="EjectAvatarFullnameNoBan"> - [AVATAR_NAME] ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> - </notification> - <notification name="AcquireErrorTooManyObjects"> - å–å¾—ã‚¨ãƒ©ãƒ¼ï¼šé¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚ - </notification> - <notification name="AcquireErrorObjectSpan"> - å–得エラー: -オブジェクトãŒè¤‡æ•°ã®åœ°åŸŸã«ã¾ãŸãŒã£ã¦å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ -å–å¾—ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ -ã™ã¹ã¦åŒã˜åœ°åŸŸå†…ã«ç§»å‹•ã•ã›ã¦ãã ã•ã„。 - </notification> - <notification name="PromptGoToCurrencyPage"> - [EXTRA] - -[_URL] ã§ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«è³¼å…¥ã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://jp.secondlife.com/currency/ - </url> - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="UnableToLinkObjects"> - ã“れらã®[COUNT]オブジェクトをリンクã§ãã¾ã›ã‚“。 -最大[MAX]オブジェクトをリンクã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="CannotLinkIncompleteSet"> - セットã¨ã—ã¦æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚複数㮠-ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotLinkModify"> - ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¿®æ£è¨±å¯ãŒã‚ãªãŸã«ãªã„ãŸã‚〠-リンクã§ãã¾ã›ã‚“。 - -オブジェクトãŒã™ã¹ã¦ãƒãƒƒã‚¯ã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotLinkDifferentOwners"> - 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを -リンクã§ãã¾ã›ã‚“。 - -è‡ªåˆ†ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="NoFileExtension"> - ファイル「[FILE]ã€ã®æ‹¡å¼µåãŒç„¡åйã§ã™ã€‚ - -ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µåãŒæ£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。 - </notification> - <notification name="InvalidFileExtension"> - ファイル拡張å[EXTENSION]ã¯ç„¡åйã§ã™ -æ£ã—ã„æ‹¡å¼µå:[VALIDS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotUploadSoundFile"> - èªã¿è¾¼ã¿ã®ãŸã‚ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•れãŸã‚µã‚¦ãƒ³ãƒ‰ãƒ•ァイルを開ã‘ã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileNotRIFF"> - ファイルãŒRIFF WAVEファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileNotPCM"> - ファイルãŒPCM WAVEオーディオ・ファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileInvalidChannelCount"> - ファイルã®ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒç„¡åйã§ã™ï¼ˆãƒ¢ãƒŽãƒ©ãƒ«ã¾ãŸã¯ã‚¹ãƒ†ãƒ¬ã‚ªã‚’使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š -[FILE] - </notification> - <notification name="SoundFileInvalidSampleRate"> - ファイルã®ã‚µãƒ³ãƒ—ル・レートãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ44.1kを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š -[FILE] - </notification> - <notification name="SoundFileInvalidWordSize"> - ファイルã®ãƒ¯ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ8ã¾ãŸã¯16ビットを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š -[FILE] - </notification> - <notification name="SoundFileInvalidHeader"> - WAVヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileInvalidTooLong"> - オーディオ・ファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大10秒): -[FILE] - </notification> - <notification name="ProblemWithFile"> - ファイル[FILE]ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚ - -[ERROR] - </notification> - <notification name="CannotOpenTemporarySoundFile"> - 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンド・ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE] - </notification> - <notification name="UnknownVorbisEncodeFailure"> - 未知ã®Vorbis æš—å·åŒ–ã«å¤±æ•—: [FILE] - </notification> - <notification name="CannotEncodeFile"> - 次ã®ãƒ•ァイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE] - </notification> - <notification name="CorruptResourceFile"> - ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイル: [FILE] - </notification> - <notification name="UnknownResourceFileVersion"> - 未知ã®lindenリソースファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE] - </notification> - <notification name="UnableToCreateOutputFile"> - æœè£…ファイルを作æˆã§ãã¾ã›ã‚“: [FILE] - </notification> - <notification name="DoNotSupportBulkAnimationUpload"> - ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotUploadReason"> - 次ã®ç†ç”±ã§ã€[FILE] をアップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“: [REASON] -ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="LandmarkCreated"> - 「 [LANDMARK_NAME] ã€ã‚’「 [FOLDER_NAME] ã€ãƒ•ォルダã«è¿½åŠ ã—ã¾ã—ãŸã€‚ - </notification> - <notification name="CannotCreateLandmarkNotOwner"> - åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚〠-ランドマークを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotRecompileSelectObjectsNoScripts"> - å†ç·¨é›†ã¯ä¸å¯èƒ½ã§ã™ã€‚ -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotRecompileSelectObjectsNoPermission"> - 「å†ç·¨é›†ã€ã¯ä¸å¯èƒ½ã§ã™ã€‚ - -å¤‰æ›´ä¿®æ£æ¨©é™ã®ã‚ã‚‹ -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotResetSelectObjectsNoScripts"> - 「å†è¨å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotResetSelectObjectsNoPermission"> - 「å†è¨å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -å¤‰æ›´ä¿®æ£æ¨©é™ã®ã‚ã‚‹ -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotSetRunningSelectObjectsNoScripts"> - スクリプトã®ã€Œå®Ÿè¡Œã€ã®è¨å®šãŒã§ãã¾ã›ã‚“。 - -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - スクリプトを「実行ã—ãªã„ã€ã«è¨å®šã§ãã¾ã›ã‚“。 - -スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="NoFrontmostFloater"> - ä¿å˜ã™ã¹ãfrontmostフãƒãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="SeachFilteredOnShortWords"> - 指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•れã€çŸã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚ - -検索語å¥ï¼š [FINALQUERY] - </notification> - <notification name="SeachFilteredOnShortWordsEmpty"> - 指定ã—ãŸæ¤œç´¢èªžå¥ãŒçŸã™ãŽãŸãŸã‚ã€æ¤œç´¢ã¯è¡Œã‚れã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="CouldNotTeleportReason"> - テレãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ -[REASON] - </notification> - <notification name="invalid_tport"> - テレãƒãƒ¼ãƒˆå‡¦ç†ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 - </notification> - <notification name="invalid_region_handoff"> - リージョン間ã®ç§»å‹•ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[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"> - æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotSetLandOwnerNothingSelected"> - 土地所有者è¨å®šãŒã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotSetLandOwnerMultipleRegions"> - 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚〠-åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ForceOwnerAuctionWarning"> - ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã•れã¦ã„ã¾ã™ã€‚ -åŒºç”»ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ãŒç„¡åйã«ãªã‚Šã€ -å…¥æœãŒé–‹å§‹ã—ã¦ã„ãŸã‚‰ä¸æº€ã«æ€ã†ä½äººãŒå‡ºã¦ãã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 -所有権をå–å¾—ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="CannotContentifyNothingSelected"> - コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š -区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotContentifyNoRegion"> - コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š -土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandNothingSelected"> - åœŸåœ°ã‚’ç ´æ£„ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandNoRegion"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotBuyLandNothingSelected"> - 土地を購入ã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotBuyLandNoRegion"> - 土地を購入ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </notification> - <notification name="CannotCloseFloaterBuyLand"> - [APP_NAME]ã«ã‚ˆã‚‹ã€ -ã“ã®å–引ã®è¦‹ç©ã‚ŠãŒå®Œäº†ã™ã‚‹ã¾ã§ã€ŒåœŸåœ°ã‚’購入ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandNothingSelected"> - åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandNoGroup"> - åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: -グループãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandNoRegion"> - åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandMultipleSelected"> - åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: -複数ã®åŒºç”»ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚ - -ã“れより1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ParcelCanPlayMedia"> - ã“ã“ã§ã¯ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢å†ç”ŸãŒå¯èƒ½ã§ã™ã€‚ -メディアã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã«ã¯ã€é«˜é€Ÿãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šç’°å¢ƒãŒå¿…è¦ã§ã™ã€‚ - -利用å¯èƒ½ã«ãªã£ãŸã‚‰å†ç”Ÿã—ã¾ã™ã‹ï¼Ÿ -(ã“ã®ã‚ªãƒ—ションã¯ã€ã€Œç’°å¢ƒè¨å®šã€ï¼žã€ŒéŸ³å£°ã¨ãƒ“デオã€ã§å¾Œã‹ã‚‰ã§ã‚‚変更ã§ãã¾ã™ï¼‰ - <usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアをå†ç”Ÿ"/> - </notification> - <notification name="CannotDeedLandWaitingForServer"> - åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: -サーãƒãƒ¼ã‹ã‚‰ã®æ‰€æœ‰æ¨©æƒ…å ±ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ - -å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 - </notification> - <notification name="CannotDeedLandNoTransfer"> - åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: -ã“ã®åœ°åŸŸ [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandWatingForServer"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -サーãƒãƒ¼ãŒåŒºç”»æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ - -ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotReleaseLandSelected"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã‚ãªãŸã¯ã€é¸æŠžã—ãŸã™ã¹ã¦ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。 - -1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotReleaseLandDontOwn"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã‚ãªãŸã¯ã“ã®åœŸåœ°ã‚’手放ã™ã“ã¨ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“。 -ã‚ãªãŸã®åŒºç”»ã¯ç·‘色ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="CannotReleaseLandRegionNotFound"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandNoTransfer"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã“ã® [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandPartialSelection"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -åŒºç”»å…¨ä½“ã‚’é¸æŠžã—ã¦ç ´æ£„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - -åŒºç”»å…¨ä½“ã‚’é¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ReleaseLandWarning"> - ã‚ãªãŸã¯ã€[AREA]平方メートルã®åœŸåœ°ã‚’ç ´æ£„ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã“ã®åŒºç”»ã‚’ç ´æ£„ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€ -L$ã¯è¿”金ã•れã¾ã›ã‚“。 - -åœŸåœ°ã‚’ç ´æ£„ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNothingSelected"> - 土地を分割ã§ãã¾ã›ã‚“: - -区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotDivideLandPartialSelection"> - 土地を分割ã§ãã¾ã›ã‚“: - -区画全体ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚ -区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="LandDivideWarning"> - ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚ -区画ã”ã¨ã®è¨å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨å®šãŒãƒ‡ãƒ•ォルトã«ãƒªã‚»ãƒƒãƒˆã•れã¾ã™ã€‚ - -土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNoRegion"> - 土地を分割ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotJoinLandNoRegion"> - 土地を統åˆã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotJoinLandNothingSelected"> - 土地を統åˆã§ãã¾ã›ã‚“ã§ã—ãŸï¼š -区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotJoinLandEntireParcelSelected"> - 土地を統åˆã§ãã¾ã›ã‚“: -1ã¤ã®åŒºç”»ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。 - -両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotJoinLandSelection"> - 土地を統åˆã§ãã¾ã›ã‚“: -1ã¤ä»¥ä¸Šã®åŒºç”»ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - -両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="JoinLandWarning"> - ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹ -å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦1ã¤ã®å¤§ããªåŒºç”»ãŒä½œæˆã•れã¾ã™ã€‚ -æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - -土地を統åˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmNotecardSave"> - ã“ã®ã‚¢ã‚¤ãƒ†ãƒ をコピーã€è¡¨ç¤ºã™ã‚‹å‰ã«ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜ãŒå¿…è¦ã§ã™ã€‚ ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmItemCopy"> - ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/> - </notification> - <notification name="ResolutionSwitchFail"> - è§£åƒåº¦ã‚’ [RESX]x[RESY]ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="ErrorUndefinedGrasses"> - ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¤ç‰©ï¼š[SPECIES] - </notification> - <notification name="ErrorUndefinedTrees"> - ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¨¹æœ¨ï¼š[SPECIES] - </notification> - <notification name="CannotSaveWearableOutOfSpace"> - 「[NAME]ã€ã‚’æœã®ãƒ•ァイルã«ä¿å˜ã§ãã¾ã›ã‚“。 コンピューター㮠-ディスクスペースを少ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ -ä¿å˜ã—ã¦ã¿ã¦ãã ã•ã„。 - </notification> - <notification name="CannotSaveToAssetStore"> - [NAME]ã‚’ä¸å¤®è³‡ç”£æ ¼ç´åº«ã«ä¿å˜ã§ãã¾ã›ã‚“。 -ã“れã¯ä¸€æ™‚çš„ãªä¸å…·åˆã§ã™ã€‚ -æœé£¾å“ãªã©ã‚’カスタマイズã—ã€æ•°åˆ†å¾Œã«ã‚‚ã†ä¸€åº¦ä¿å˜ã—ã¦ãã ã•ã„。 - </notification> - <notification name="YouHaveBeenLoggedOut"> - ã‚ãªãŸã¯[SECOND_LIFE]ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã—ãŸã€‚ - [MESSAGE] -「IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示ã€ã‚’クリックã™ã‚‹ã¨ã€ -ç¾åœ¨ã‚ã‚‹IMã¨ãƒãƒ£ãƒƒãƒˆã‚’確èªã§ãã¾ã™ã€‚ -確èªã—ãªã„å ´åˆã¯ã€Œçµ‚了ã€ã‚’クリックã—〠-ã™ãã«[APP_NAME]を終了ã—ã¦ãã ã•ã„。 - <usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/> - </notification> - <notification name="OnlyOfficerCanBuyLand"> - グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“: -ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriend"> - フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -[NAME] ã«ãƒ•レンドシップをé€ã‚Šã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriendWithMessage"> - フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -[NAME] ã«ãƒ•レンドシップã®ã‚ªãƒ•ァーをã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - フレンドã¨ã—ã¦ç™»éŒ²ã—ã¦ãれã¾ã™ã‹ï¼Ÿ - </input> - <button name="Offer" text="OK"/> - <button name="Cancel" text="ã‚ャンセル"/> - </form> - </notification> - <notification name="RemoveFromFriends"> - [FIRST_NAME] [LAST_NAME]をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="RemoveMultipleFromFriends"> - フレンドリストã‹ã‚‰è¤‡æ•°ã®ãƒ•レンドを削除ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </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]ãŒä¸‹é™ã§ã™ã€‚ - -金é¡ã‚’増やã—ã¦ãã ã•ã„。 - </notification> - <notification name="ConfirmObjectDeleteLock"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopy"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoOwn"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸Šã‚’ã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopy"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLock"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ - -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeNoOwn"> - å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ -ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ - -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLockNoOwn"> - 1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ -ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ -ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€ - -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="CantBuyLandAcrossMultipleRegions"> - 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。 - -é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="DeedLandToGroup"> - ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ -ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ -土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“ã€‚è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ - -ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ— -「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DeedLandToGroupWithContribution"> - ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—㌠-å分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ -ã“ã®è²æ¸¡ã«ã‚ˆã‚Šã€ -「[FIRST_NAME] [LAST_NAME]ã€ã‹ã‚‰ -グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•れã¾ã™ã€‚ -土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“。 -è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²æ–™é‡‘ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ - -ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DisplaySetToSafe"> - -safeオプションを指定ã—ãŸã®ã§ã€ -表示è¨å®šã¯ã‚»ãƒ¼ãƒ•・レベルã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="DisplaySetToRecommended"> - 表示è¨å®šã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã« -基ã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="ErrorMessage"> - [ERROR_MESSAGE] - </notification> - <notification name="AvatarMovedDesired"> - 目的地ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 -è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ - </notification> - <notification name="AvatarMovedLast"> - å‰å›žã„ãŸå ´æ‰€ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 -è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ - </notification> - <notification name="AvatarMovedHome"> - ホームãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 -è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ -æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’è¨å®šã—ãªãŠã™ã¨ã„ã„ã‹ã‚‚ã—れã¾ã›ã‚“。 - </notification> - <notification name="ClothingLoading"> - ç¾åœ¨è¡£é¡žã‚’ダウンãƒãƒ¼ãƒ‰ä¸ã§ã™ã€‚ -ã“ã®ã¾ã¾ [SECOND_LIFE] を通常通りã”使用ã„ãŸã ã‘ã¾ã™ã€‚他人ã‹ã‚‰ã¯ã‚ãªãŸã¯æ£ã—ã表示ã•れã¾ã™ã€‚ - <form name="form"> - <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã¾ã™"/> - </form> - </notification> - <notification name="FirstRun"> - [APP_NAME]ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ - -[SECOND_LIFE] ã®ä½¿ç”¨ãŒåˆã‚ã¦ã®æ–¹ã¯ã€ -ãƒã‚°ã‚¤ãƒ³å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆãŒå¿…è¦ã§ã™ã€‚ -www.secondlife.comã«ç§»å‹•ã—ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã„ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="続行" yestext="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."/> - </notification> - <notification name="LoginPacketNeverReceived"> - 接続ãŒãªã‹ãªã‹ã§ãã¾ã›ã‚“。 ãŠä½¿ã„ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‹ã€[SECOND_LIFE_GRID] ã®å•題ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ - -インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ã‹ã‚‰æ•°åˆ†å¾Œã«å†æŽ¥ç¶šã™ã‚‹ã‹ã€ãƒ˜ãƒ«ãƒ—をクリックã—㦠[SUPPORT_SITE] ã‚’ã”覧ã«ãªã‚‹ã‹ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’クリックã—ã¦ãƒ›ãƒ¼ãƒ ã«ç§»å‹•ã—ã¦ã¿ã¦ãã ã•ã„。 - <url name="url"> - http://jp.secondlife.com/support/ - </url> - <form name="form"> - <button name="OK" text="OK"/> - <button name="Help" text="ヘルプ"/> - <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> - </form> - </notification> - <notification name="WelcomeChooseSex"> - ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ - -矢å°ã‚ーを使用ã—ã¦æ©ãã¾ã™ã€‚ -ヘルプãŒå¿…è¦ãªã¨ãã‚„[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ -F1ã‚ーを押ã—ã¦ãã ã•ã„。 -男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。 -ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/> - </notification> - <notification name="NotEnoughCurrency"> - [NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚ - </notification> - <notification name="GrantedModifyRights"> - [FIRST_NAME] [LAST_NAME] ã®ã‚ªãƒ–ジェクトã®ç·¨é›†æ¨©é™ã‚’å¾—ã¾ã—ãŸã€‚ - </notification> - <notification name="RevokedModifyRights"> - [FIRST_NAME] [LAST_NAME] -ã®ã‚ªãƒ–ジェクトを修æ£ã™ã‚‹æ¨©é™ãŒå–り消ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="FlushMapVisibilityCaches"> - ã“ã®æ‰‹é †ã¯ã€ã“ã®åœ°åŸŸã®åœ°å›³ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚ -ã“れãŒä¾¿åˆ©ãªã®ã¯ãƒ‡ãƒãƒƒã‚°æ™‚ã®ã¿ã§ã™ã€‚ -(作æˆä¸ã¯5分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã« -æ›´æ–°ã•れã¾ã™ï¼‰ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyOneObjectOnly"> - 一度ã«ä¸€ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã¨è²·ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを一ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="OnlyCopyContentsOfSingleItem"> - 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="KickUsersFromRegion"> - ã“ã®åœ°åŸŸã®å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="EstateObjectReturn"> - [USER_NAME]ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="InvalidTerrainBitDepth"> - 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š -地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€ç„¡åйã®ãƒ“ット深度[TEXTURE_BIT_DEPTH]ã§ã™ã€‚ - -テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 - </notification> - <notification name="InvalidTerrainSize"> - 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š -地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚ - -テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 - </notification> - <notification name="RawUploadStarted"> - アップãƒãƒ¼ãƒ‰é–‹å§‹ã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€ -最大2分間ã‹ã‹ã‚Šã¾ã™ã€‚ - </notification> - <notification name="ConfirmBakeTerrain"> - ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ï¼ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸å¿ƒã«ãªã‚Šã€ã€Œå¾©å¸°ã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="MaxAllowedAgentOnRegion"> - 許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚ - </notification> - <notification name="MaxBannedAgentsOnRegion"> - ç¦æ¢ä½äººã¯[MAX_BANNED]人ã¾ã§ã§ã™ã€‚ - </notification> - <notification name="MaxAgentOnRegionBatch"> - [NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿½åŠ ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="MaxAllowedGroupsOnRegion"> - 許å¯ã‚°ãƒ«ãƒ¼ãƒ—ã¯[MAX_GROUPS]グループã¾ã§ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/> - </notification> - <notification name="MaxManagersOnRegion"> - ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯[MAX_MANAGER]人ã¾ã§ã§ã™ã€‚ - </notification> - <notification name="OwnerCanNotBeDenied"> - ä¸å‹•産オーナーをä¸å‹•ç”£ã€Œç¦æ¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CanNotChangeAppearanceUntilLoaded"> - æœãŠã‚ˆã³å½¢ãŒãƒãƒ¼ãƒ‰ã•れるã¾ã§ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ClassifiedMustBeAlphanumeric"> - クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ァベット㋠-æ•°å—ã§å§‹ã‚ã¾ã™ã€‚ å¥èªç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。 - </notification> - <notification name="CantSetBuyObject"> - オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒè¨å®šã§ãã¾ã›ã‚“。 -販売対象ã®ã‚ªãƒ–ジェクトをè¨å®šã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="FinishedRawDownload"> - æœªåŠ å·¥ã®åœ°å½¢ãƒ•ァイルを次ã¸ã¨ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š -[DOWNLOAD_PATH]。 - </notification> - <notification name="DownloadWindowsMandatory"> - [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã¯ã€ -ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadWindows"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadWindowsReleaseForDownload"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadLinuxMandatory"> - [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadLinux"> - [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadLinuxReleaseForDownload"> - [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadMacMandatory"> - [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã€ -ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - -アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadMac"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - -アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadMacReleaseForDownload"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - -アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DeedObjectToGroup"> - ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’è²æ¸¡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š -* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れãŸL$ã‚’å—é ˜ã—ã¾ã™ã€‚ - <usetemplate ignoretext="オブジェクトをグループã«è²æ¸¡ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="è²æ¸¡"/> - </notification> - <notification name="WebLaunchExternalTarget"> - Web ブラウザを開ã„ã¦ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見る" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="WebLaunchJoinNow"> - secondlife.com ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ç®¡ç†ã‚’ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="WebLaunchSecurityIssues"> - [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"/> - </notification> - <notification name="WebLaunchPublicIssue"> - [SECOND_LIFE]ã®ãƒ‘ブリックå•題トラッカーã§ã€ -ãƒã‚°ã‚„ãã®ä»–ã®å•é¡Œã‚’å ±å‘Šã§ãã¾ã™ã€‚ - <usetemplate ignoretext="ブラウザを確èªã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="ページã¸è¡Œã"/> - </notification> - <notification name="WebLaunchSupportWiki"> - Lindenå…¬å¼ãƒ–ãƒã‚°ã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„æƒ…å ±ã‚’å…¥æ‰‹ã—ã¦ãã ã•ã„。 - <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ãƒã‚°ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLGuide"> - スクリプトガイドを開ãã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLWiki"> - LSL ãƒãƒ¼ã‚¿ãƒ«ã§ã‚¹ã‚¯ãƒªãƒ—トã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> - </notification> - <notification name="ReturnToOwner"> - é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ -è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクト㯠-以å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚ - -*è¦å‘Š* 移転ãŒä¸å¯èƒ½ã®è²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ - <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="GroupLeaveConfirmMember"> - ç¾åœ¨ã‚ãªãŸã¯ [GROUP]ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚ -ã“ã“ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmKick"> - ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッド外ã«ã‚ックã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‚’追ã„出ã™"/> - </notification> - <notification name="MuteLinden"> - 残念ãªãŒã‚‰Lindenを無視è¨å®šã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotStartAuctionAlreadyForSale"> - æ—¢ã«å£²ã‚Šå‡ºã—ä¸ã®åŒºç”»ãªã®ã§ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«ã‹ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オークションã«ã‹ã‘ãŸã„å ´åˆã¯å£²ã‚Šå‡ºã—è¨å®šã‚’解除ã—ã¦ã‹ã‚‰è¡Œã£ã¦ãã ã•ã„。 - </notification> - <notification label="オブジェクトをåå‰ã§ãƒŸãƒ¥ãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" name="MuteByNameFailed"> - ã‚ãªãŸã¯ã™ã§ã«ã“ã®åå‰ã‚’ミュートã—ã¦ã„ã¾ã™ã€‚ - <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"/> - </notification> - <notification name="JoinedTooManyGroupsMember"> - åŠ å…¥ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れをæ–ã£ã¦ãã ã•ã„。 -[NAME] ãŒã‚ãªãŸã‚’グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦å‹§èª˜ã—ã¦ã„ã¾ã™ã€‚ -[INVITE] - <usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚åŠ "/> - </notification> - <notification name="KickUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="KickAllUsers"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="FreezeUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…ãŒIMを通ã˜ã¦ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="UnFreezeUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚‚ã†ãƒ•リーズã•れã¦ã„ã¾ã›ã‚“。 - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="OfferTeleport"> - 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã‚ãªãŸãŒä»Šã„ã‚‹å ´æ‰€ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="OfferTeleportFromGod"> - ユーザーをゴッド・コールã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="TeleportFromLandmark"> - 本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> - </notification> - <notification name="TeleportToPick"> - [PICK] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> - </notification> - <notification label="ã‚ãªãŸã®ä¸å‹•産内ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate"> - 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹ -çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </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]ã®ã™ã¹ã¦ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove"> - 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd"> - ã“ã®ä¸å‹•産ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove"> - 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd"> - ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATE]ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove"> - ã“ã®ä½äººã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã¸ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd"> - ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã«å¯¾ã—ã¦ã€ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove"> - ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> - </notification> - <notification label="ã‚ックを確èª" name="EstateKickUser"> - ã“ã®ä¸å‹•産ã‹ã‚‰[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/レーティング区分概è¦_(KB) - </url> - <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="RegionEntryAccessBlocked_Notify"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="RegionEntryAccessBlocked_Change"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ -ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 - <form name="form"> - <button name="OK" text="è¨å®šã®å¤‰æ›´"/> - <button default="true" name="Cancel" text="é–‰ã˜ã‚‹"/> - <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"/> - </form> - </notification> - <notification name="LandClaimAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ - -最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandClaimAccessBlocked_KB"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - -ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) - </url> - <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="LandClaimAccessBlocked_Notify"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="LandClaimAccessBlocked_Change"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - -「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ -ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> - </notification> - <notification name="LandBuyAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ - -最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandBuyAccessBlocked_KB"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - -ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) - </url> - <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="LandBuyAccessBlocked_Notify"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="LandBuyAccessBlocked_Change"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ -ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 - <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ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="NotAllowedToViewNotecard"> - è¦æ±‚ã•れãŸè³‡ç”£IDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MissingNotecardAssetID"> - ノートカード用資産IDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PublishClassified"> - 注æ„ï¼šã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã®æ–™é‡‘ã¯æ‰•ã„æˆ»ã—ã•れã¾ã›ã‚“。 - -L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SetClassifiedMature"> - ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="SetGroupMature"> - ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification label="å†èµ·å‹•を確èª" name="ConfirmRestart"> - ã“ã®åœ°åŸŸã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification label="ã“ã®åœ°åŸŸå†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion"> - ã“ã®åœ°åŸŸã«ã„る人全員ã«é€ã‚‹ -çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange"> - ã“ã®åœ°åŸŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚ -ã“ã®å¤‰æ›´ãŒåœ°å›³ã«åæ˜ ã•れるã¾ã§ã«ã¯ã—ã°ã‚‰ã時間ãŒã‹ã‹ã‚Šã¾ã™ã€‚ - </notification> - <notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch"> - ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® [APP_NAME] ã¯ã€ -ã“ã®åœ°åŸŸã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆæ©Ÿèƒ½ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。 -ボイスãƒãƒ£ãƒƒãƒˆã‚’æ£ã—ã使用ã™ã‚‹ã«ã¯ã€ -[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚ - </notification> - <notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner"> - 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly"> - 一度ã«è¤‡æ•°ã®ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner"> - 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="BuyOriginal"> - オリジナルã®ã‚ªãƒ–ジェクトを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€ -変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyOriginalNoOwner"> - L$[PRICE]ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ -ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€ -変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyCopy"> - コピーを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyCopyNoOwner"> - L$[PRICE]ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyContents"> - コンテンツを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyContentsNoOwner"> - 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ã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"/> - <button name="ConfirmPurchase" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="SetPickLocation"> - メモ: -本ピックã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€ -ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromObject"> - ã€Œã‚³ãƒ”ãƒ¼ç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚ - - -アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ をオブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromScriptedObject"> - ã€Œã‚³ãƒ”ãƒ¼ç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れるã®ã§ã¯ãªãã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚ -ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€æŒã¡ç‰©ã«ç§»å‹•ã•ã›ã‚‹ã¨ -スクリプトã«èª¤å‹•作ãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ - -æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を移動ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ClickActionNotPayable"> - è¦å‘Šï¼š クリックã§ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€è¨å®šã‚’ã—ã¾ã—ãŸã€‚スクリプト㫠money()イベントãŒè¿½åŠ ã•れるã¨å‹•作ã—ã¾ã™ã€‚ - <form name="form"> - <ignore name="ignore" text="money() スクリプトを入れãšã«ã‚ªãƒ–ジェクトを制作ä¸ã«ã€ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’è¨å®š"/> - </form> - </notification> - <notification name="OpenObjectCannotCopy"> - ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ã‚ãªãŸãŒã‚³ãƒ”ーã§ãるアイテムã¯ã‚りã¾ã›ã‚“。 - </notification> - <notification name="WebLaunchAccountHistory"> - secondlife.com ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> - </notification> - <notification name="ConfirmQuit"> - 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="終了時ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/> - </notification> - <notification name="HelpReportAbuseEmailLL"> - 利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã®å ±å‘Šã«ã“ã®ãƒ„ールをã”使用ãã ã•ã„。 å‚照: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php - -利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã«é–¢ã™ã‚‹å…¨ã¦ã®ãƒ¬ãƒãƒ¼ãƒˆã¯ã€èª¿æŸ»ã•れã€è§£æ±ºã•れã¾ã™ã€‚ -以下ã®ãƒªãƒ³ã‚¯å…ˆã®è¢«å®³å ±å‘Šã«ã¦ãã®ç¢ºèªã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - é‡è¦ï¼š ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã¯Linden Lab 社ã§ã¯ãªã〠-ã‚ãªãŸãŒç¾åœ¨ã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«é€ã‚‰ã‚Œã¾ã™ã€‚ -- -ã‚ãªãŸãŒä»Šã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ -ä½äººã¨è¨ªå•者ã¸ã®ã‚µãƒ¼ãƒ“スã®ä¸€ç’°ã¨ã—ã¦ã€ã“ã®åœ°åŸŸã‹ã‚‰ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’ã™ã¹ã¦å—ã‘付ã‘ã€è§£æ±ºã™ã‚‹ã“ã¨ã«åŒæ„ã—ã¦ã„ã¾ã™ã€‚ -よã£ã¦Linden Lab 社ãŒã€ -ã‚ãªãŸãŒã“ã“ã‹ã‚‰æå‡ºã™ã‚‹ãƒ¬ãƒãƒ¼ãƒˆã‚’調査ã™ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 -地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ä¸å‹•ç”£ç´„æ¬¾ã§æŒ‡å®šã—ã¦ã„る地元ã®è¦å‰‡ã‚’基ã«ã€å ±å‘Šã•れãŸå•題を解決ã—ã¾ã™ã€‚ -(「世界ã€ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã¨ã€ç´„款を閲覧ã§ãã¾ã™ï¼‰ -- -ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«é–¢ã™ã‚‹è§£æ±ºç–ã¯ã€ã“ã®åœ°åŸŸã«ã ã‘当ã¦ã¯ã¾ã‚Šã¾ã™ã€‚ -ä½äººãŒ[SECOND_LIFE] ã®ä»–ã®åœ°åŸŸã¸ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã€ -ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã®çµæžœã«å½±éŸ¿ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。 -Linden Lab 社ã ã‘ãŒ[SECOND_LIFE] 全域ã«ãŠã‘ã‚‹ -ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™æ¨©ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseSelectCategory"> - 嫌ãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。 -ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseAbuserNameEmpty"> - 嫌ãŒã‚‰ã›è¡Œç‚ºã‚’ã—ãŸäººã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。 -æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseAbuserLocationEmpty"> - 嫌ãŒã‚‰ã›ãŒã‚ã£ãŸå ´æ‰€ã‚’入力ã—ã¦ãã ã•ã„。 -æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseSummaryEmpty"> - 嫌ãŒã‚‰ã›ã®æ¦‚è¦ã‚’入力ã—ã¦ãã ã•ã„。 -æ£ç¢ºãªæ¦‚è¦ã®å…¥åŠ›ã«ã‚ˆã‚Šã€ -嫌ãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseDetailsEmpty"> - 嫌ãŒã‚‰ã›ã®è©³ç´°ãªèª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„。 -åå‰ã‚„嫌ãŒã‚‰ã›ã®è©³ç´°ã‚’ã€ã§ãã‚‹ã ã‘具体的ã«å…¥åŠ›ã—ã¦ãã ã•ã„。 - -æ£ç¢ºãªèª¬æ˜Žã®å…¥åŠ›ã«ã‚ˆã‚Šã€ -嫌ãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseContainsCopyright"> - ä½äººã®çš†æ§˜ã¸ã€ - -知的財産ã®ä¾µå®³ã«é–¢ã™ã‚‹å ±å‘Šã‚’行ã†éš›ã«ã¯ã€ä»¥ä¸‹ã®ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。 - -(1) 嫌ãŒã‚‰ã›ã®å ±å‘Šã®ãƒ—ãƒã‚»ã‚¹ -[SECOND_LIFE] ã®æ¨©é™ã‚·ã‚¹ãƒ†ãƒ を悪用ã—ã¦ã„ã‚‹ä½äººã‚’見ã¤ã‘ãŸã‚‰ã€ -嫌ãŒã‚‰ã›ã®å ±å‘Šã‚’行ã£ã¦ãã ã•ã„。 -例ãˆã°ã‚³ãƒ”ーBotã®ä½¿ç”¨ã€ãれã«ä¼¼ãŸãƒ„ールã®ä½¿ç”¨ã«ã‚ˆã‚‹çŸ¥çš„財産権ã®ä¾µå®³ãŒã‚りã¾ã™ã€‚ -アビューズãƒãƒ¼ãƒ ã¯èª¿æŸ»ã«åŸºã¥ã〠-[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã‚„ -利用è¦ç´„ã«é•åã™ã‚‹è¡Œç‚ºã¨åˆ¤æ–ã•れãŸå ´åˆã«ã¯é©åˆ‡ãªå‡¦ç½®ã‚’行ã£ã¦ã„ã¾ã™ã€‚ -ãŸã ã—ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’[SECOND_LIFE] ã‹ã‚‰æ’¤åŽ»ã—ã¦ã»ã—ã„〠-ã¨ã„ã£ãŸè¦æœ›ã«ã¯ã‚¢ãƒ“ューズãƒãƒ¼ãƒ ã¯å¿œãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -(2) DMCA(デジタルミレニアム著作権法)åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„撤去プãƒã‚»ã‚¹ -[SECOND_LIFE] ã‹ã‚‰ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã‚’ãƒªã‚¯ã‚¨ã‚¹ãƒˆã™ã‚‹ã«ã¯ã€ -è‘—ä½œæ¨©ä¾µå®³é€šçŸ¥ã®æå‡ºã‚’è¡Œã†å¿…è¦ãŒã‚りã¾ã™ã€‚ -å‚照: http://secondlife.com/corporate/dmca.php - -ã“ã®ä»¶ã«é–¢ã™ã‚‹å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ã‚‹éš›ã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦ãã ã•ã„ã€‚é¸æŠžã™ã¹ãカテゴリã¯ã€ŒçŸ¥çš„財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã»ã†ãŒé©ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“ã®ã§ã”確èªãã ã•ã„。 - -よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚ - -Linden Lab - </notification> - <notification name="FailedRequirementsCheck"> - 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER]ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™ -[COMPONENTS] - </notification> - <notification label="æ—¢å˜ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment"> - 体ã®ã“ã®éƒ¨ä½ã«ã¯ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚ -é¸æŠžã•れãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ - <form name="form"> - <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="ã‚ャンセル"/> - </form> - </notification> - <notification name="ConfirmEmptyTrash"> - ゴミ箱ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="æŒã¡ç‰©ã®ã‚´ãƒŸç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmClearBrowserCache"> - トラベルã€Webã€æ¤œç´¢ã®å±¥æ´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> - </notification> - <notification name="ConfirmClearCookies"> - 本当ã«ã‚¯ãƒƒã‚ーをクリアã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> - </notification> - <notification name="ConfirmClearMediaUrlList"> - ä¿å˜ã•れ㟠URL ã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> - </notification> - <notification name="ConfirmEmptyLostAndFound"> - 紛失物ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="CopySLURL"> - 次㮠SLurl ãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•れã¾ã—ãŸï¼š - [SLURL] - -Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Webブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。 - <form name="form"> - <ignore name="ignore" text="クリップボード㫠SLurl ãŒã‚³ãƒ”ーã•れる"/> - </form> - </notification> - <notification name="WLSavePresetAlert"> - ä¿å˜ã•れãŸäº‹å‰è¨å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="WLDeletePresetAlert"> - [SKY] を削除ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="WLNoEditDefault"> - デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="WLMissingSky"> - ã“ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。 - </notification> - <notification name="PPSaveEffectAlert"> - ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹åŠ¹æžœãŒå˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="NewSkyPreset"> - æ–°ã—ã„空ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"> - æ–°ã—ã„事å‰è¨å®š - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="ã‚ャンセル"/> - </form> - </notification> - <notification name="ExistsSkyPresetAlert"> - 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ - </notification> - <notification name="NewWaterPreset"> - æ–°ã—ã„æ°´ã®äº‹å‰è¨å®šã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"> - æ–°ã—ã„事å‰è¨å®š - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="ã‚ャンセル"/> - </form> - </notification> - <notification name="ExistsWaterPresetAlert"> - 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ - </notification> - <notification name="WaterNoEditDefault"> - デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ChatterBoxSessionStartError"> - [RECIPIENT]ã¨ã®æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ChatterBoxSessionEventError"> - [EVENT] -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ForceCloseChatterBoxSession"> - [NAME]ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚ -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="Cannot_Purchase_an_Attachment"> - オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¨ãã¯è³¼å…¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification label="デビット許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails"> - ã“ã®è¦æ±‚を許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’課金ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ -ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AutoWearNewClothing"> - 作æˆã—よã†ã¨ã—ã¦ã„る衣類を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="容姿編集画é¢ã§ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="NotAgeVerified"> - 年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’行ã„ã¾ã™ã‹ï¼Ÿ - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/verification.php?lang=ja - </url> - <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="Cannot enter parcel: no payment info on file"> - æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’行ã„ã¾ã™ã‹ï¼Ÿ - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/index.php?lang=ja - </url> - <usetemplate ignoretext="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="MissingString"> - æ–‡å—列[STRING_NAME]ãŒstrings.xmlã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ - </notification> - <notification name="SystemMessageTip"> - [MESSAGE] - </notification> - <notification name="Cancelled"> - å–り消ã•れã¾ã—㟠- </notification> - <notification name="CancelledSit"> - 座るã®ã‚’å–り消ã•れã¾ã—㟠- </notification> - <notification name="CancelledAttach"> - 添付ã¯å–り消ã•れã¾ã—㟠- </notification> - <notification name="ReplacedMissingWearable"> - æ¬ è½ã—ã¦ã„ã‚‹æœï¼èº«ä½“部ä½ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚ - </notification> - <notification name="GroupNotice"> - ä»¶å: [SUBJECT], メッセージ: [MESSAGE] - </notification> - <notification name="FriendOnline"> - [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ - </notification> - <notification name="FriendOffline"> - [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚ - </notification> - <notification name="AddSelfFriend"> - 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンドã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="UploadingAuctionSnapshot"> - インワールドã¨ã‚¦ã‚§ãƒ–・サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™... -ï¼ˆæ‰€è¦æ™‚間:約5分) - </notification> - <notification name="UploadPayment"> - アップãƒãƒ¼ãƒ‰ã« L$[AMOUNT] 支払ã„ã¾ã—ãŸã€‚ - </notification> - <notification name="UploadWebSnapshotDone"> - Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="UploadSnapshotDone"> - インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ - </notification> - <notification name="TerrainDownloaded"> - raw地形ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れã¾ã—㟠- </notification> - <notification name="GestureMissing"> - ジェスãƒãƒ£ãƒ¼[NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。 - </notification> - <notification name="UnableToLoadGesture"> - ジェスãƒãƒ£ãƒ¼[NAME] ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 -å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 - </notification> - <notification name="LandmarkMissing"> - データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="UnableToLoadLandmark"> - ランドマークをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CapsKeyOn"> - CapsLock ã‚ãƒ¼ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚ -パスワードã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 - </notification> - <notification name="NotecardMissing"> - ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。 - </notification> - <notification name="NotecardNoPermissions"> - ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’見る権é™ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="RezItemNoPermissions"> - オブジェクトをrezã™ã‚‹ã«ã¯ãƒ‘ーミッション(承èªï¼‰ãŒä¸è¶³ã—ã¦ã¾ã™ã€‚ - </notification> - <notification name="UnableToLoadNotecard"> - ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£ã‚’ãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ScriptMissing"> - データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="ScriptNoPermissions"> - スクリプトを閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ - </notification> - <notification name="UnableToLoadScript"> - スクリプトをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="IncompleteInventory"> - ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã“ã®å ´æ‰€ã§ã¯ã¾ã 全部æƒã„ã¾ã›ã‚“。 -å°‘ã—ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotModifyProtectedCategories"> - ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯ä¿®æ£ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotRemoveProtectedCategories"> - ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。 - </notification> - <notification name="OfferedCard"> - ã‚ãªãŸã¯[FIRST] [LAST] ã« -コーリング・カードをé€ã‚Šã¾ã—ãŸã€‚ - </notification> - <notification name="UnableToBuyWhileDownloading"> - オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 -ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="UnableToLinkWhileDownloading"> - オブジェクトデータã®ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。 -ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotBuyObjectsFromDifferentOwners"> - オブジェクトã¯ä¸€åº¦ã«ã¤ãä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚ -オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ãã ã•ã„。 - </notification> - <notification name="ObjectNotForSale"> - ã“ã®ã‚ªãƒ–ジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚りã¾ã›ã‚“。 - </notification> - <notification name="EnteringGodMode"> - レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™ - </notification> - <notification name="LeavingGodMode"> - レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã™ - </notification> - <notification name="CopyFailed"> - ã“れをコピーã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="InventoryAccepted"> - [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’å—ã‘入れã¾ã—ãŸã€‚ - </notification> - <notification name="InventoryDeclined"> - [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’æ–りã¾ã—ãŸã€‚ - </notification> - <notification name="ObjectMessage"> - [NAME]: [MESSAGE] - </notification> - <notification name="CallingCardAccepted"> - コーリング・カードãŒå—ç†ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="CallingCardDeclined"> - ã‚³ãƒ¼ãƒªãƒ³ã‚°ãƒ»ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="TeleportToLandmark"> - 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ -[NAME]ãªã©ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ï¼ˆLandmarksï¼‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 -ランドマークをダブルクリックã—ãŸå¾Œã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã™ã‚‹ã¨ãã®å ´æ‰€ã¸ç§»å‹•ã—ã¾ã™ã€‚ - </notification> - <notification name="TeleportToPerson"> - 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ -ä½äººã®[NAME]ã¨æŽ¥è§¦ã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ï¼ˆCalling Cardsï¼‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 -カードをダブルクリックã—ã€ã€ŒIMã‚’é€ã‚‹ã€ã‚’クリックã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CantSelectLandFromMultipleRegions"> - サーãƒãƒ¼ã®å¢ƒç•Œã‚’è¶Šãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。 -ã‚‚ã£ã¨å°ã•ãªåœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="SearchWordBanned"> - ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã«æ˜Žè¨˜ã•れã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="NoContentToSearch"> - å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„。(PG, Mature, Adult) - </notification> - <notification name="GroupVote"> - [NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š -[MESSAGE] - <form name="form"> - <button name="VoteNow" text="今ã™ã投票ã™ã‚‹"/> - <button name="Later" text="ã‚ã¨ã§"/> - </form> - </notification> - <notification name="SystemMessage"> - [MESSAGE] - </notification> - <notification name="EventNotification"> - イベント通知: - -[NAME] -[DATE] - <form name="form"> - <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> - <button name="Description" text="説明"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="TransferObjectsHighlighted"> - ã“ã®åŒºç”»ä¸Šã«å˜åœ¨ã™ã‚‹ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«è²æ¸¡ã•れるオブジェクトãŒã™ã¹ã¦å¼·èª¿è¡¨ç¤ºã•れã¾ã™ã€‚ - - -*è²æ¸¡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¾ã›ã‚“。 - <form name="form"> - <button name="Done" text="完了"/> - </form> - </notification> - <notification name="DeactivatedGesturesTrigger"> - åŒã˜ãƒˆãƒªã‚¬ãƒ¼ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã—ãªã„ジェスãƒãƒ£ãƒ¼ï¼š -[NAMES] - </notification> - <notification name="NoQuickTime"> - Apple社ã®QuickTimeãŒã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ã¨æ€ã‚れã¾ã™ã€‚ -ストリーミング・メディアã®å†ç”Ÿã‚’行ã„ãŸã„å ´åˆã¯ã€QuickTimeã®ã‚µã‚¤ãƒˆï¼ˆhttp://www.apple.com/quicktime)ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€QuickTime Player をインストールã—ã¦ãã ã•ã„。 - </notification> - <notification name="NoPlugin"> - 「 [MIME_TYPE] ã€ã® MIME タイプを扱ã†ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã¯ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 - </notification> - <notification name="MediaPluginFailed"> - 次ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒå®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸï¼š - [PLUGIN] - -プラグインをインストールã—ãªãŠã™ã‹ã€å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ãƒ¡ãƒ¼ã‚«ãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 - <form name="form"> - <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—"/> - </form> - </notification> - <notification name="OwnedObjectsReturned"> - é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="OtherObjectsReturned"> - é¸æŠžã•れã¦ã„る土地ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ - [FIRST] [LAST] - ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="OtherObjectsReturned2"> - é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚り〠-ä½äººã®[NAME]ã®æ‰€æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="GroupObjectsReturned"> - é¸æŠžã•れã¦ã„る区画上ã«ã‚りã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ -è²æ¸¡ã•れã¦ã„ãŸè²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ -グループã«è²æ¸¡ã•れã¦ã„ãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="UnOwnedObjectsReturned"> - é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚りã€ã‚ãªãŸã®æ‰€æœ‰ã§ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="NotSafe"> - ã“ã®åœŸåœ°ã§ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åйã§ã™ã€‚ -ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æ»ã‚“ã§ã—ã¾ã£ãŸå ´åˆã¯ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚ - </notification> - <notification name="NoFly"> - ã“ã®ã‚¨ãƒªã‚¢ã§ã¯é£›è¡ŒãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ -ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。 - </notification> - <notification name="PushRestricted"> - ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒåˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ -土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="NoVoice"> - ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åйã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="NoBuild"> - ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š 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="MustGetAgeParcel"> - ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ - </notification> - <notification name="NoDestRegion"> - 目的地ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="NotAllowedInDest"> - 目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="RegionParcelBan"> - ç«‹å…¥ç¦æ¢ã•れãŸåŒºç”»ã‚’横æ–ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 åˆ¥ã®æ–¹æ³•ã‚’ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="TelehubRedirect"> - テレãƒãƒ–ã«è»¢é€ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="CouldntTPCloser"> - ã“れ以上目的地ã«è¿‘ã„å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="TPCancelled"> - テレãƒãƒ¼ãƒˆãŒã‚ャンセルã•れã¾ã—ãŸã€‚ - </notification> - <notification name="FullRegionTryAgain"> - å…¥ã‚ã†ã¨ã—ã¦ã„る地域(リージョン)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚ -ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="GeneralFailure"> - よãã‚る失敗 - </notification> - <notification name="RoutedWrongRegion"> - ç•°ãªã‚‹åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="NoValidAgentID"> - エージェントIDãŒç„¡åйã§ã™ã€‚ - </notification> - <notification name="NoValidSession"> - セッションIDãŒç„¡åйã§ã™ã€‚ - </notification> - <notification name="NoValidCircuit"> - 回路コードãŒç„¡åйã§ã™ã€‚ - </notification> - <notification name="NoValidTimestamp"> - タイムスタンプãŒç„¡åйã§ã™ã€‚ - </notification> - <notification name="NoPendingConnection"> - 接続を生æˆã§ãã¾ã›ã‚“。 - </notification> - <notification name="InternalUsherError"> - 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ - </notification> - <notification name="NoGoodTPDestination"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="InternalErrorRegionResolver"> - 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ - </notification> - <notification name="NoValidLanding"> - 有効ãªç€åœ°ç‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="NoValidParcel"> - 有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="ObjectGiveItem"> - [FIRST] [LAST]所有ã®ã€ -[OBJECTFROMNAME]ã‹ã‚‰ã€ -[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ - <form name="form"> - <button name="Keep" text="å—ã‘å–ã‚‹"/> - <button name="Discard" text="ç ´æ£„"/> - <button name="Mute" text="無視リストã¸"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - (未知ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼‰ 所有ã®[OBJECTFROMNAME]ã‹ã‚‰ã€ -ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ - <form name="form"> - <button name="Keep" text="å—ã‘å–ã‚‹"/> - <button name="Discard" text="ç ´æ£„"/> - <button name="Mute" text="無視リストã¸"/> - </form> - </notification> - <notification name="UserGiveItem"> - [NAME]ã¯ã€ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†åå‰ã®[OBJECTTYPE]を渡ã—ã¾ã—ãŸã€‚ - <form name="form"> - <button name="Keep" text="å—ã‘å–ã‚‹"/> - <button name="Discard" text="ç ´æ£„"/> - </form> - </notification> - <notification name="GodMessage"> - [NAME] -[MESSAGE] - </notification> - <notification name="JoinGroup"> - [MESSAGE] - <form name="form"> - <button name="Join" text="å‚åŠ "/> - <button name="Decline" text="辞退"/> - <button name="Info" text="æƒ…å ±"/> - </form> - </notification> - <notification name="TeleportOffered"> - [NAME]ã¯ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆã§å‘¼ã³å¯„ã›ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ï¼š - -[MESSAGE] - <form name="form"> - <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="GotoURL"> - [MESSAGE] -[URL] - <form name="form"> - <button name="Later" text="ã‚ã¨ã§"/> - <button name="GoNow..." text="今ã™ã行ã"/> - </form> - </notification> - <notification name="OfferFriendship"> - [NAME]ã¯ã€ -フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ - -[MESSAGE] - -(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="辞退"/> - </form> - </notification> - <notification name="OfferFriendshipNoMessage"> - [NAME]ã¯ã€ -フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ - -(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - </form> - </notification> - <notification name="FriendshipAccepted"> - [NAME]ã¯ã€ãƒ•レンド 登録をå—ã‘入れã¾ã—ãŸã€‚ - </notification> - <notification name="FriendshipDeclined"> - [NAME]ã¯ã€ãƒ•レンド 登録をæ–りã¾ã—ãŸã€‚ - </notification> - <notification name="OfferCallingCard"> - [FIRST] [LAST]㌠-ã‚ãªãŸã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã£ã¦ãã¾ã—ãŸã€‚ -ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ã™ã°ã‚„ãIMã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="辞退"/> - </form> - </notification> - <notification name="RegionRestartMinutes"> - ã“ã®åœ°åŸŸã¯[MINUTES]分後ã«å†èµ·å‹•ã•れã¾ã™ã€‚ -強制ãƒã‚°ã‚¢ã‚¦ãƒˆã¨ãªã‚Šã¾ã™ã®ã§ã€ã“ã®åœ°åŸŸã®å¤–ã«å‡ºã¦ãã ã•ã„。 - </notification> - <notification name="RegionRestartSeconds"> - ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ [SECONDS] 秒後ã«å†èµ·å‹•ã•れã¾ã™ã€‚. -ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚ - </notification> - <notification name="LoadWebPage"> - ウェブ・ページ[URL]ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - -[MESSAGE] - -ãƒãƒ¼ãƒ‰å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€ã‚ªãƒ¼ãƒŠãƒ¼ï¼š[NAME]? - <form name="form"> - <button name="Gotopage" text="移動"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="FailedToFindWearableUnnamed"> - データベースã«[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠- </notification> - <notification name="FailedToFindWearable"> - データベースã«[DESC]ã¨ã„ã†åå‰ã®[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="InvalidWearable"> - ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME]ビューワを最新ã®ã‚‚ã®ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ScriptQuestion"> - 「[NAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[OBJECTNAME]ã€ã‚’: - -[QUESTIONS] -よã‚ã—ã„ã§ã™ã‹ï¼Ÿ - <form name="form"> - <button name="Yes" text="ã¯ã„"/> - <button name="No" text="ã„ã„ãˆ"/> - <button name="Mute" text="無視リストã«è¿½åŠ "/> - </form> - </notification> - <notification name="ScriptQuestionCaution"> - [NAME] 所有ã®ã€Œ [OBJECTNAME] 〠ã¨ã„ã†ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š - -[QUESTIONS] -ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。 - -リクエストをå—ã‘ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <button name="Grant" text="許å¯"/> - <button name="Deny" text="æ‹’å¦"/> - <button name="Details" text="詳細..."/> - </form> - </notification> - <notification name="ScriptDialog"> - [FIRST] [LAST]ã®ã€Œ[TITLE]〠-[MESSAGE] - <form name="form"> - <button name="Ignore" text="無視ã™ã‚‹"/> - </form> - </notification> - <notification name="ScriptDialogGroup"> - [GROUPNAME]ã®ã€Œ[TITLE]〠-[MESSAGE] - <form name="form"> - <button name="Ignore" text="無視ã™ã‚‹"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - L$[AMOUNT] ã‚’å—ã‘å–りã¾ã—ãŸã€‚ -ã‚ãªãŸã® L$ 残高ã¯ç”»é¢å³ä¸Šã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="FirstBalanceDecrease"> - L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚ -ã‚ãªãŸã® L$ 残高ã¯ç”»é¢å³ä¸Šã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="FirstSit"> - ç€å¸ä¸ã§ã™ã€‚ -周囲を見るã«ã¯çŸ¢å°ã‚ー㋠AWSD ã‚ーを使ã£ã¦ãã ã•ã„。 -ç«‹ã¤ã¨ãã«ã¯ã€Œç«‹ã¡ä¸ŠãŒã‚‹ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。 - </notification> - <notification name="FirstMap"> - 地図をクリック・ドラッグã—ã¦å‘¨å›²ã‚’見ã¦ãã ã•ã„。 -ダブルクリックã™ã‚‹ã¨ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ -å³å´ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã§å ´æ‰€ã‚’探ã—ãŸã‚ŠèƒŒæ™¯ã‚’変更ã—ã¦ãã ã•ã„。 - </notification> - <notification name="FirstBuild"> - 制作ツールを開ãã¾ã—ãŸã€‚ 見るもã®ã™ã¹ã¦ãŒã“ã®ãƒ„ールã§ä½œæˆã•れãŸã‚‚ã®ã§ã™ã€‚ - </notification> - <notification name="FirstTeleport"> - ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ç‰¹å®šã®ã‚¨ãƒªã‚¢ã«ã®ã¿ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ 矢å°ãŒç›®çš„地を指ã—ã¦ã„ã¾ã™ã€‚ 矢å°ã‚’クリックã™ã‚‹ã¨æ¶ˆãˆã¾ã™ã€‚ - </notification> - <notification name="FirstOverrideKeys"> - ã‚ãªãŸã®ç§»å‹•ã‚ãƒ¼ã‚’ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ“作ã—ã¦ã„ã¾ã™ã€‚ -矢å°ã‹AWSDã®ã‚ーã§å‹•作を確èªã—ã¦ãã ã•ã„。 -銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点(マウスルック)ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ -Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ - </notification> - <notification name="FirstAppearance"> - 容姿を編集ä¸ã§ã™ã€‚ -周囲を見るã«ã¯çŸ¢å°ã‚ーを使ã£ã¦ãã ã•ã„。 -終ã‚ã£ãŸã‚‰ã€Œã™ã¹ã¦ä¿å˜ã€ã‚’押ã—ã¦ãã ã•ã„。 - </notification> - <notification name="FirstInventory"> - ã“れã¯ã‚ãªãŸã®æŒã¡ç‰©ã§ã™ã€‚所有ã—ã¦ã„るアイテムãŒå…¥ã£ã¦ã„ã¾ã™ã€‚ - -* アイテムを自分ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¦ãã ã•ã„。 -* アイテムを地é¢ã«ãƒ‰ãƒ©ãƒƒã‚°ã—㦠Rez ã—ã¦ãã ã•ã„。 -* ノートカードをダブルクリックã—ã¦é–‹ã„ã¦ãã ã•ã„。 - </notification> - <notification name="FirstSandbox"> - ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ - -ã“ã“ã§åˆ¶ä½œã•れãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•れã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。 - </notification> - <notification name="FirstFlexible"> - ã“ã®ã‚ªãƒ–ジェクトã¯ãƒ•レã‚シブルã§ã™ã€‚ フレã‚シブルオブジェクトã¯ã€ã€Œç‰©ç†ã€ã§ã¯ãªã「ファントムã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 - </notification> - <notification name="FirstDebugMenus"> - アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’é–‹ãã¾ã—ãŸã€‚ - -ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®æœ‰åŠ¹ãƒ»ç„¡åŠ¹è¨å®šï¼š - Windows: Ctrl+Alt+D - Mac: ⌘-Opt+D - </notification> - <notification name="FirstSculptedPrim"> - スカルプトプリムを編集ä¸ã§ã™ã€‚ スカルプトプリムã«ã¯å½¢çжã®è¼ªéƒã‚’指定ã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒå¿…è¦ã§ã™ã€‚ - </notification> - <notification name="MaxListSelectMessage"> - ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰[MAX_SELECT]個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ - </notification> - <notification name="VoiceInviteP2P"> - [NAME]ãŒã€ã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ -コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="AutoUnmuteByIM"> - [FIRST] [LAST]ã« -インスタント・メッセージãŒé€ä¿¡ã•れã€ç„¡è¦–è¨å®šã¯è‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST]ã«ãŠé‡‘を渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST]ã«æŒã¡ç‰©ã‚’渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="VoiceInviteGroup"> - [NAME]ãŒã€ グループ[GROUP]ã¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ -コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="VoiceInviteAdHoc"> - [NAME]ãŒã€ 会è°ãƒãƒ£ãƒƒãƒˆã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ -コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。 ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="InviteAdHoc"> - [NAME]ãŒã€ ã‚ãªãŸã‚’会è°ãƒãƒ£ãƒƒãƒˆã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ -ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="VoiceChannelFull"> - ã‚ãªãŸãŒå‚åŠ ã—よã†ã¨ã—ã¦ã„るボイスコール[VOICE_CHANNEL_NAME]ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="ProximalVoiceChannelFull"> - ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’è¶…ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚りã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="VoiceChannelDisconnected"> - [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šãŒåˆ‡æ–ã•れã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ - </notification> - <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME]ã¯ã€ã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ - </notification> - <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ - </notification> - <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’å—ã‘å–れã¾ã›ã‚“。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ - </notification> - <notification name="VoiceChannelJoinFailed"> - [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ - </notification> - <notification name="VoiceLoginRetry"> - ã‚ãªãŸç”¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚ - </notification> - <notification name="Cannot enter parcel: not a group member"> - 特定ã®ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®ã¿ã“ã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="Cannot enter parcel: banned"> - ç«‹å…¥ç¦æ¢ã•れã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="Cannot enter parcel: not on access list"> - アクセス・リストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="VoiceNotAllowed"> - ã‚ãªãŸã«ã¯[VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 - </notification> - <notification name="VoiceCallGenericError"> - [VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="ServerVersionChanged"> - ç•°ãªã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 クリックã—ã¦ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã‚’確èªã—ã¦ã¿ã¦ãã ã•ã„。 - </notification> - <notification name="UnsupportedCommandSLURL"> - クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="IMToast"> - <form name="form"> - <button name="respondbutton" text="è¿”ç”"/> - </form> - </notification> - <notification name="AttachmentSaved"> - 付属物(アタッãƒãƒ¡ãƒ³ãƒˆï¼‰ãŒä¿å˜ã•れã¾ã—ãŸã€‚ - </notification> - <notification name="UnableToFindHelpTopic"> - ヘルプトピックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <global name="UnsupportedCPU"> - - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 - </global> - <global name="UnsupportedGLRequirements"> - [APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。 - -ã“ã®å•題ãŒä½•度も起ãã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 - </global> - <global name="UnsupportedCPUAmount"> - 796 - </global> - <global name="UnsupportedRAMAmount"> - 510 - </global> - <global name="UnsupportedGPU"> - - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィック・カードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 - </global> - <global name="UnsupportedRAM"> - - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ・メモリã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 - </global> - <global name="PermYes"> - ã¯ã„ - </global> - <global name="PermNo"> - ã„ã„㈠- </global> - <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> - 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ãƒ›ãƒ¼ãƒ ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«è¨å®šã§ãã¾ã™ã€‚ -ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’探ã—ã¦ãã ã•ã„。 - </global> -</notifications> +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + 今後ã¯è¡¨ç¤ºã—ãªã„ + </global> + <global name="alwayschoose"> + 常ã«ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠž + </global> + <global name="implicitclosebutton"> + é–‰ã˜ã‚‹ + </global> + <template name="okbutton"> + <form> + <button name="OK" text="$yestext"/> + </form> + </template> + <template name="okignore"/> + <template name="okcancelbuttons"> + <form> + <button name="Cancel" text="$notext"/> + </form> + </template> + <template name="okcancelignore"/> + <template name="okhelpbuttons"> + <form> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="䏿˜Žãªè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert"> + ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä»Šå—ã‘å–ã£ãŸè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 + +エラー詳細: 「[_NAME]ã€ã¨ã„ã†è¦å‘Šã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + フãƒãƒ¼ã‚¿ãƒ»ã‚¨ãƒ©ãƒ¼ï¼šä¸‹è¨˜ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + ç¾åœ¨åˆ©ç”¨å¯èƒ½ãªãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã¯ã‚りã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ã¯ã„"/> + </notification> + <notification name="BadInstallation"> + [APP_NAME] をアップデートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ 最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 http://get.secondlife.com + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + [SECOND_LIFE_GRID] ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +「[DIAGNOSTIC]〠+インターãƒãƒƒãƒˆæŽ¥ç¶šãŒæ£å¸¸ã‹ã”確èªãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + メッセージテンプレート [PATH] ãŒã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + ç¾åœ¨ã®è¡£æœ/ボディーパーツã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> + </notification> + <notification name="CompileQueueSaveText"> + 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テã‚ストã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CompileQueueSaveBytecode"> + 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="WriteAnimationFail"> + ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãè¾¼ã¿ã«å•題ãŒã‚りã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="UploadAuctionSnapshotFail"> + 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="SaveClothingBodyChanges"> + è¡£æœï¼èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å˜"/> + </notification> + <notification name="GrantModifyRights"> + ä»–ã®ä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒæ‰€æœ‰ã—ã¦ã„ã‚‹ +ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 +[FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + 変更権é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒä½œæˆã—ãŸå…¨ã¦ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã«ã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 +é¸æŠžã—ãŸä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="RevokeModifyRights"> + [FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + é¸æŠžã—ãŸä½äººã‹ã‚‰å¤‰æ›´æ¨©é™ã‚’å–り下ã’ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="UnableToCreateGroup"> + グループを作æˆã§ãã¾ã›ã‚“。 +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="変更を無視" yestext="変更をé©ç”¨"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + グループ通知ã®é€ä¿¡ã«ã¯ã€ä»¶åã®è¨˜å…¥ãŒå¿…è¦ã§ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + ã‚ãªãŸã¯ [ROLE_NAME]ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +任命ã•れãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€ +彼らを役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。 +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="グループオーナーを新ã—ãè¿½åŠ ã™ã‚‹å‰ã«ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="AssignDangerousActionWarning"> + ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ +与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + + *è¦å‘Š* +ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ +自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€ +自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã« +任命ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰ +実行ã—ã¦ãã ã•ã„。 + +ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ +与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + + *è¦å‘Š* +ã“ã®èƒ½åŠ›ã‚’ã‚‚ã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ +自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã€ +自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚ + +ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="JoinGroupCanAfford"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã«ã¯ã€L$[COST]ã‹ã‹ã‚Šã¾ã™ã€‚ +続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚åŠ "/> + </notification> + <notification name="JoinGroupCannotAfford"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$[COST]å¿…è¦ã§ã™ã€‚ +L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CreateGroupCost"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$100 ã‹ã‹ã‚Šã¾ã™ã€‚ +一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ +48時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—入会ã—ã¦ã‚‚らã£ã¦ãã ã•ã„。 + <usetemplate canceltext="ã‚ャンセル" name="okcancelbuttons" notext="ã‚ャンセル" yestext="L$100 ã§ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/> + </notification> + <notification name="LandBuyPass"> + L$[COST]ã§ [TIME]時間ã“ã®åœŸåœ°[PARCEL_NAME]ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +å…¥å ´è¨±å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€ +売å´ä¾¡æ ¼ã¯L$0以上ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +売å´ä¾¡æ ¼ã‚’L$0ã«è¨å®šã™ã‚‹å ´åˆã¯ã€ +売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="ConfirmLandSaleChange"> + é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—ä¸ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ +売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + 注:「誰ã«ã§ã‚‚売å´ã™ã‚‹ã€ã‚’クリックã™ã‚‹ã¨ã€ +ã‚ãªãŸã®åœŸåœ°ã¯[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã®ã©ã“ã‹ã‚‰ã§ã‚‚ +(ã“ã®åœ°åŸŸã«ãªã„コミュニティをå«ã‚€ï¼‰è³¼å…¥ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + +é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€ +売り出ã—ä¸ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ +売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ—[NAME]共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + +*è¦å‘Š* ã“れã«ã‚ˆã‚Šã€ +グループã«è²æ¸¡ã•れãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + ã“ã®åŒºç”»ã§ã€ +ä½äºº[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]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•れãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚ + +*è¦å‘Š* ã“れã«ã‚ˆã‚Šã€ +グループã«è²æ¸¡ã•れãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + å…¨ã¦ã®ãƒªã‚¹ãƒˆã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’æ‰€æœ‰è€…ã«æœ¬å½“ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + ã“ã®åœ°åŸŸå†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—[NAME] +ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトをオーナーã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ + +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + スクリプトを無効ã«ã§ãã¾ã›ã‚“。 +ã“ã®åœ°åŸŸå…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ +æ¦å™¨ã‚’使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + </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"> + スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼ + </notification> + <notification name="ErrorUploadingPostcard"> + 次ã®ç†ç”±ã§ã€ã‚¹ãƒŠãƒƒãƒ—ショットã®é€ä¿¡æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸï¼š [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + 次ã®ç†ç”±ã§ã€ãƒ¬ãƒãƒ¼ãƒˆã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + [SECOND_LIFE] ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CouldNotPutOnOutfit"> + æœè£…を装ç€ã§ãã¾ã›ã‚“。 +æœè£…フォルダã«è¡£æœã€èº«ä½“部ä½ã€ä»˜å±žå“ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="CannotWearTrash"> + ゴミ箱ã«ã‚ã‚‹æœã‚„ボディーパーツã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotWearInfoNotComplete"> + ã¾ã èªã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ を装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„り直ã—ã¦ãã ã•ã„。 + </notification> + <notification name="MustHaveAccountToLogIn"> + ãŠã£ã¨! 記入æ¼ã‚ŒãŒã‚りã¾ã™ã‚ˆã€‚ +ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + +[SECOND_LIFE]ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + https://join.secondlife.com/index.php?lang=ja-JP + </url> + <usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/> + </notification> + <notification name="AddClassified"> + 検索ディレクトリã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイドã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã€ +クラシファイド広告ãŒ1週間掲載ã•れã¾ã™ã€‚ +広告を記入後ã€ã€Œå…¬é–‹ã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã« +è¿½åŠ ã—ã¾ã™ã€‚ +「公開ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•金é¡ã‚’å°‹ãられã¾ã™ã€‚ +å¤šãæ‰•ã†ã»ã©ã€åºƒå‘ŠãŒã‚¯ãƒ©ã‚·ãƒ•ァイド・リストã¨ã‚ーワード検索 +ã®ä¸Šä½ã«è¡¨ç¤ºã•れã¾ã™ã€‚ + <usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DeleteClassified"> + クラシファイド広告[NAME]ã®å‰Šé™¤ã‚’ã—ã¾ã™ã‹ï¼Ÿ +æ”¯æ‰•ã„æ¸ˆã¿ã®æ–™é‡‘ã¯è¿”金ã•れã¾ã›ã‚“。 + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ClassifiedSave"> + クラシファイド広告[NAME]ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> + </notification> + <notification name="DeleteAvatarPick"> + ピック[PICK]を削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + [SECOND_LIFE]イベント・ウェブ・ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://secondlife.com/events/?lang=ja-JP + </url> + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + 表示ã™ã‚‹ææ¡ˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="SelectHistoryItemToView"> + 表示ã™ã‚‹å±¥æ´ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="ResetShowNextTimeDialogs"> + ã“れらã®ãƒãƒƒãƒ—アップ全ã¦ã‚’å†åº¦æœ‰åŠ¹åŒ–ã—ã¾ã™ã‹ï¼Ÿï¼ˆä»¥å‰ã€Œä»Šå¾Œã¯è¡¨ç¤ºã—ãªã„ã€ã¨æŒ‡å®šã—ã¦ã„ã¾ã™ï¼‰ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SkipShowNextTimeDialogs"> + スã‚ップå¯èƒ½ãªãƒãƒƒãƒ—アップ全ã¦ã‚’無効化ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="CacheWillClear"> + [APP_NAME]ã®å†èµ·å‹•後ã«ã‚ャッシュãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚ + </notification> + <notification name="CacheWillBeMoved"> + [APP_NAME]ã®å†èµ·å‹•後ã«ã‚ャッシュãŒç§»å‹•ã•れã¾ã™ã€‚ +注æ„:ã“れã«ã‚ˆã‚Šã‚ャッシュãŒã‚¯ãƒªã‚¢ã•れã¾ã™ã€‚ + </notification> + <notification name="ChangeConnectionPort"> + ãƒãƒ¼ãƒˆã®è¨å®šã¯ã€[APP_NAME]ã®å†èµ·å‹•å¾Œã«æœ‰åйã«ãªã‚Šã¾ã™ã€‚ + </notification> + <notification name="ChangeSkin"> + æ–°ã—ã„スã‚ンã¯[APP_NAME]ã‚’å†èµ·å‹•ã™ã‚‹ã¨ç¾ã‚Œã¾ã™ + </notification> + <notification name="GoToAuctionPage"> + [SECOND_LIFE]ウェブ・ページã«ç§»å‹•ã—〠入æœã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + </url> + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + 変更をä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ +ステップãŒå¤šã™ãŽã¾ã™ã€‚ +ステップをã„ãã¤ã‹å‰Šé™¤ã—ã¦ã‹ã‚‰å†ä¿å˜ã—ã¦ãã ã•ã„ + </notification> + <notification name="GestureSaveFailedTryAgain"> + ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚å°‘ã—å¾…ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + </notification> + <notification name="GestureSaveFailedReason"> + 次ã®ç†ç”±ã§ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã®ä¿å˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + ノートカードã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + </notification> + <notification name="SaveNotecardFailReason"> + 次ã®ç†ç”±ã§ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ScriptCannotUndo"> + ã‚ãªãŸã®ã‚¹ã‚¯ãƒªãƒ—トã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€å¤‰æ›´ã‚’å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +サーãƒãƒ¼ã®æœ€æ–°ä¿å˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ +(**è¦å‘Š**:ã“ã®æ“ä½œå¾Œå…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“) + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="SaveScriptFailObjectNotFound"> + スクリプトã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚スクリプトãŒå…¥ã£ãŸã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトã¯ç¯„囲外ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + </notification> + <notification name="SaveBytecodeFailReason"> + 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜æ™‚ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="StartRegionEmpty"> + ãƒã‚°ã‚¤ãƒ³ä½ç½®ãŒä¸æ˜Žã§ã™ã€‚ +ãƒã‚°ã‚¤ãƒ³ä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œè‡ªå®…(ホーム)ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + スクリプトã®èµ·å‹•ã¾ãŸã¯åœæ¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚¹ã‚¯ãƒªãƒ—ãƒˆãŒæ ¼ç´ã•れã¦ã„るオブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + </notification> + <notification name="CannotDownloadFile"> + ファイルをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotWriteFile"> + ファイル[[FILE]]を書ãè¾¼ã‚ã¾ã›ã‚“。 + </notification> + <notification name="UnsupportedHardware"> + è¦å‘Šï¼š ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ 㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 ã“ã®ã¾ã¾ [APP_NAME] を使用ã™ã‚‹ã¨ã€ãƒ‘フォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。 + +最低動作環境 +[_URL] ã§è©³ã—ã„æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ + <url name="url" option="0"> + http://secondlife.com/support/sysreqs.php?lang=ja + </url> + <usetemplate ignoretext="使用ã—ã¦ã„るコンピューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="UnknownGPU"> + ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€ç¾åœ¨ [APP_NAME] ãŒèªè˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæè¼‰ã•れã¦ã„ã¾ã™ã€‚ +[APP_NAME] ã§ã¾ã テストã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ [APP_NAME] ã¯æ£å¸¸ã«å®Ÿè¡Œã•れるå¯èƒ½æ€§ãŒé«˜ã„ã§ã™ãŒã€è¡¨ç¤ºè¨å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 +(環境è¨å®š > 表示) + <form name="form"> + <ignore name="ignore" text="使用ä¸ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè˜ã•れã¾ã›ã‚“ã§ã—ãŸ"/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] ã¯ã€ +グラフィック・ドライãƒã®åˆæœŸåŒ–ä¸ã«ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚ +一般的ãªãƒ‰ãƒ©ã‚¤ãƒãƒ»ã‚¨ãƒ©ãƒ¼ã‚’回é¿ã™ã‚‹ãŸã‚ã€ã€Œå“質ãŠã‚ˆã³ãƒ‘フォーマンスã€ã¯ã€Œä½Žã€ã«è¨å®šã•れã¾ã™ã€‚ +ã“れã«ã‚ˆã‚Šã€ã„ãã¤ã‹ã®ã‚°ãƒ©ãƒ•ィックス機能ã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚ +グラフィックカード・ドライãƒã®ã‚¢ãƒƒãƒ—デートをãŠå‹§ã‚ã—ã¾ã™ã€‚ +「グラフィックã®å“質ã€ã¯ã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œè¡¨ç¤ºã€ã‹ã‚‰ä¸Šã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </notification> + <notification name="RegionNoTerraforming"> + ã“ã®åœ°åŸŸ[REGION] ã¯ã€ãƒ†ãƒ©ãƒ•ォーミングãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotCopyWarning"> + ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを +許ã•れã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’る㨠+æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ 本当㫠+ã“れをã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="CannotGiveItem"> + æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ を渡ã›ã¾ã›ã‚“。 + </notification> + <notification name="TransactionCancelled"> + å–引ãŒã‚ャンセルã•れã¾ã—ãŸã€‚ + </notification> + <notification name="TooManyItems"> + 一度ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªäº¤æ›ã§ã€42以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯é€ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="NoItems"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã§ãる権é™ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="CannotCopyCountItems"> + ã‚ãªãŸã¯é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®[COUNT]ã®ã‚³ãƒ”ーを +許ã•れã¦ã„ã¾ã›ã‚“。 +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ +本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="CannotGiveCategory"> + é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’è²æ¸¡ã§ãる権é™ãŒã‚りã¾ã›ã‚“ + </notification> + <notification name="FreezeAvatar"> + ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ +ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ +ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/> + </notification> + <notification name="FreezeAvatarFullname"> + [AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ +フリーズã•れãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/> + </notification> + <notification name="EjectAvatarFullname"> + ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰[AVATAR_NAME]を追放ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ¢" yestext="追放"/> + </notification> + <notification name="EjectAvatarNoBan"> + ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> + </notification> + <notification name="EjectAvatarFullnameNoBan"> + [AVATAR_NAME] ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> + </notification> + <notification name="AcquireErrorTooManyObjects"> + å–å¾—ã‚¨ãƒ©ãƒ¼ï¼šé¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚ + </notification> + <notification name="AcquireErrorObjectSpan"> + å–得エラー: +オブジェクトãŒè¤‡æ•°ã®åœ°åŸŸã«ã¾ãŸãŒã£ã¦å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ +å–å¾—ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ +ã™ã¹ã¦åŒã˜åœ°åŸŸå†…ã«ç§»å‹•ã•ã›ã¦ãã ã•ã„。 + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +[_URL] ã§ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«è³¼å…¥ã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://secondlife.com/app/currency/?lang=ja-JP + </url> + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + ã“れらã®[COUNT]オブジェクトをリンクã§ãã¾ã›ã‚“。 +最大[MAX]オブジェクトをリンクã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </notification> + <notification name="CannotLinkIncompleteSet"> + セットã¨ã—ã¦æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚複数㮠+ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotLinkModify"> + ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¿®æ£è¨±å¯ãŒã‚ãªãŸã«ãªã„ãŸã‚〠+リンクã§ãã¾ã›ã‚“。 + +オブジェクトãŒã™ã¹ã¦ãƒãƒƒã‚¯ã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotLinkDifferentOwners"> + 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを +リンクã§ãã¾ã›ã‚“。 + +è‡ªåˆ†ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="NoFileExtension"> + ファイル「[FILE]ã€ã®æ‹¡å¼µåãŒç„¡åйã§ã™ã€‚ + +ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µåãŒæ£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。 + </notification> + <notification name="InvalidFileExtension"> + ファイル拡張å[EXTENSION]ã¯ç„¡åйã§ã™ +æ£ã—ã„æ‹¡å¼µå:[VALIDS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + èªã¿è¾¼ã¿ã®ãŸã‚ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•れãŸã‚µã‚¦ãƒ³ãƒ‰ãƒ•ァイルを開ã‘ã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + ファイルãŒRIFF WAVEファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + ファイルãŒPCM WAVEオーディオ・ファイルã¨ã—ã¦èªè˜ã•れã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + ファイルã®ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒç„¡åйã§ã™ï¼ˆãƒ¢ãƒŽãƒ©ãƒ«ã¾ãŸã¯ã‚¹ãƒ†ãƒ¬ã‚ªã‚’使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + ファイルã®ã‚µãƒ³ãƒ—ル・レートãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ44.1kを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + ファイルã®ãƒ¯ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ8ã¾ãŸã¯16ビットを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + WAVヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + オーディオ・ファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大10秒): +[FILE] + </notification> + <notification name="ProblemWithFile"> + ファイル[FILE]ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚ + +[ERROR] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンド・ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + 未知ã®Vorbis æš—å·åŒ–ã«å¤±æ•—: [FILE] + </notification> + <notification name="CannotEncodeFile"> + 次ã®ãƒ•ァイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE] + </notification> + <notification name="CorruptResourceFile"> + ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイル: [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + 未知ã®lindenリソースファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + æœè£…ファイルを作æˆã§ãã¾ã›ã‚“: [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotUploadReason"> + 次ã®ç†ç”±ã§ã€[FILE] をアップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“: [REASON] +ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="LandmarkCreated"> + 「 [LANDMARK_NAME] ã€ã‚’「 [FOLDER_NAME] ã€ãƒ•ォルダã«è¿½åŠ ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚〠+ランドマークを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + å†ç·¨é›†ã¯ä¸å¯èƒ½ã§ã™ã€‚ +スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + 「å†ç·¨é›†ã€ã¯ä¸å¯èƒ½ã§ã™ã€‚ + +å¤‰æ›´ä¿®æ£æ¨©é™ã®ã‚ã‚‹ +スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + 「å†è¨å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + 「å†è¨å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +å¤‰æ›´ä¿®æ£æ¨©é™ã®ã‚ã‚‹ +スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + スクリプトã®ã€Œå®Ÿè¡Œã€ã®è¨å®šãŒã§ãã¾ã›ã‚“。 + +スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + スクリプトを「実行ã—ãªã„ã€ã«è¨å®šã§ãã¾ã›ã‚“。 + +スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="NoFrontmostFloater"> + ä¿å˜ã™ã¹ãfrontmostフãƒãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="SeachFilteredOnShortWords"> + 指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•れã€çŸã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚ + +検索語å¥ï¼š [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + 指定ã—ãŸæ¤œç´¢èªžå¥ãŒçŸã™ãŽãŸãŸã‚ã€æ¤œç´¢ã¯è¡Œã‚れã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="CouldNotTeleportReason"> + テレãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ +[REASON] + </notification> + <notification name="invalid_tport"> + テレãƒãƒ¼ãƒˆå‡¦ç†ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </notification> + <notification name="invalid_region_handoff"> + リージョン間ã®ç§»å‹•ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[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"> + æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + 土地所有者è¨å®šãŒã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚〠+åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ForceOwnerAuctionWarning"> + ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã•れã¦ã„ã¾ã™ã€‚ +åŒºç”»ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ãŒç„¡åйã«ãªã‚Šã€ +å…¥æœãŒé–‹å§‹ã—ã¦ã„ãŸã‚‰ä¸æº€ã«æ€ã†ä½äººãŒå‡ºã¦ãã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 +所有権をå–å¾—ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š +区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotContentifyNoRegion"> + コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š +土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandNothingSelected"> + åœŸåœ°ã‚’ç ´æ£„ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandNoRegion"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotBuyLandNothingSelected"> + 土地を購入ã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotBuyLandNoRegion"> + 土地を購入ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + </notification> + <notification name="CannotCloseFloaterBuyLand"> + [APP_NAME]ã«ã‚ˆã‚‹ã€ +ã“ã®å–引ã®è¦‹ç©ã‚ŠãŒå®Œäº†ã™ã‚‹ã¾ã§ã€ŒåœŸåœ°ã‚’購入ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandNothingSelected"> + åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandNoGroup"> + åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: +グループãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandNoRegion"> + åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandMultipleSelected"> + åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: +複数ã®åŒºç”»ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚ + +ã“れより1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="ParcelCanPlayMedia"> + ã“ã“ã§ã¯ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢å†ç”ŸãŒå¯èƒ½ã§ã™ã€‚ +メディアã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã«ã¯ã€é«˜é€Ÿãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šç’°å¢ƒãŒå¿…è¦ã§ã™ã€‚ + +利用å¯èƒ½ã«ãªã£ãŸã‚‰å†ç”Ÿã—ã¾ã™ã‹ï¼Ÿ +(ã“ã®ã‚ªãƒ—ションã¯ã€ã€Œç’°å¢ƒè¨å®šã€ï¼žã€ŒéŸ³å£°ã¨ãƒ“デオã€ã§å¾Œã‹ã‚‰ã§ã‚‚変更ã§ãã¾ã™ï¼‰ + <usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアをå†ç”Ÿ"/> + </notification> + <notification name="CannotDeedLandWaitingForServer"> + åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: +サーãƒãƒ¼ã‹ã‚‰ã®æ‰€æœ‰æ¨©æƒ…å ±ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ + +å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="CannotDeedLandNoTransfer"> + åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã›ã‚“: +ã“ã®åœ°åŸŸ [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandWatingForServer"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +サーãƒãƒ¼ãŒåŒºç”»æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ + +ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotReleaseLandSelected"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã‚ãªãŸã¯ã€é¸æŠžã—ãŸã™ã¹ã¦ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。 + +1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotReleaseLandDontOwn"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã‚ãªãŸã¯ã“ã®åœŸåœ°ã‚’手放ã™ã“ã¨ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“。 +ã‚ãªãŸã®åŒºç”»ã¯ç·‘色ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandNoTransfer"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã“ã® [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandPartialSelection"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +åŒºç”»å…¨ä½“ã‚’é¸æŠžã—ã¦ç ´æ£„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + +åŒºç”»å…¨ä½“ã‚’é¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ReleaseLandWarning"> + ã‚ãªãŸã¯ã€[AREA]平方メートルã®åœŸåœ°ã‚’ç ´æ£„ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ã“ã®åŒºç”»ã‚’ç ´æ£„ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€ +L$ã¯è¿”金ã•れã¾ã›ã‚“。 + +åœŸåœ°ã‚’ç ´æ£„ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + 土地を分割ã§ãã¾ã›ã‚“: + +区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotDivideLandPartialSelection"> + 土地を分割ã§ãã¾ã›ã‚“: + +区画全体ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚ +区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="LandDivideWarning"> + ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚ +区画ã”ã¨ã®è¨å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨å®šãŒãƒ‡ãƒ•ォルトã«ãƒªã‚»ãƒƒãƒˆã•れã¾ã™ã€‚ + +土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + 土地を分割ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotJoinLandNoRegion"> + 土地を統åˆã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotJoinLandNothingSelected"> + 土地を統åˆã§ãã¾ã›ã‚“ã§ã—ãŸï¼š +区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + 土地を統åˆã§ãã¾ã›ã‚“: +1ã¤ã®åŒºç”»ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。 + +両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotJoinLandSelection"> + 土地を統åˆã§ãã¾ã›ã‚“: +1ã¤ä»¥ä¸Šã®åŒºç”»ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + +両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="JoinLandWarning"> + ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹ +å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦1ã¤ã®å¤§ããªåŒºç”»ãŒä½œæˆã•れã¾ã™ã€‚ +æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + +土地を統åˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + ã“ã®ã‚¢ã‚¤ãƒ†ãƒ をコピーã€è¡¨ç¤ºã™ã‚‹å‰ã«ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜ãŒå¿…è¦ã§ã™ã€‚ ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/> + </notification> + <notification name="ResolutionSwitchFail"> + è§£åƒåº¦ã‚’ [RESX]x[RESY]ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="ErrorUndefinedGrasses"> + ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¤ç‰©ï¼š[SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¨¹æœ¨ï¼š[SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + 「[NAME]ã€ã‚’æœã®ãƒ•ァイルã«ä¿å˜ã§ãã¾ã›ã‚“。 コンピューター㮠+ディスクスペースを少ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ +ä¿å˜ã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="CannotSaveToAssetStore"> + [NAME]ã‚’ä¸å¤®è³‡ç”£æ ¼ç´åº«ã«ä¿å˜ã§ãã¾ã›ã‚“。 +ã“れã¯ä¸€æ™‚çš„ãªä¸å…·åˆã§ã™ã€‚ +æœé£¾å“ãªã©ã‚’カスタマイズã—ã€æ•°åˆ†å¾Œã«ã‚‚ã†ä¸€åº¦ä¿å˜ã—ã¦ãã ã•ã„。 + </notification> + <notification name="YouHaveBeenLoggedOut"> + ã‚ãªãŸã¯[SECOND_LIFE]ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã—ãŸã€‚ + [MESSAGE] +「IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示ã€ã‚’クリックã™ã‚‹ã¨ã€ +ç¾åœ¨ã‚ã‚‹IMã¨ãƒãƒ£ãƒƒãƒˆã‚’確èªã§ãã¾ã™ã€‚ +確èªã—ãªã„å ´åˆã¯ã€Œçµ‚了ã€ã‚’クリックã—〠+ã™ãã«[APP_NAME]を終了ã—ã¦ãã ã•ã„。 + <usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/> + </notification> + <notification name="OnlyOfficerCanBuyLand"> + グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“: +ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriend"> + フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +[NAME] ã«ãƒ•レンドシップをé€ã‚Šã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriendWithMessage"> + フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +[NAME] ã«ãƒ•レンドシップã®ã‚ªãƒ•ァーをã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + フレンドã¨ã—ã¦ç™»éŒ²ã—ã¦ãれã¾ã™ã‹ï¼Ÿ + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="ã‚ャンセル"/> + </form> + </notification> + <notification name="RemoveFromFriends"> + [FIRST_NAME] [LAST_NAME]をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + フレンドリストã‹ã‚‰è¤‡æ•°ã®ãƒ•レンドを削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </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]ãŒä¸‹é™ã§ã™ã€‚ + +金é¡ã‚’増やã—ã¦ãã ã•ã„。 + </notification> + <notification name="ConfirmObjectDeleteLock"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸Šã‚’ã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ + +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ +ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + 1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚ +ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ +ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€ + +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。 + +é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="DeedLandToGroup"> + ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ +ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ +土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“ã€‚è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ + +ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ— +「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—㌠+å分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ +ã“ã®è²æ¸¡ã«ã‚ˆã‚Šã€ +「[FIRST_NAME] [LAST_NAME]ã€ã‹ã‚‰ +グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•れã¾ã™ã€‚ +土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“。 +è²æ¸¡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²æ–™é‡‘ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•れã¾ã™ã€‚ + +ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + -safeオプションを指定ã—ãŸã®ã§ã€ +表示è¨å®šã¯ã‚»ãƒ¼ãƒ•・レベルã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="DisplaySetToRecommended"> + 表示è¨å®šã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã« +基ã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + </notification> + <notification name="AvatarMovedDesired"> + 目的地ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 +è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarMovedLast"> + å‰å›žã„ãŸå ´æ‰€ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 +è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarMovedHome"> + ホームãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 +è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ +æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’è¨å®šã—ãªãŠã™ã¨ã„ã„ã‹ã‚‚ã—れã¾ã›ã‚“。 + </notification> + <notification name="ClothingLoading"> + ç¾åœ¨è¡£é¡žã‚’ダウンãƒãƒ¼ãƒ‰ä¸ã§ã™ã€‚ +ã“ã®ã¾ã¾ [SECOND_LIFE] を通常通りã”使用ã„ãŸã ã‘ã¾ã™ã€‚他人ã‹ã‚‰ã¯ã‚ãªãŸã¯æ£ã—ã表示ã•れã¾ã™ã€‚ + <form name="form"> + <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã¾ã™"/> + </form> + </notification> + <notification name="FirstRun"> + [APP_NAME]ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ + +[SECOND_LIFE] ã®ä½¿ç”¨ãŒåˆã‚ã¦ã®æ–¹ã¯ã€ +ãƒã‚°ã‚¤ãƒ³å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆãŒå¿…è¦ã§ã™ã€‚ +[https://join.secondlife.com/index.php?lang=ja-JP secondlife.com]ã«ç§»å‹•ã—ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã„ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="続行" yestext="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + 接続ãŒãªã‹ãªã‹ã§ãã¾ã›ã‚“。 ãŠä½¿ã„ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‹ã€[SECOND_LIFE_GRID] ã®å•題ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + +インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ã‹ã‚‰æ•°åˆ†å¾Œã«å†æŽ¥ç¶šã™ã‚‹ã‹ã€ãƒ˜ãƒ«ãƒ—をクリックã—㦠[SUPPORT_SITE] ã‚’ã”覧ã«ãªã‚‹ã‹ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’クリックã—ã¦ãƒ›ãƒ¼ãƒ ã«ç§»å‹•ã—ã¦ã¿ã¦ãã ã•ã„。 + <url name="url"> + http://jp.secondlife.com/support/ + </url> + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="ヘルプ"/> + <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ + +矢å°ã‚ーを使用ã—ã¦æ©ãã¾ã™ã€‚ +ヘルプãŒå¿…è¦ãªã¨ãã‚„[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ +F1ã‚ーを押ã—ã¦ãã ã•ã„。 +男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚ + </notification> + <notification name="GrantedModifyRights"> + [FIRST_NAME] [LAST_NAME] ã®ã‚ªãƒ–ジェクトã®ç·¨é›†æ¨©é™ã‚’å¾—ã¾ã—ãŸã€‚ + </notification> + <notification name="RevokedModifyRights"> + [FIRST_NAME] [LAST_NAME] +ã®ã‚ªãƒ–ジェクトを修æ£ã™ã‚‹æ¨©é™ãŒå–り消ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="FlushMapVisibilityCaches"> + ã“ã®æ‰‹é †ã¯ã€ã“ã®åœ°åŸŸã®åœ°å›³ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚ +ã“れãŒä¾¿åˆ©ãªã®ã¯ãƒ‡ãƒãƒƒã‚°æ™‚ã®ã¿ã§ã™ã€‚ +(作æˆä¸ã¯5分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã« +æ›´æ–°ã•れã¾ã™ï¼‰ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + 一度ã«ä¸€ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã¨è²·ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを一ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + ã“ã®åœ°åŸŸã®å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + [USER_NAME]ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š +地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€ç„¡åйã®ãƒ“ット深度[TEXTURE_BIT_DEPTH]ã§ã™ã€‚ + +テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 + </notification> + <notification name="InvalidTerrainSize"> + 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š +地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚ + +テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 + </notification> + <notification name="RawUploadStarted"> + アップãƒãƒ¼ãƒ‰é–‹å§‹ã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€ +最大2分間ã‹ã‹ã‚Šã¾ã™ã€‚ + </notification> + <notification name="ConfirmBakeTerrain"> + ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ï¼ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸å¿ƒã«ãªã‚Šã€ã€Œå¾©å¸°ã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + 許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚ + </notification> + <notification name="MaxBannedAgentsOnRegion"> + ç¦æ¢ä½äººã¯[MAX_BANNED]人ã¾ã§ã§ã™ã€‚ + </notification> + <notification name="MaxAgentOnRegionBatch"> + [NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿½åŠ ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + 許å¯ã‚°ãƒ«ãƒ¼ãƒ—ã¯[MAX_GROUPS]グループã¾ã§ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/> + </notification> + <notification name="MaxManagersOnRegion"> + ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯[MAX_MANAGER]人ã¾ã§ã§ã™ã€‚ + </notification> + <notification name="OwnerCanNotBeDenied"> + ä¸å‹•産オーナーをä¸å‹•ç”£ã€Œç¦æ¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + æœãŠã‚ˆã³å½¢ãŒãƒãƒ¼ãƒ‰ã•れるã¾ã§ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ァベット㋠+æ•°å—ã§å§‹ã‚ã¾ã™ã€‚ å¥èªç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。 + </notification> + <notification name="CantSetBuyObject"> + オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒè¨å®šã§ãã¾ã›ã‚“。 +販売対象ã®ã‚ªãƒ–ジェクトをè¨å®šã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="FinishedRawDownload"> + æœªåŠ å·¥ã®åœ°å½¢ãƒ•ァイルを次ã¸ã¨ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š +[DOWNLOAD_PATH]。 + </notification> + <notification name="DownloadWindowsMandatory"> + [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã¯ã€ +ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadWindows"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadLinuxMandatory"> + [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadLinux"> + [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="ç¶šã‘ã‚‹" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadMacMandatory"> + [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã€ +ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + +アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadMac"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + +アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + +アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DeedObjectToGroup"> + ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’è²æ¸¡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š +* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れãŸL$ã‚’å—é ˜ã—ã¾ã™ã€‚ + <usetemplate ignoretext="オブジェクトをグループã«è²æ¸¡ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="è²æ¸¡"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Web ブラウザを開ã„ã¦ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見る" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + secondlife.com ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ç®¡ç†ã‚’ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + [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"/> + </notification> + <notification name="WebLaunchPublicIssue"> + [SECOND_LIFE]ã®ãƒ‘ブリックå•題トラッカーã§ã€ +ãƒã‚°ã‚„ãã®ä»–ã®å•é¡Œã‚’å ±å‘Šã§ãã¾ã™ã€‚ + <usetemplate ignoretext="ブラウザを確èªã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="ページã¸è¡Œã"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Lindenå…¬å¼ãƒ–ãƒã‚°ã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„æƒ…å ±ã‚’å…¥æ‰‹ã—ã¦ãã ã•ã„。 + <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ãƒã‚°ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLGuide"> + スクリプトガイドを開ãã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + LSL ãƒãƒ¼ã‚¿ãƒ«ã§ã‚¹ã‚¯ãƒªãƒ—トã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> + </notification> + <notification name="ReturnToOwner"> + é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ +è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクト㯠+以å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚ + +*è¦å‘Š* 移転ãŒä¸å¯èƒ½ã®è²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼ + <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + ç¾åœ¨ã‚ãªãŸã¯ [GROUP]ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚ +ã“ã“ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッド外ã«ã‚ックã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‚’追ã„出ã™"/> + </notification> + <notification name="MuteLinden"> + 残念ãªãŒã‚‰Lindenを無視è¨å®šã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + æ—¢ã«å£²ã‚Šå‡ºã—ä¸ã®åŒºç”»ãªã®ã§ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«ã‹ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オークションã«ã‹ã‘ãŸã„å ´åˆã¯å£²ã‚Šå‡ºã—è¨å®šã‚’解除ã—ã¦ã‹ã‚‰è¡Œã£ã¦ãã ã•ã„。 + </notification> + <notification label="オブジェクトをåå‰ã§ãƒŸãƒ¥ãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" name="MuteByNameFailed"> + ã‚ãªãŸã¯ã™ã§ã«ã“ã®åå‰ã‚’ミュートã—ã¦ã„ã¾ã™ã€‚ + <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"/> + </notification> + <notification name="JoinedTooManyGroupsMember"> + åŠ å…¥ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れをæ–ã£ã¦ãã ã•ã„。 +[NAME] ãŒã‚ãªãŸã‚’グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦å‹§èª˜ã—ã¦ã„ã¾ã™ã€‚ +[INVITE] + <usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚åŠ "/> + </notification> + <notification name="KickUser"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="KickAllUsers"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="FreezeUser"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…ãŒIMを通ã˜ã¦ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="UnFreezeUser"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚‚ã†ãƒ•リーズã•れã¦ã„ã¾ã›ã‚“。 + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="OfferTeleport"> + 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã‚ãªãŸãŒä»Šã„ã‚‹å ´æ‰€ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + ユーザーをゴッド・コールã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + 本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + </notification> + <notification name="TeleportToPick"> + [PICK] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + </notification> + <notification label="ã‚ãªãŸã®ä¸å‹•産内ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate"> + 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹ +çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </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]ã®ã™ã¹ã¦ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove"> + 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd"> + ã“ã®ä¸å‹•産ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove"> + 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd"> + ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATE]ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove"> + ã“ã®ä½äººã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã¸ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd"> + ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã«å¯¾ã—ã¦ã€ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove"> + ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/> + </notification> + <notification label="ã‚ックを確èª" name="EstateKickUser"> + ã“ã®ä¸å‹•産ã‹ã‚‰[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="ナレッジベースを開ã"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="RegionEntryAccessBlocked_Change"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ +ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 + <form name="form"> + <button name="OK" text="è¨å®šã®å¤‰æ›´"/> + <button default="true" name="Cancel" text="é–‰ã˜ã‚‹"/> + <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"/> + </form> + </notification> + <notification name="LandClaimAccessBlocked"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + +最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + +ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja + </url> + <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LandClaimAccessBlocked_Change"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + +「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ +ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 + <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> + </notification> + <notification name="LandBuyAccessBlocked"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + +最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + +ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja + </url> + <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LandBuyAccessBlocked_Change"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ +ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 + <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ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="NotAllowedToViewNotecard"> + è¦æ±‚ã•れãŸè³‡ç”£IDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + ノートカード用資産IDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + 注æ„ï¼šã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã®æ–™é‡‘ã¯æ‰•ã„æˆ»ã—ã•れã¾ã›ã‚“。 + +L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="SetGroupMature"> + ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification label="å†èµ·å‹•を確èª" name="ConfirmRestart"> + ã“ã®åœ°åŸŸã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification label="ã“ã®åœ°åŸŸå†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion"> + ã“ã®åœ°åŸŸã«ã„る人全員ã«é€ã‚‹ +çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange"> + ã“ã®åœ°åŸŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚ +ã“ã®å¤‰æ›´ãŒåœ°å›³ã«åæ˜ ã•れるã¾ã§ã«ã¯ã—ã°ã‚‰ã時間ãŒã‹ã‹ã‚Šã¾ã™ã€‚ + </notification> + <notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch"> + ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® [APP_NAME] ã¯ã€ +ã“ã®åœ°åŸŸã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆæ©Ÿèƒ½ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。 +ボイスãƒãƒ£ãƒƒãƒˆã‚’æ£ã—ã使用ã™ã‚‹ã«ã¯ã€ +[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚ + </notification> + <notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner"> + 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 +å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly"> + 一度ã«è¤‡æ•°ã®ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner"> + 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 +å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="BuyOriginal"> + オリジナルã®ã‚ªãƒ–ジェクトを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€ +変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + L$[PRICE]ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ +ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€ +変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + コピーを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + L$[PRICE]ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyContents"> + コンテンツを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + 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ã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"/> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="SetPickLocation"> + メモ: +本ピックã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€ +ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + ã€Œã‚³ãƒ”ãƒ¼ç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚ + + +アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ をオブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + ã€Œã‚³ãƒ”ãƒ¼ç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れるã®ã§ã¯ãªãã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚ +ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€æŒã¡ç‰©ã«ç§»å‹•ã•ã›ã‚‹ã¨ +スクリプトã«èª¤å‹•作ãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + +æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を移動ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + è¦å‘Šï¼š クリックã§ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€è¨å®šã‚’ã—ã¾ã—ãŸã€‚スクリプト㫠money()イベントãŒè¿½åŠ ã•れるã¨å‹•作ã—ã¾ã™ã€‚ + <form name="form"> + <ignore name="ignore" text="money() スクリプトを入れãšã«ã‚ªãƒ–ジェクトを制作ä¸ã«ã€ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’è¨å®š"/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ã‚ãªãŸãŒã‚³ãƒ”ーã§ãるアイテムã¯ã‚りã¾ã›ã‚“。 + </notification> + <notification name="WebLaunchAccountHistory"> + secondlife.com ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> + </notification> + <notification name="ConfirmQuit"> + 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="終了時ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + 利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã®å ±å‘Šã«ã“ã®ãƒ„ールをã”使用ãã ã•ã„。 å‚照: + +http://secondlife.com/corporate/tos.php +http://secondlife.com/corporate/cs.php + +利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã«é–¢ã™ã‚‹å…¨ã¦ã®ãƒ¬ãƒãƒ¼ãƒˆã¯ã€èª¿æŸ»ã•れã€è§£æ±ºã•れã¾ã™ã€‚ +以下ã®ãƒªãƒ³ã‚¯å…ˆã®è¢«å®³å ±å‘Šã«ã¦ãã®ç¢ºèªã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +http://secondlife.com/support/incidentreport.php + </notification> + <notification name="HelpReportAbuseEmailEO"> + é‡è¦ï¼š ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã¯Linden Lab 社ã§ã¯ãªã〠+ã‚ãªãŸãŒç¾åœ¨ã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«é€ã‚‰ã‚Œã¾ã™ã€‚ +- +ã‚ãªãŸãŒä»Šã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ +ä½äººã¨è¨ªå•者ã¸ã®ã‚µãƒ¼ãƒ“スã®ä¸€ç’°ã¨ã—ã¦ã€ã“ã®åœ°åŸŸã‹ã‚‰ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’ã™ã¹ã¦å—ã‘付ã‘ã€è§£æ±ºã™ã‚‹ã“ã¨ã«åŒæ„ã—ã¦ã„ã¾ã™ã€‚ +よã£ã¦Linden Lab 社ãŒã€ +ã‚ãªãŸãŒã“ã“ã‹ã‚‰æå‡ºã™ã‚‹ãƒ¬ãƒãƒ¼ãƒˆã‚’調査ã™ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 +地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ä¸å‹•ç”£ç´„æ¬¾ã§æŒ‡å®šã—ã¦ã„る地元ã®è¦å‰‡ã‚’基ã«ã€å ±å‘Šã•れãŸå•題を解決ã—ã¾ã™ã€‚ +(「世界ã€ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã¨ã€ç´„款を閲覧ã§ãã¾ã™ï¼‰ +- +ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«é–¢ã™ã‚‹è§£æ±ºç–ã¯ã€ã“ã®åœ°åŸŸã«ã ã‘当ã¦ã¯ã¾ã‚Šã¾ã™ã€‚ +ä½äººãŒ[SECOND_LIFE] ã®ä»–ã®åœ°åŸŸã¸ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã€ +ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã®çµæžœã«å½±éŸ¿ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。 +Linden Lab 社ã ã‘ãŒ[SECOND_LIFE] 全域ã«ãŠã‘ã‚‹ +ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™æ¨©ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseSelectCategory"> + 嫌ãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。 +ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + 嫌ãŒã‚‰ã›è¡Œç‚ºã‚’ã—ãŸäººã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。 +æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + 嫌ãŒã‚‰ã›ãŒã‚ã£ãŸå ´æ‰€ã‚’入力ã—ã¦ãã ã•ã„。 +æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + 嫌ãŒã‚‰ã›ã®æ¦‚è¦ã‚’入力ã—ã¦ãã ã•ã„。 +æ£ç¢ºãªæ¦‚è¦ã®å…¥åŠ›ã«ã‚ˆã‚Šã€ +嫌ãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + 嫌ãŒã‚‰ã›ã®è©³ç´°ãªèª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„。 +åå‰ã‚„嫌ãŒã‚‰ã›ã®è©³ç´°ã‚’ã€ã§ãã‚‹ã ã‘具体的ã«å…¥åŠ›ã—ã¦ãã ã•ã„。 + +æ£ç¢ºãªèª¬æ˜Žã®å…¥åŠ›ã«ã‚ˆã‚Šã€ +嫌ãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + ä½äººã®çš†æ§˜ã¸ã€ + +知的財産ã®ä¾µå®³ã«é–¢ã™ã‚‹å ±å‘Šã‚’行ã†éš›ã«ã¯ã€ä»¥ä¸‹ã®ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + +(1) 嫌ãŒã‚‰ã›ã®å ±å‘Šã®ãƒ—ãƒã‚»ã‚¹ +[SECOND_LIFE] ã®æ¨©é™ã‚·ã‚¹ãƒ†ãƒ を悪用ã—ã¦ã„ã‚‹ä½äººã‚’見ã¤ã‘ãŸã‚‰ã€ +嫌ãŒã‚‰ã›ã®å ±å‘Šã‚’行ã£ã¦ãã ã•ã„。 +例ãˆã°ã‚³ãƒ”ーBotã®ä½¿ç”¨ã€ãれã«ä¼¼ãŸãƒ„ールã®ä½¿ç”¨ã«ã‚ˆã‚‹çŸ¥çš„財産権ã®ä¾µå®³ãŒã‚りã¾ã™ã€‚ +アビューズãƒãƒ¼ãƒ ã¯èª¿æŸ»ã«åŸºã¥ã〠+[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã‚„ +利用è¦ç´„ã«é•åã™ã‚‹è¡Œç‚ºã¨åˆ¤æ–ã•れãŸå ´åˆã«ã¯é©åˆ‡ãªå‡¦ç½®ã‚’行ã£ã¦ã„ã¾ã™ã€‚ +ãŸã ã—ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’[SECOND_LIFE] ã‹ã‚‰æ’¤åŽ»ã—ã¦ã»ã—ã„〠+ã¨ã„ã£ãŸè¦æœ›ã«ã¯ã‚¢ãƒ“ューズãƒãƒ¼ãƒ ã¯å¿œãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +(2) DMCA(デジタルミレニアム著作権法)åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„撤去プãƒã‚»ã‚¹ +[SECOND_LIFE] ã‹ã‚‰ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã‚’ãƒªã‚¯ã‚¨ã‚¹ãƒˆã™ã‚‹ã«ã¯ã€ +è‘—ä½œæ¨©ä¾µå®³é€šçŸ¥ã®æå‡ºã‚’è¡Œã†å¿…è¦ãŒã‚りã¾ã™ã€‚ +å‚照: http://secondlife.com/corporate/dmca.php + +ã“ã®ä»¶ã«é–¢ã™ã‚‹å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ã‚‹éš›ã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦ãã ã•ã„ã€‚é¸æŠžã™ã¹ãカテゴリã¯ã€ŒçŸ¥çš„財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã»ã†ãŒé©ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“ã®ã§ã”確èªãã ã•ã„。 + +よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚ + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER]ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™ +[COMPONENTS] + </notification> + <notification label="æ—¢å˜ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment"> + 体ã®ã“ã®éƒ¨ä½ã«ã¯ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚ +é¸æŠžã•れãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ + <form name="form"> + <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="ã‚ャンセル"/> + </form> + </notification> + <notification name="ConfirmEmptyTrash"> + ゴミ箱ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="æŒã¡ç‰©ã®ã‚´ãƒŸç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + トラベルã€Webã€æ¤œç´¢ã®å±¥æ´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> + </notification> + <notification name="ConfirmClearCookies"> + 本当ã«ã‚¯ãƒƒã‚ーをクリアã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + ä¿å˜ã•れ㟠URL ã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + 紛失物ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="CopySLURL"> + 次㮠SLurl ãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•れã¾ã—ãŸï¼š + [SLURL] + +Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Webブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。 + <form name="form"> + <ignore name="ignore" text="クリップボード㫠SLurl ãŒã‚³ãƒ”ーã•れる"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + ä¿å˜ã•れãŸäº‹å‰è¨å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="WLDeletePresetAlert"> + [SKY] を削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="WLNoEditDefault"> + デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="WLMissingSky"> + ã“ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。 + </notification> + <notification name="PPSaveEffectAlert"> + ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹åŠ¹æžœãŒå˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="NewSkyPreset"> + æ–°ã—ã„空ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"> + æ–°ã—ã„事å‰è¨å®š + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="ã‚ャンセル"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ + </notification> + <notification name="NewWaterPreset"> + æ–°ã—ã„æ°´ã®äº‹å‰è¨å®šã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"> + æ–°ã—ã„事å‰è¨å®š + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="ã‚ャンセル"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ + </notification> + <notification name="WaterNoEditDefault"> + デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="ChatterBoxSessionStartError"> + [RECIPIENT]ã¨ã®æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + [NAME]ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚ +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¨ãã¯è³¼å…¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification label="デビット許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails"> + ã“ã®è¦æ±‚を許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’課金ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ +ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + 作æˆã—よã†ã¨ã—ã¦ã„る衣類を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="容姿編集画é¢ã§ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="NotAgeVerified"> + 年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’行ã„ã¾ã™ã‹ï¼Ÿ + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php?lang=ja + </url> + <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’行ã„ã¾ã™ã‹ï¼Ÿ + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/index.php?lang=ja + </url> + <usetemplate ignoretext="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="MissingString"> + æ–‡å—列[STRING_NAME]ãŒstrings.xmlã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + å–り消ã•れã¾ã—㟠+ </notification> + <notification name="CancelledSit"> + 座るã®ã‚’å–り消ã•れã¾ã—㟠+ </notification> + <notification name="CancelledAttach"> + 添付ã¯å–り消ã•れã¾ã—㟠+ </notification> + <notification name="ReplacedMissingWearable"> + æ¬ è½ã—ã¦ã„ã‚‹æœï¼èº«ä½“部ä½ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚ + </notification> + <notification name="GroupNotice"> + ä»¶å: [SUBJECT], メッセージ: [MESSAGE] + </notification> + <notification name="FriendOnline"> + [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ + </notification> + <notification name="FriendOffline"> + [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚ + </notification> + <notification name="AddSelfFriend"> + 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンドã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="UploadingAuctionSnapshot"> + インワールドã¨ã‚¦ã‚§ãƒ–・サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™... +ï¼ˆæ‰€è¦æ™‚間:約5分) + </notification> + <notification name="UploadPayment"> + アップãƒãƒ¼ãƒ‰ã« L$[AMOUNT] 支払ã„ã¾ã—ãŸã€‚ + </notification> + <notification name="UploadWebSnapshotDone"> + Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="UploadSnapshotDone"> + インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="TerrainDownloaded"> + raw地形ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•れã¾ã—㟠+ </notification> + <notification name="GestureMissing"> + ジェスãƒãƒ£ãƒ¼[NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。 + </notification> + <notification name="UnableToLoadGesture"> + ジェスãƒãƒ£ãƒ¼[NAME] ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 +å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="LandmarkMissing"> + データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="UnableToLoadLandmark"> + ランドマークをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CapsKeyOn"> + CapsLock ã‚ãƒ¼ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚ +パスワードã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 + </notification> + <notification name="NotecardMissing"> + ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。 + </notification> + <notification name="NotecardNoPermissions"> + ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’見る権é™ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="RezItemNoPermissions"> + オブジェクトをrezã™ã‚‹ã«ã¯ãƒ‘ーミッション(承èªï¼‰ãŒä¸è¶³ã—ã¦ã¾ã™ã€‚ + </notification> + <notification name="UnableToLoadNotecard"> + ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£ã‚’ãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </notification> + <notification name="ScriptMissing"> + データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="ScriptNoPermissions"> + スクリプトを閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ + </notification> + <notification name="UnableToLoadScript"> + スクリプトをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="IncompleteInventory"> + ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã“ã®å ´æ‰€ã§ã¯ã¾ã 全部æƒã„ã¾ã›ã‚“。 +å°‘ã—ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotModifyProtectedCategories"> + ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯ä¿®æ£ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotRemoveProtectedCategories"> + ä¿è·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。 + </notification> + <notification name="OfferedCard"> + ã‚ãªãŸã¯[FIRST] [LAST] ã« +コーリング・カードをé€ã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="UnableToBuyWhileDownloading"> + オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 +ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="UnableToLinkWhileDownloading"> + オブジェクトデータã®ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。 +ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + オブジェクトã¯ä¸€åº¦ã«ã¤ãä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚ +オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ãã ã•ã„。 + </notification> + <notification name="ObjectNotForSale"> + ã“ã®ã‚ªãƒ–ジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚りã¾ã›ã‚“。 + </notification> + <notification name="EnteringGodMode"> + レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™ + </notification> + <notification name="LeavingGodMode"> + レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã™ + </notification> + <notification name="CopyFailed"> + ã“れをコピーã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="InventoryAccepted"> + [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’å—ã‘入れã¾ã—ãŸã€‚ + </notification> + <notification name="InventoryDeclined"> + [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’æ–りã¾ã—ãŸã€‚ + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + コーリング・カードãŒå—ç†ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="CallingCardDeclined"> + ã‚³ãƒ¼ãƒªãƒ³ã‚°ãƒ»ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="TeleportToLandmark"> + 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ +[NAME]ãªã©ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ï¼ˆLandmarksï¼‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +ランドマークをダブルクリックã—ãŸå¾Œã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã™ã‚‹ã¨ãã®å ´æ‰€ã¸ç§»å‹•ã—ã¾ã™ã€‚ + </notification> + <notification name="TeleportToPerson"> + 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ +ä½äººã®[NAME]ã¨æŽ¥è§¦ã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ï¼ˆCalling Cardsï¼‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +カードをダブルクリックã—ã€ã€ŒIMã‚’é€ã‚‹ã€ã‚’クリックã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + サーãƒãƒ¼ã®å¢ƒç•Œã‚’è¶Šãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。 +ã‚‚ã£ã¨å°ã•ãªåœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="SearchWordBanned"> + ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã«æ˜Žè¨˜ã•れã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="NoContentToSearch"> + å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„。(PG, Mature, Adult) + </notification> + <notification name="GroupVote"> + [NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š +[MESSAGE] + <form name="form"> + <button name="VoteNow" text="今ã™ã投票ã™ã‚‹"/> + <button name="Later" text="ã‚ã¨ã§"/> + </form> + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + イベント通知: + +[NAME] +[DATE] + <form name="form"> + <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> + <button name="Description" text="説明"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + ã“ã®åŒºç”»ä¸Šã«å˜åœ¨ã™ã‚‹ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«è²æ¸¡ã•れるオブジェクトãŒã™ã¹ã¦å¼·èª¿è¡¨ç¤ºã•れã¾ã™ã€‚ + + +*è²æ¸¡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¾ã›ã‚“。 + <form name="form"> + <button name="Done" text="完了"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + åŒã˜ãƒˆãƒªã‚¬ãƒ¼ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã—ãªã„ジェスãƒãƒ£ãƒ¼ï¼š +[NAMES] + </notification> + <notification name="NoQuickTime"> + Apple社ã®QuickTimeãŒã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ã¨æ€ã‚れã¾ã™ã€‚ +ストリーミング・メディアã®å†ç”Ÿã‚’行ã„ãŸã„å ´åˆã¯ã€QuickTimeã®ã‚µã‚¤ãƒˆï¼ˆhttp://www.apple.com/quicktime)ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€QuickTime Player をインストールã—ã¦ãã ã•ã„。 + </notification> + <notification name="NoPlugin"> + 「 [MIME_TYPE] ã€ã® MIME タイプを扱ã†ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã¯ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 + </notification> + <notification name="MediaPluginFailed"> + 次ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒå®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸï¼š + [PLUGIN] + +プラグインをインストールã—ãªãŠã™ã‹ã€å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ãƒ¡ãƒ¼ã‚«ãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 + <form name="form"> + <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="OtherObjectsReturned"> + é¸æŠžã•れã¦ã„る土地ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ + [FIRST] [LAST] + ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="OtherObjectsReturned2"> + é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚り〠+ä½äººã®[NAME]ã®æ‰€æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="GroupObjectsReturned"> + é¸æŠžã•れã¦ã„る区画上ã«ã‚りã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚ +è²æ¸¡ã•れã¦ã„ãŸè²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ +グループã«è²æ¸¡ã•れã¦ã„ãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="UnOwnedObjectsReturned"> + é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚りã€ã‚ãªãŸã®æ‰€æœ‰ã§ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="NotSafe"> + ã“ã®åœŸåœ°ã§ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åйã§ã™ã€‚ +ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æ»ã‚“ã§ã—ã¾ã£ãŸå ´åˆã¯ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚ + </notification> + <notification name="NoFly"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯é£›è¡ŒãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ +ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。 + </notification> + <notification name="PushRestricted"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒåˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ +土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoVoice"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åйã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoBuild"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ¢ã•れã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š 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="MustGetAgeParcel"> + ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + </notification> + <notification name="NoDestRegion"> + 目的地ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="NotAllowedInDest"> + 目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="RegionParcelBan"> + ç«‹å…¥ç¦æ¢ã•れãŸåŒºç”»ã‚’横æ–ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 åˆ¥ã®æ–¹æ³•ã‚’ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="TelehubRedirect"> + テレãƒãƒ–ã«è»¢é€ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="CouldntTPCloser"> + ã“れ以上目的地ã«è¿‘ã„å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="TPCancelled"> + テレãƒãƒ¼ãƒˆãŒã‚ャンセルã•れã¾ã—ãŸã€‚ + </notification> + <notification name="FullRegionTryAgain"> + å…¥ã‚ã†ã¨ã—ã¦ã„る地域(リージョン)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚ +ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="GeneralFailure"> + よãã‚る失敗 + </notification> + <notification name="RoutedWrongRegion"> + ç•°ãªã‚‹åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="NoValidAgentID"> + エージェントIDãŒç„¡åйã§ã™ã€‚ + </notification> + <notification name="NoValidSession"> + セッションIDãŒç„¡åйã§ã™ã€‚ + </notification> + <notification name="NoValidCircuit"> + 回路コードãŒç„¡åйã§ã™ã€‚ + </notification> + <notification name="NoValidTimestamp"> + タイムスタンプãŒç„¡åйã§ã™ã€‚ + </notification> + <notification name="NoPendingConnection"> + 接続を生æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="InternalUsherError"> + 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoGoodTPDestination"> + ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="InternalErrorRegionResolver"> + 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoValidLanding"> + 有効ãªç€åœ°ç‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="NoValidParcel"> + 有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="ObjectGiveItem"> + [FIRST] [LAST]所有ã®ã€ +[OBJECTFROMNAME]ã‹ã‚‰ã€ +[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ + <form name="form"> + <button name="Keep" text="å—ã‘å–ã‚‹"/> + <button name="Discard" text="ç ´æ£„"/> + <button name="Mute" text="無視リストã¸"/> + </form> + </notification> + <notification name="ObjectGiveItemUnknownUser"> + (未知ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼‰ 所有ã®[OBJECTFROMNAME]ã‹ã‚‰ã€ +ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ + <form name="form"> + <button name="Keep" text="å—ã‘å–ã‚‹"/> + <button name="Discard" text="ç ´æ£„"/> + <button name="Mute" text="無視リストã¸"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME]ã¯ã€ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†åå‰ã®[OBJECTTYPE]を渡ã—ã¾ã—ãŸã€‚ + <form name="form"> + <button name="Keep" text="å—ã‘å–ã‚‹"/> + <button name="Discard" text="ç ´æ£„"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="å‚åŠ "/> + <button name="Decline" text="辞退"/> + <button name="Info" text="æƒ…å ±"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME]ã¯ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆã§å‘¼ã³å¯„ã›ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ï¼š + +[MESSAGE] + <form name="form"> + <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="ã‚ã¨ã§"/> + <button name="GoNow..." text="今ã™ã行ã"/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME]ã¯ã€ +フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ + +[MESSAGE] + +(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="辞退"/> + </form> + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME]ã¯ã€ +フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ + +(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + [NAME]ã¯ã€ãƒ•レンド 登録をå—ã‘入れã¾ã—ãŸã€‚ + </notification> + <notification name="FriendshipDeclined"> + [NAME]ã¯ã€ãƒ•レンド 登録をæ–りã¾ã—ãŸã€‚ + </notification> + <notification name="OfferCallingCard"> + [FIRST] [LAST]㌠+ã‚ãªãŸã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã£ã¦ãã¾ã—ãŸã€‚ +ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ã™ã°ã‚„ãIMã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="辞退"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + ã“ã®åœ°åŸŸã¯[MINUTES]分後ã«å†èµ·å‹•ã•れã¾ã™ã€‚ +強制ãƒã‚°ã‚¢ã‚¦ãƒˆã¨ãªã‚Šã¾ã™ã®ã§ã€ã“ã®åœ°åŸŸã®å¤–ã«å‡ºã¦ãã ã•ã„。 + </notification> + <notification name="RegionRestartSeconds"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ [SECONDS] 秒後ã«å†èµ·å‹•ã•れã¾ã™ã€‚. +ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚ + </notification> + <notification name="LoadWebPage"> + ウェブ・ページ[URL]ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + +[MESSAGE] + +ãƒãƒ¼ãƒ‰å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€ã‚ªãƒ¼ãƒŠãƒ¼ï¼š[NAME]? + <form name="form"> + <button name="Gotopage" text="移動"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + データベースã«[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+ </notification> + <notification name="FailedToFindWearable"> + データベースã«[DESC]ã¨ã„ã†åå‰ã®[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="InvalidWearable"> + ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME]ビューワを最新ã®ã‚‚ã®ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ScriptQuestion"> + 「[NAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[OBJECTNAME]ã€ã‚’: + +[QUESTIONS] +よã‚ã—ã„ã§ã™ã‹ï¼Ÿ + <form name="form"> + <button name="Yes" text="ã¯ã„"/> + <button name="No" text="ã„ã„ãˆ"/> + <button name="Mute" text="無視リストã«è¿½åŠ "/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + [NAME] 所有ã®ã€Œ [OBJECTNAME] 〠ã¨ã„ã†ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š + +[QUESTIONS] +ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。 + +リクエストをå—ã‘ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <button name="Grant" text="許å¯"/> + <button name="Deny" text="æ‹’å¦"/> + <button name="Details" text="詳細..."/> + </form> + </notification> + <notification name="ScriptDialog"> + [FIRST] [LAST]ã®ã€Œ[TITLE]〠+[MESSAGE] + <form name="form"> + <button name="Ignore" text="無視ã™ã‚‹"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + [GROUPNAME]ã®ã€Œ[TITLE]〠+[MESSAGE] + <form name="form"> + <button name="Ignore" text="無視ã™ã‚‹"/> + </form> + </notification> + <notification name="FirstBalanceIncrease"> + L$[AMOUNT] ã‚’å—ã‘å–りã¾ã—ãŸã€‚ +ã‚ãªãŸã® L$ 残高ã¯ç”»é¢å³ä¸Šã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="FirstBalanceDecrease"> + L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚ +ã‚ãªãŸã® L$ 残高ã¯ç”»é¢å³ä¸Šã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="FirstSit"> + ç€å¸ä¸ã§ã™ã€‚ +周囲を見るã«ã¯çŸ¢å°ã‚ー㋠AWSD ã‚ーを使ã£ã¦ãã ã•ã„。 +ç«‹ã¤ã¨ãã«ã¯ã€Œç«‹ã¡ä¸ŠãŒã‚‹ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。 + </notification> + <notification name="FirstMap"> + 地図をクリック・ドラッグã—ã¦å‘¨å›²ã‚’見ã¦ãã ã•ã„。 +ダブルクリックã™ã‚‹ã¨ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ +å³å´ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã§å ´æ‰€ã‚’探ã—ãŸã‚ŠèƒŒæ™¯ã‚’変更ã—ã¦ãã ã•ã„。 + </notification> + <notification name="FirstBuild"> + 制作ツールを開ãã¾ã—ãŸã€‚ 見るもã®ã™ã¹ã¦ãŒã“ã®ãƒ„ールã§ä½œæˆã•れãŸã‚‚ã®ã§ã™ã€‚ + </notification> + <notification name="FirstTeleport"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ç‰¹å®šã®ã‚¨ãƒªã‚¢ã«ã®ã¿ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ 矢å°ãŒç›®çš„地を指ã—ã¦ã„ã¾ã™ã€‚ 矢å°ã‚’クリックã™ã‚‹ã¨æ¶ˆãˆã¾ã™ã€‚ + </notification> + <notification name="FirstOverrideKeys"> + ã‚ãªãŸã®ç§»å‹•ã‚ãƒ¼ã‚’ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ“作ã—ã¦ã„ã¾ã™ã€‚ +矢å°ã‹AWSDã®ã‚ーã§å‹•作を確èªã—ã¦ãã ã•ã„。 +銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点(マウスルック)ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ + </notification> + <notification name="FirstAppearance"> + 容姿を編集ä¸ã§ã™ã€‚ +周囲を見るã«ã¯çŸ¢å°ã‚ーを使ã£ã¦ãã ã•ã„。 +終ã‚ã£ãŸã‚‰ã€Œã™ã¹ã¦ä¿å˜ã€ã‚’押ã—ã¦ãã ã•ã„。 + </notification> + <notification name="FirstInventory"> + ã“れã¯ã‚ãªãŸã®æŒã¡ç‰©ã§ã™ã€‚所有ã—ã¦ã„るアイテムãŒå…¥ã£ã¦ã„ã¾ã™ã€‚ + +* アイテムを自分ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¦ãã ã•ã„。 +* アイテムを地é¢ã«ãƒ‰ãƒ©ãƒƒã‚°ã—㦠Rez ã—ã¦ãã ã•ã„。 +* ノートカードをダブルクリックã—ã¦é–‹ã„ã¦ãã ã•ã„。 + </notification> + <notification name="FirstSandbox"> + ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ + +ã“ã“ã§åˆ¶ä½œã•れãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•れã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。 + </notification> + <notification name="FirstFlexible"> + ã“ã®ã‚ªãƒ–ジェクトã¯ãƒ•レã‚シブルã§ã™ã€‚ フレã‚シブルオブジェクトã¯ã€ã€Œç‰©ç†ã€ã§ã¯ãªã「ファントムã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 + </notification> + <notification name="FirstDebugMenus"> + アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’é–‹ãã¾ã—ãŸã€‚ + +ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®æœ‰åŠ¹ãƒ»ç„¡åŠ¹è¨å®šï¼š + Windows: Ctrl+Alt+D + Mac: ⌘-Opt+D + </notification> + <notification name="FirstSculptedPrim"> + スカルプトプリムを編集ä¸ã§ã™ã€‚ スカルプトプリムã«ã¯å½¢çжã®è¼ªéƒã‚’指定ã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒå¿…è¦ã§ã™ã€‚ + </notification> + <notification name="MaxListSelectMessage"> + ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰[MAX_SELECT]個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ + </notification> + <notification name="VoiceInviteP2P"> + [NAME]ãŒã€ã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ +コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + [FIRST] [LAST]ã« +インスタント・メッセージãŒé€ä¿¡ã•れã€ç„¡è¦–è¨å®šã¯è‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="AutoUnmuteByMoney"> + [FIRST] [LAST]ã«ãŠé‡‘を渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="AutoUnmuteByInventory"> + [FIRST] [LAST]ã«æŒã¡ç‰©ã‚’渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="VoiceInviteGroup"> + [NAME]ãŒã€ グループ[GROUP]ã¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ +コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME]ãŒã€ 会è°ãƒãƒ£ãƒƒãƒˆã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ +コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。 ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME]ãŒã€ ã‚ãªãŸã‚’会è°ãƒãƒ£ãƒƒãƒˆã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ +ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + ã‚ãªãŸãŒå‚åŠ ã—よã†ã¨ã—ã¦ã„るボイスコール[VOICE_CHANNEL_NAME]ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="ProximalVoiceChannelFull"> + ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’è¶…ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚りã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="VoiceChannelDisconnected"> + [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šãŒåˆ‡æ–ã•れã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME]ã¯ã€ã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’å—ã‘å–れã¾ã›ã‚“。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + </notification> + <notification name="VoiceChannelJoinFailed"> + [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚ + </notification> + <notification name="VoiceLoginRetry"> + ã‚ãªãŸç”¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚ + </notification> + <notification name="Cannot enter parcel: not a group member"> + 特定ã®ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®ã¿ã“ã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </notification> + <notification name="Cannot enter parcel: banned"> + ç«‹å…¥ç¦æ¢ã•れã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="Cannot enter parcel: not on access list"> + アクセス・リストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="VoiceNotAllowed"> + ã‚ãªãŸã«ã¯[VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。 + </notification> + <notification name="VoiceCallGenericError"> + [VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="ServerVersionChanged"> + ç•°ãªã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 クリックã—ã¦ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã‚’確èªã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="UnsupportedCommandSLURL"> + クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="IMToast"> + <form name="form"> + <button name="respondbutton" text="è¿”ç”"/> + </form> + </notification> + <notification name="AttachmentSaved"> + 付属物(アタッãƒãƒ¡ãƒ³ãƒˆï¼‰ãŒä¿å˜ã•れã¾ã—ãŸã€‚ + </notification> + <notification name="UnableToFindHelpTopic"> + ヘルプトピックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <global name="UnsupportedCPU"> + - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + </global> + <global name="UnsupportedGLRequirements"> + [APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。 + +ã“ã®å•題ãŒä½•度も起ãã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィック・カードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + </global> + <global name="UnsupportedRAM"> + - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ・メモリã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + </global> + <global name="PermYes"> + ã¯ã„ + </global> + <global name="PermNo"> + ã„ã„㈠+ </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/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml index 75bf6ac7b677a38fb2b842ed333bde123e02d1d7..56542455704e9305bf6934bdad277a1eb80a10c2 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml @@ -1,38 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Profile Edit" name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" value="ä½äºº"/> - <string name="AcctTypeTrial" value="トライアル"/> - <string name="AcctTypeCharterMember" value="特権メンãƒãƒ¼"/> - <string name="AcctTypeEmployee" value="Linden Lab従æ¥å“¡"/> - <string name="PaymentInfoUsed" value="æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆ"/> - <string name="PaymentInfoOnFile" value="æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿"/> - <string name="NoPaymentInfoOnFile" value="æ”¯æ‰•ã„æƒ…å ±æœªç™»éŒ²"/> - <string name="AgeVerified" value="å¹´é½¢ç¢ºèªæ¸ˆã¿"/> - <string name="NotAgeVerified" value="年齢未確èª"/> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=ja - </string> - <string name="no_partner_text" value="ãªã—"/> - <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="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> - </panel> - <icon label="" name="real_world_edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> - <text name="title_homepage_text"> - Web サイト: - </text> - <check_box label="æ¤œç´¢çµæžœã«è¡¨ç¤º" name="show_in_search_checkbox"/> - <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> - </panel> - </panel> - </scroll_container> - <panel name="profile_me_buttons_panel"> - <button label="変更をä¿å˜" name="save_btn"/> - <button label="ã‚ャンセル" name="cancel_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profile Edit" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="AcctTypeResident" value="ä½äºº"/> + <string name="AcctTypeTrial" value="トライアル"/> + <string name="AcctTypeCharterMember" value="特権メンãƒãƒ¼"/> + <string name="AcctTypeEmployee" value="Linden Lab従æ¥å“¡"/> + <string name="PaymentInfoUsed" value="æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆ"/> + <string name="PaymentInfoOnFile" value="æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿"/> + <string name="NoPaymentInfoOnFile" value="æ”¯æ‰•ã„æƒ…å ±æœªç™»éŒ²"/> + <string name="AgeVerified" value="å¹´é½¢ç¢ºèªæ¸ˆã¿"/> + <string name="NotAgeVerified" value="年齢未確èª"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=ja + </string> + <string name="no_partner_text" value="ãªã—"/> + <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="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> + <text name="title_homepage_text"> + Web サイト: + </text> + <check_box label="æ¤œç´¢çµæžœã«è¡¨ç¤º" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="変更をä¿å˜" name="save_btn"/> + <button label="ã‚ャンセル" name="cancel_btn"/> + </panel> +</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 586eb4e6cca9605da5276ec45cb6737de0929288..815bb93e66bb4cfe668ed4ea0cabeb6e177ad9ae 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml @@ -1,30 +1,30 @@ -<?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"> - (ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž) - </panel.string> - <panel.string name="already_in_group"> - 何人ã‹ã®ã‚¢ãƒã‚¿ãƒ¼ã¯æ—¢ã«ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã£ã¦ã„ã‚‹ãŸã‚招待ã•れã¾ã›ã‚“ã§ã—ãŸã€‚ - </panel.string> - <text bottom_delta="-96" font="SansSerifSmall" height="72" name="help_text"> - ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ä¸€åº¦ã«è¤‡æ•°ã® -ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€ -をクリックã—ã¦ãã ã•ã„。 - </text> - <button bottom_delta="-10" label="リストã‹ã‚‰ä½äººã‚’é¸æŠž" name="add_button" tool_tip=""/> - <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="複数ã®ä½äººã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Ctrlã‚ーを押ã—ãªãŒã‚‰ä½äººåをクリックã—ã¾ã™ã€‚"/> - <button label="リストã‹ã‚‰é¸æŠžã—ãŸã‚‚ã®ã‚’削除" name="remove_button" tool_tip="上ã§é¸æŠžã—ãŸå±…ä½è€…を招待リストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚"/> - <text name="role_text"> - 割り当ã¦å…ˆã®å½¹å‰²ã‚’é¸æŠžï¼š - </text> - <combo_box name="role_name" tool_tip="メンãƒãƒ¼ã«å‰²ã‚Šå½“ã¦å¯èƒ½ãªå½¹å‰²ã‚’リストã‹ã‚‰é¸æŠžã€‚"/> - <button label="招待をé€ä¿¡" name="ok_button"/> - <button label="å–り消ã—" name="cancel_button"/> - <string name="GroupInvitation"> - グループã¸ã®æ‹›å¾… - </string> -</panel> +<?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"> + (ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž) + </panel.string> + <panel.string name="already_in_group"> + 何人ã‹ã®ã‚¢ãƒã‚¿ãƒ¼ã¯æ—¢ã«ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã£ã¦ã„ã‚‹ãŸã‚招待ã•れã¾ã›ã‚“ã§ã—ãŸã€‚ + </panel.string> + <text bottom_delta="-96" font="SansSerifSmall" height="72" name="help_text"> + ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ä¸€åº¦ã«è¤‡æ•°ã® +ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€ +をクリックã—ã¦ãã ã•ã„。 + </text> + <button bottom_delta="-10" label="リストã‹ã‚‰ä½äººã‚’é¸æŠž" name="add_button" tool_tip=""/> + <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="複数ã®ä½äººã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Ctrlã‚ーを押ã—ãªãŒã‚‰ä½äººåをクリックã—ã¾ã™ã€‚"/> + <button label="リストã‹ã‚‰é¸æŠžã—ãŸã‚‚ã®ã‚’削除" name="remove_button" tool_tip="上ã§é¸æŠžã—ãŸå±…ä½è€…を招待リストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚"/> + <text name="role_text"> + 割り当ã¦å…ˆã®å½¹å‰²ã‚’é¸æŠžï¼š + </text> + <combo_box name="role_name" tool_tip="メンãƒãƒ¼ã«å‰²ã‚Šå½“ã¦å¯èƒ½ãªå½¹å‰²ã‚’リストã‹ã‚‰é¸æŠžã€‚"/> + <button label="招待をé€ä¿¡" name="ok_button"/> + <button label="å–り消ã—" name="cancel_button"/> + <string name="GroupInvitation"> + グループã¸ã®æ‹›å¾… + </string> +</panel> 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 66662ec87a4eaa16e125817bf39ae32934121001..2b7292d8b2b31067ec72f9530dc87febe5ad0904 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,85 +1,85 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="土地ã¨L$" name="land_money_tab"> - <string name="help_text"> - グループ所有地一覧ã¯ã€å¯„付ã«é–¢ã™ã‚‹è©³ç´°ã¨ä¸€ç·’ã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ 「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è¦å‘ŠãŒè¡¨ç¤ºã•れã¾ã™ã€‚ 「計画ã€ã€ã€Œè©³ç´°ã€ã€ã€Œè²©å£²ã€ã‚¿ãƒ–ã«ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®è³‡é‡‘ã«é–¢ã™ã‚‹æƒ…å ±ãŒæŽ²è¼‰ã•れã¦ã„ã¾ã™ã€‚ - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°è¡¨ç¤ºã‚’許ã•れã¦ã„ã¾ã›ã‚“。 - </string> - <string name="cant_view_group_accounting_text"> - ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¼šè¨ˆæƒ…å ±ã®è¡¨ç¤ºã‚’許ã•れã¦ã„ã¾ã›ã‚“。 - </string> - <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"> - 土地ã®å‡ºè³‡è¨å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ - </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> - <tab_container name="group_money_tab_container"> - <panel label="計画" name="group_money_planning_tab"> - <text_editor name="group_money_planning_text"> - 計算ä¸... - </text_editor> - </panel> - <panel label="詳細" name="group_money_details_tab"> - <text_editor name="group_money_details_text"> - 計算ä¸â€¦ - </text_editor> - <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_details_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> - <button label="次ã®é€±" label_selected="次ã®é€±" name="later_details_button" tool_tip="次ã®é€±ã®å±¥æ´"/> - </panel> - <panel label="販売" name="group_money_sales_tab"> - <text_editor name="group_money_sales_text"> - 計算ä¸â€¦ - </text_editor> - <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_sales_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> - <button label="次ã®é€±" label_selected="次ã®é€±" name="later_sales_button" tool_tip="次ã®é€±ã®å±¥æ´"/> - </panel> - </tab_container> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="土地ã¨L$" name="land_money_tab"> + <string name="help_text"> + グループ所有地一覧ã¯ã€å¯„付ã«é–¢ã™ã‚‹è©³ç´°ã¨ä¸€ç·’ã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ 「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è¦å‘ŠãŒè¡¨ç¤ºã•れã¾ã™ã€‚ 「計画ã€ã€ã€Œè©³ç´°ã€ã€ã€Œè²©å£²ã€ã‚¿ãƒ–ã«ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®è³‡é‡‘ã«é–¢ã™ã‚‹æƒ…å ±ãŒæŽ²è¼‰ã•れã¦ã„ã¾ã™ã€‚ + </string> + <button label="?" name="help_button"/> + <string name="cant_view_group_land_text"> + ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°è¡¨ç¤ºã‚’許ã•れã¦ã„ã¾ã›ã‚“。 + </string> + <string name="cant_view_group_accounting_text"> + ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¼šè¨ˆæƒ…å ±ã®è¡¨ç¤ºã‚’許ã•れã¦ã„ã¾ã›ã‚“。 + </string> + <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"> + 土地ã®å‡ºè³‡è¨å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </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> + <tab_container name="group_money_tab_container"> + <panel label="計画" name="group_money_planning_tab"> + <text_editor name="group_money_planning_text"> + 計算ä¸... + </text_editor> + </panel> + <panel label="詳細" name="group_money_details_tab"> + <text_editor name="group_money_details_text"> + 計算ä¸â€¦ + </text_editor> + <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_details_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> + <button label="次ã®é€±" label_selected="次ã®é€±" name="later_details_button" tool_tip="次ã®é€±ã®å±¥æ´"/> + </panel> + <panel label="販売" name="group_money_sales_tab"> + <text_editor name="group_money_sales_text"> + 計算ä¸â€¦ + </text_editor> + <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_sales_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> + <button label="次ã®é€±" label_selected="次ã®é€±" name="later_sales_button" tool_tip="次ã®é€±ã®å±¥æ´"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml index 02ada7e6e58f15789cbc9e23866408fd4e7e807e..a652e3bf11d100217c899e3d95de8969ef2e716e 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="group_list_item"> - <text name="group_name" value="䏿˜Ž"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="group_list_item"> + <text name="group_name" value="䏿˜Ž"/> +</panel> 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 382fd02d5fdd074dfb1af85d08723aab09712a5d..1146065cd1bc1171e05876e85cc54f63235bba7b 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml @@ -1,66 +1,66 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="通知" name="notices_tab"> - <string name="help_text"> - 通知機能を使ã†ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã§ã™ã°ã‚„ãæƒ…å ±ã‚’ä¼é”ã§ãã¾ã™ã€‚ -複数ã®ã‚ã¦å…ˆã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã§ãã‚‹ã»ã‹ã€ -å¿…è¦ã«å¿œã˜ã¦ã‚¢ã‚¤ãƒ†ãƒ ã‚’ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ·»ä»˜ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ -通知ã¯ã€å—信アビリティãŒã‚る役割ã®ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«ã®ã¿é…ä¿¡ã•れã¾ã™ã€‚ -通知をオフã«ã™ã‚‹ã«ã¯ã€ä¸€èˆ¬ã‚¿ãƒ–を使ã„ã¾ã™ã€‚ - </string> - <string name="no_notices_text"> - éŽåŽ»ã®é€šçŸ¥ã¯ã‚りã¾ã›ã‚“。 - </string> - <button label="?" label_selected="?" name="help_button"/> - <text name="lbl"> - グループ通知アーカイブ - </text> - <text name="lbl2"> - 通知㯠14 日間ä¿å˜ã•れã¾ã™ã€‚ 通知リスト㯠1 ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã¤ãã€1 日最大 200ä»¶ ã«åˆ¶é™ã•れã¾ã™ã€‚ - </text> - <scroll_list name="notice_list"> - <column label="" name="icon"/> - <column label="ä»¶å" name="subject"/> - <column label="é€ã‚Šä¸»" name="from"/> - <column label="日付" name="date"/> - </scroll_list> - <text name="notice_list_none_found"> - 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </text> - <button label="æ–°ã—ã„通知" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice"/> - <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices"/> - <panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice"> - <text name="lbl"> - é€šçŸ¥ã‚’ä½œæˆ - </text> - <text name="lbl2"> - æŒã¡ç‰©ã‹ã‚‰ã“ã®ãƒ‘ãƒãƒ«ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦æ·»ä»˜ã§ãã¾ã™ã€‚ 添付ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—レゼントãŒå¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。ã¾ãŸã€ãƒ•ォルダã¯é€ã‚Œã¾ã›ã‚“。 - </text> - <text name="lbl3"> - ä»¶å: - </text> - <text name="lbl4"> - メッセージ: - </text> - <text name="lbl5"> - 添付: - </text> - <button label="添付物を削除" label_selected="添付物を削除" name="remove_attachment"/> - <button label="é€ä¿¡" label_selected="通知をé€ä¿¡" name="send_notice"/> - <panel name="drop_target" tool_tip="æŒã¡ç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ をメッセージ欄ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ãã ã•ã„。通知ã¨ä¸€ç·’ã«é€ä¿¡ã•れã¾ã™ã€‚é€ä¿¡ã™ã‚‹ã«ã¯ã‚³ãƒ”ーã€è²æ¸¡ãŒå¯èƒ½ãªã‚ªãƒ–ジェクトã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/> - </panel> - <panel label="éŽåŽ»ã®é€šçŸ¥ã‚’表示" name="panel_view_past_notice"> - <text name="lbl"> - アーカイブ通知 - </text> - <text name="lbl2"> - æ–°ã—ã„通知ã®é€ä¿¡ã¯ã€ä¸Šã®[æ–°ã—ã„通知を作æˆã™ã‚‹]をクリックã—ã¦ãã ã•ã„。 - </text> - <text name="lbl3"> - ä»¶å: - </text> - <text name="lbl4"> - メッセージ: - </text> - <button label="添付物を開ã" label_selected="添付物を開ã" name="open_attachment"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="通知" name="notices_tab"> + <string name="help_text"> + 通知機能を使ã†ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã§ã™ã°ã‚„ãæƒ…å ±ã‚’ä¼é”ã§ãã¾ã™ã€‚ +複数ã®ã‚ã¦å…ˆã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã§ãã‚‹ã»ã‹ã€ +å¿…è¦ã«å¿œã˜ã¦ã‚¢ã‚¤ãƒ†ãƒ ã‚’ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ·»ä»˜ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ +通知ã¯ã€å—信アビリティãŒã‚る役割ã®ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«ã®ã¿é…ä¿¡ã•れã¾ã™ã€‚ +通知をオフã«ã™ã‚‹ã«ã¯ã€ä¸€èˆ¬ã‚¿ãƒ–を使ã„ã¾ã™ã€‚ + </string> + <string name="no_notices_text"> + éŽåŽ»ã®é€šçŸ¥ã¯ã‚りã¾ã›ã‚“。 + </string> + <button label="?" label_selected="?" name="help_button"/> + <text name="lbl"> + グループ通知アーカイブ + </text> + <text name="lbl2"> + 通知㯠14 日間ä¿å˜ã•れã¾ã™ã€‚ 通知リスト㯠1 ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã¤ãã€1 日最大 200ä»¶ ã«åˆ¶é™ã•れã¾ã™ã€‚ + </text> + <scroll_list name="notice_list"> + <column label="" name="icon"/> + <column label="ä»¶å" name="subject"/> + <column label="é€ã‚Šä¸»" name="from"/> + <column label="日付" name="date"/> + </scroll_list> + <text name="notice_list_none_found"> + 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </text> + <button label="æ–°ã—ã„通知" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice"/> + <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices"/> + <panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice"> + <text name="lbl"> + é€šçŸ¥ã‚’ä½œæˆ + </text> + <text name="lbl2"> + æŒã¡ç‰©ã‹ã‚‰ã“ã®ãƒ‘ãƒãƒ«ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦æ·»ä»˜ã§ãã¾ã™ã€‚ 添付ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—レゼントãŒå¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。ã¾ãŸã€ãƒ•ォルダã¯é€ã‚Œã¾ã›ã‚“。 + </text> + <text name="lbl3"> + ä»¶å: + </text> + <text name="lbl4"> + メッセージ: + </text> + <text name="lbl5"> + 添付: + </text> + <button label="添付物を削除" label_selected="添付物を削除" name="remove_attachment"/> + <button label="é€ä¿¡" label_selected="通知をé€ä¿¡" name="send_notice"/> + <panel name="drop_target" tool_tip="æŒã¡ç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ をメッセージ欄ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ãã ã•ã„。通知ã¨ä¸€ç·’ã«é€ä¿¡ã•れã¾ã™ã€‚é€ä¿¡ã™ã‚‹ã«ã¯ã‚³ãƒ”ーã€è²æ¸¡ãŒå¯èƒ½ãªã‚ªãƒ–ジェクトã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/> + </panel> + <panel label="éŽåŽ»ã®é€šçŸ¥ã‚’表示" name="panel_view_past_notice"> + <text name="lbl"> + アーカイブ通知 + </text> + <text name="lbl2"> + æ–°ã—ã„通知ã®é€ä¿¡ã¯ã€ä¸Šã®[æ–°ã—ã„通知を作æˆã™ã‚‹]をクリックã—ã¦ãã ã•ã„。 + </text> + <text name="lbl3"> + ä»¶å: + </text> + <text name="lbl4"> + メッセージ: + </text> + <button label="添付物を開ã" label_selected="添付物を開ã" name="open_attachment"/> + </panel> +</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 c7e62635e46c5a5ff5cea3a8b08597eec6d5c456..963a4ba5e27faf02d1004bae319a24542f2d30c8 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml @@ -1,118 +1,118 @@ -<?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"> - ã“れらã®å¤‰æ›´ã‚’é©ç”¨ã—ã¾ã™ã‹ï¼Ÿ - </panel.string> - <tab_container name="roles_tab_container"> - <panel label="メンãƒãƒ¼" name="members_sub_tab" tool_tip="メンãƒãƒ¼"> - <panel.string name="help_text"> - ã‚ãªãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã‚’ä»˜åŠ ã€å‰Šé™¤ã§ãã¾ã™ã€‚ -Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ -複数ã®äººã‚’é¸æŠžã§ãã¾ã™ã€‚ - </panel.string> - <filter_editor label="メンãƒãƒ¼ã‚’é¸åˆ¥" name="filter_input"/> - <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> - <button label="招待" name="member_invite"/> - <button label="追放" name="member_eject"/> - </panel> - <panel label="役割" name="roles_sub_tab"> - <panel.string name="help_text"> - 役割ã«ã¯ã‚¿ã‚¤ãƒˆãƒ«ãŒã‚りã€ãƒ¡ãƒ³ãƒãƒ¼ãŒè¡Œä½¿å¯èƒ½ãª -能力ã®ãƒªã‚¹ãƒˆãŒå®šç¾©ã•れã¾ã™ã€‚ メンãƒãƒ¼ã¯ã€ -1ã¤ã¾ãŸã¯è¤‡æ•°ã®å½¹å‰²ã«å±žã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 1ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã—〠-「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã®å½¹å‰²ã‚’å«ã‚ã¦æœ€é«˜ã§10ã®å½¹å‰²ã‚’æŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </panel.string> - <panel.string name="cant_delete_role"> - 「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã¯ç‰¹åˆ¥ãªå½¹å‰²ãªã®ã§ã€å‰Šé™¤ã§ãã¾ã›ã‚“。 - </panel.string> - <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="members"/> - </scroll_list> - <button label="å½¹å‰²ã‚’è¿½åŠ " name="role_create"/> - <button label="役割を削除" name="role_delete"/> - </panel> - <panel label="能力" name="actions_sub_tab" tool_tip="能力ã®èª¬æ˜Žæ–‡ã«ã¯ã€ã©ã®å½¹å‰²ãƒ»ãƒ¡ãƒ³ãƒãƒ¼ãŒãã®èƒ½åŠ›ã‚’æŒã¤ã‹ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚"> - <panel.string name="help_text"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã§å½¹å‰²ã‚’与ãˆã‚‰ã‚Œã¦ã„るメンãƒãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹æ“作ã¯ã€ -能力ã«ã‚ˆã£ã¦æ±ºã¾ã‚Šã¾ã™ã€‚ ã•ã¾ã–ã¾ãªèƒ½åŠ›ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ - </panel.string> - <filter_editor label="能力をé¸åˆ¥" name="filter_input"/> - <scroll_list name="action_list" tool_tip="èƒ½åŠ›ã‚’é¸æŠžã—ã¦è©³ç´°ã‚’表示ã—ã¾ã™ã€‚"> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="action"/> - </scroll_list> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - 割当られãŸå½¹å‰² - </text> - <scroll_list name="member_assigned_roles"> - <scroll_list.columns label="" name="checkbox"/> - <scroll_list.columns label="" name="role"/> - </scroll_list> - <text name="static2"> - 許å¯ã•れãŸèƒ½åŠ› - </text> - <scroll_list name="member_allowed_actions" tool_tip="許å¯ã•れãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> - <scroll_list.columns label="" name="icon"/> - <scroll_list.columns label="" name="action"/> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - åå‰ - </text> - <line_editor name="role_name"> - 従æ¥å“¡ - </line_editor> - <text name="static3"> - 肩書ã - </text> - <line_editor name="role_title"> - (待機ä¸ï¼‰ - </line_editor> - <text name="static2"> - 説明 - </text> - <text_editor name="role_description"> - (待機ä¸ï¼‰ - </text_editor> - <text name="static4"> - 割当られãŸãƒ¡ãƒ³ãƒãƒ¼ - </text> - <check_box label="メンãƒãƒ¼ãŒå…¬é–‹çŠ¶æ…‹" name="role_visible_in_list" tool_tip="ã“ã®å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’グループ外ã®äººã®ä¸€èˆ¬ã‚¿ãƒ–ã«è¡¨ç¤ºã™ã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> - <text name="static5" tool_tip="ç¾åœ¨é¸æŠžã•れã¦ã„る役割ã§å®Ÿè¡Œã§ãる能力ã®ãƒªã‚¹ãƒˆ"> - 許å¯ã•れãŸèƒ½åŠ› - </text> - <scroll_list name="role_allowed_actions" tool_tip="許å¯ã•れãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> - <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"> - 説明 - </text> - <text_editor name="action_description"> - ã“れã¯ã€Œã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã™ã‚‹ã€èƒ½åŠ›ã§ã™ã€‚ オーナーを追放ã§ãã‚‹ã®ã¯ã€åˆ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã ã‘ã§ã™ã€‚ - </text_editor> - <text name="static2"> - 役割ã¨èƒ½åŠ› - </text> - <text name="static3"> - 能力ã®ã‚るメンãƒãƒ¼ - </text> - </panel> -</panel> +<?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"> + ã“れらã®å¤‰æ›´ã‚’é©ç”¨ã—ã¾ã™ã‹ï¼Ÿ + </panel.string> + <tab_container name="roles_tab_container"> + <panel label="メンãƒãƒ¼" name="members_sub_tab" tool_tip="メンãƒãƒ¼"> + <panel.string name="help_text"> + ã‚ãªãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã‚’ä»˜åŠ ã€å‰Šé™¤ã§ãã¾ã™ã€‚ +Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ +複数ã®äººã‚’é¸æŠžã§ãã¾ã™ã€‚ + </panel.string> + <filter_editor label="メンãƒãƒ¼ã‚’é¸åˆ¥" name="filter_input"/> + <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> + <button label="招待" name="member_invite"/> + <button label="追放" name="member_eject"/> + </panel> + <panel label="役割" name="roles_sub_tab"> + <panel.string name="help_text"> + 役割ã«ã¯ã‚¿ã‚¤ãƒˆãƒ«ãŒã‚りã€ãƒ¡ãƒ³ãƒãƒ¼ãŒè¡Œä½¿å¯èƒ½ãª +能力ã®ãƒªã‚¹ãƒˆãŒå®šç¾©ã•れã¾ã™ã€‚ メンãƒãƒ¼ã¯ã€ +1ã¤ã¾ãŸã¯è¤‡æ•°ã®å½¹å‰²ã«å±žã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 1ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã—〠+「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã®å½¹å‰²ã‚’å«ã‚ã¦æœ€é«˜ã§10ã®å½¹å‰²ã‚’æŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="cant_delete_role"> + 「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã¯ç‰¹åˆ¥ãªå½¹å‰²ãªã®ã§ã€å‰Šé™¤ã§ãã¾ã›ã‚“。 + </panel.string> + <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="members"/> + </scroll_list> + <button label="å½¹å‰²ã‚’è¿½åŠ " name="role_create"/> + <button label="役割を削除" name="role_delete"/> + </panel> + <panel label="能力" name="actions_sub_tab" tool_tip="能力ã®èª¬æ˜Žæ–‡ã«ã¯ã€ã©ã®å½¹å‰²ãƒ»ãƒ¡ãƒ³ãƒãƒ¼ãŒãã®èƒ½åŠ›ã‚’æŒã¤ã‹ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚"> + <panel.string name="help_text"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã§å½¹å‰²ã‚’与ãˆã‚‰ã‚Œã¦ã„るメンãƒãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹æ“作ã¯ã€ +能力ã«ã‚ˆã£ã¦æ±ºã¾ã‚Šã¾ã™ã€‚ ã•ã¾ã–ã¾ãªèƒ½åŠ›ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ + </panel.string> + <filter_editor label="能力をé¸åˆ¥" name="filter_input"/> + <scroll_list name="action_list" tool_tip="èƒ½åŠ›ã‚’é¸æŠžã—ã¦è©³ç´°ã‚’表示ã—ã¾ã™ã€‚"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + </tab_container> + <panel name="members_footer"> + <text name="static"> + 割当られãŸå½¹å‰² + </text> + <scroll_list name="member_assigned_roles"> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="role"/> + </scroll_list> + <text name="static2"> + 許å¯ã•れãŸèƒ½åŠ› + </text> + <scroll_list name="member_allowed_actions" tool_tip="許å¯ã•れãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="roles_footer"> + <text name="static"> + åå‰ + </text> + <line_editor name="role_name"> + 従æ¥å“¡ + </line_editor> + <text name="static3"> + 肩書ã + </text> + <line_editor name="role_title"> + (待機ä¸ï¼‰ + </line_editor> + <text name="static2"> + 説明 + </text> + <text_editor name="role_description"> + (待機ä¸ï¼‰ + </text_editor> + <text name="static4"> + 割当られãŸãƒ¡ãƒ³ãƒãƒ¼ + </text> + <check_box label="メンãƒãƒ¼ãŒå…¬é–‹çŠ¶æ…‹" name="role_visible_in_list" tool_tip="ã“ã®å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’グループ外ã®äººã®ä¸€èˆ¬ã‚¿ãƒ–ã«è¡¨ç¤ºã™ã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> + <text name="static5" tool_tip="ç¾åœ¨é¸æŠžã•れã¦ã„る役割ã§å®Ÿè¡Œã§ãる能力ã®ãƒªã‚¹ãƒˆ"> + 許å¯ã•れãŸèƒ½åŠ› + </text> + <scroll_list name="role_allowed_actions" tool_tip="許å¯ã•れãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> + <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"> + 説明 + </text> + <text_editor name="action_description"> + ã“れã¯ã€Œã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã™ã‚‹ã€èƒ½åŠ›ã§ã™ã€‚ オーナーを追放ã§ãã‚‹ã®ã¯ã€åˆ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã ã‘ã§ã™ã€‚ + </text_editor> + <text name="static2"> + 役割ã¨èƒ½åŠ› + </text> + <text name="static3"> + 能力ã®ã‚るメンãƒãƒ¼ + </text> + </panel> +</panel> 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 4182ca506fb494a773fcc13106f24ad1a3627ae4..48f04b2b5db8a47606fe491917997e7b212b7f5f 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 @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_im_control_panel"> - <button label="プãƒãƒ•ィールã®è¡¨ç¤º" name="view_profile_btn"/> - <button label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend_btn"/> - <button label="共有" name="share_btn"/> - <panel name="panel_call_buttons"> - <button label="コール" name="call_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <button label="プãƒãƒ•ィールã®è¡¨ç¤º" name="view_profile_btn"/> + <button label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend_btn"/> + <button label="共有" name="share_btn"/> + <panel name="panel_call_buttons"> + <button label="コール" name="call_btn"/> + </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 d55a78297c8a48e4885e5d52db498766f9724332..27eed48d825d96be8dc9b0044d6f7e562643d4a6 100644 --- a/indra/newview/skins/default/xui/ja/panel_login.xml +++ b/indra/newview/skins/default/xui/ja/panel_login.xml @@ -1,19 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_login"> - <panel.string name="create_account_url"> - http://jp.secondlife.com/registration/ - </panel.string> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <panel name="login_widgets"> - <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストãƒãƒ¼ãƒ "/> - <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] ラストãƒãƒ¼ãƒ "/> - <text name="start_location_text"> - é–‹å§‹ä½ç½®ï¼š - </text> - <text name="create_new_account_text"> - æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ä½œæˆ - </text> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://jp.secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=ja + </panel.string> + <panel name="login_widgets"> + <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストãƒãƒ¼ãƒ "/> + <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] ラストãƒãƒ¼ãƒ "/> + <text name="start_location_text"> + é–‹å§‹ä½ç½®ï¼š + </text> + <text name="create_new_account_text"> + æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ä½œæˆ + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml new file mode 100644 index 0000000000000000000000000000000000000000..84151f43cfa25f3acf51170990abbbedf452a527 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_me.xml @@ -0,0 +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"/> + </tab_container> +</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 159a63cd408781bd4335510050e0fdd561096b4b..04822c8848cd45400eca7d3141487bb2ac5f2c41 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,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="chat_bar"> - <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="エンターを押ã—ã¦ç™ºè¨€ã€Ctrl+エンターã§å«ã¶ã€‚"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="エンターを押ã—ã¦ç™ºè¨€ã€Ctrl+エンターã§å«ã¶ã€‚"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_pick_info.xml b/indra/newview/skins/default/xui/ja/panel_pick_info.xml index 711a4cf47a3cd909e58eebb0b80cc5497fd0d10f..30fd8d1adcda2025bfd6a7ae63bcb8447b19a529 100644 --- a/indra/newview/skins/default/xui/ja/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/ja/panel_pick_info.xml @@ -1,16 +1,16 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_pick_info"> - <text name="title" value="ãƒ”ãƒƒã‚¯ã®æƒ…å ±"/> - <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="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/> - <button label="地図" name="show_on_map_btn"/> - <button label="編集" name="edit_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="ãƒ”ãƒƒã‚¯ã®æƒ…å ±"/> + <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="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/> + <button label="地図" name="show_on_map_btn"/> + <button label="編集" name="edit_btn"/> + </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 6a391957e99f43b694d3fa83b782b03fd9d35d27..984d5f72680c96f0af5953538d9285b5fce2f238 100644 --- a/indra/newview/skins/default/xui/ja/panel_picks.xml +++ b/indra/newview/skins/default/xui/ja/panel_picks.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="ピック" name="panel_picks"> - <panel label="bottom_panel" name="edit_panel"> - <button name="new_btn" tool_tip="ç¾åœ¨åœ°ã‚’æ–°è¦ãƒ”ックã«è¿½åŠ "/> - </panel> - <panel name="buttons_cucks"> - <button label="地図" name="show_on_map_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ピック" name="panel_picks"> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="ç¾åœ¨åœ°ã‚’æ–°è¦ãƒ”ックã«è¿½åŠ "/> + </panel> + <panel name="buttons_cucks"> + <button label="地図" name="show_on_map_btn"/> + </panel> +</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 88e10aa832ed2058d52c6e82f084bf4a4e2e40ce..193d43311c3464181e9a3215d9ca11dadfe6383c 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -1,42 +1,42 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> - <radio_group name="chat_font_size"> - <radio_item label="å°" name="radio"/> - <radio_item label="ä¸" name="radio2"/> - <radio_item label="大" name="radio3"/> - </radio_group> - <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"/> - <text name="text_box4"> - システム - </text> - <color_swatch label="エラー" name="script_error"/> - <text name="text_box5"> - エラー - </text> - <color_swatch label="オブジェクト" name="objects"/> - <text name="text_box6"> - オブジェクト - </text> - <color_swatch label="所有者" name="owner"/> - <text name="text_box7"> - 所有者 - </text> - <color_swatch label="URL" name="links"/> - <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"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> + <radio_group name="chat_font_size"> + <radio_item label="å°" name="radio"/> + <radio_item label="ä¸" name="radio2"/> + <radio_item label="大" name="radio3"/> + </radio_group> + <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"/> + <text name="text_box4"> + システム + </text> + <color_swatch label="エラー" name="script_error"/> + <text name="text_box5"> + エラー + </text> + <color_swatch label="オブジェクト" name="objects"/> + <text name="text_box6"> + オブジェクト + </text> + <color_swatch label="所有者" name="owner"/> + <text name="text_box7"> + 所有者 + </text> + <color_swatch label="URL" name="links"/> + <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"/> +</panel> 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 7c02baedc0a49aa7af1cb1611d51007d1a14978a..fba2c5f18dace8649d39cc052e35d358108241ea 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml @@ -1,116 +1,116 @@ -<?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> - <text name="FasterText"> - 速ㄠ- </text> - <text name="BetterText"> - 速 - </text> - <text name="ShadersPrefText"> - 低 - </text> - <text name="ShadersPrefText2"> - ä¸ - </text> - <text name="ShadersPrefText3"> - 高 - </text> - <text name="ShadersPrefText4"> - 超高 - </text> - <panel label="CustomGraphics" name="CustomGraphics Panel"> - <text name="ShadersText"> - シェーダー: - </text> - <check_box initial_value="true" label="ãƒãƒ³ãƒ—・マッピングã¨å…‰æ²¢" name="BumpShiny"/> - <check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã‚°ãƒ©ãƒ•ィック・カード・ドライãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥é˜²æ¢ã«ãªã‚Šã¾ã™ã€‚"/> - <check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/> - <check_box initial_value="true" label="æ°´ã®åå°„" name="Reflections"/> - <text name="ReflectionDetailText"> - å射詳細: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item label="åœ°å½¢ã¨æ¨¹æœ¨" name="0"/> - <radio_item label="ã™ã¹ã¦ã®é™çš„オブジェクト" name="1"/> - <radio_item label="ã™ã¹ã¦ã®ã‚¢ãƒã‚¿ãƒ¼ã¨ã‚ªãƒ–ジェクト" name="2"/> - <radio_item label="ã™ã¹ã¦" name="3"/> - </radio_group> - <text name="AvatarRenderingText"> - ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š - </text> - <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"/> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="最大パーティクル数:" name="MaxParticleCount"/> - <slider label="ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:" name="RenderPostProcess"/> - <text name="MeshDetailText"> - メッシュ詳細: - </text> - <slider label=" オブジェクト:" name="ObjectMeshDetail"/> - <slider label=" フレã‚シプリム:" name="FlexibleMeshDetail"/> - <slider label=" 樹木:" name="TreeMeshDetail"/> - <slider label=" ã‚¢ãƒã‚¿ãƒ¼ï¼š" name="AvatarMeshDetail"/> - <slider label=" 地形:" name="TerrainMeshDetail"/> - <slider label=" 空:" name="SkyMeshDetail"/> - <text name="PostProcessText"> - 低 - </text> - <text name="ObjectMeshDetailText"> - 低 - </text> - <text name="FlexibleMeshDetailText"> - 低 - </text> - <text name="TreeMeshDetailText"> - 低 - </text> - <text name="AvatarMeshDetailText"> - 低 - </text> - <text name="TerrainMeshDetailText"> - 低 - </text> - <text name="SkyMeshDetailText"> - 低 - </text> - <text name="LightingDetailText"> - ライティング詳細: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item label="å¤ªé™½ã¨æœˆã®ã¿" name="SunMoon"/> - <radio_item label="近隣ã®ãƒãƒ¼ã‚«ãƒ«ãƒ»ãƒ©ã‚¤ãƒˆ" name="LocalLights"/> - </radio_group> - <text name="TerrainDetailText"> - 地形詳細: - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item label="低" name="0"/> - <radio_item label="高" name="2"/> - </radio_group> - </panel> - <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply"/> - <button label="リセット" name="Defaults"/> - <button label="詳ã—ã„è¨å®š" name="Advanced"/> - <button label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" label_selected="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" name="GraphicsHardwareButton"/> -</panel> +<?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> + <text name="FasterText"> + 速ㄠ+ </text> + <text name="BetterText"> + 速 + </text> + <text name="ShadersPrefText"> + 低 + </text> + <text name="ShadersPrefText2"> + ä¸ + </text> + <text name="ShadersPrefText3"> + 高 + </text> + <text name="ShadersPrefText4"> + 超高 + </text> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + シェーダー: + </text> + <check_box initial_value="true" label="ãƒãƒ³ãƒ—・マッピングã¨å…‰æ²¢" name="BumpShiny"/> + <check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã‚°ãƒ©ãƒ•ィック・カード・ドライãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥é˜²æ¢ã«ãªã‚Šã¾ã™ã€‚"/> + <check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="æ°´ã®åå°„" name="Reflections"/> + <text name="ReflectionDetailText"> + å射詳細: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="åœ°å½¢ã¨æ¨¹æœ¨" name="0"/> + <radio_item label="ã™ã¹ã¦ã®é™çš„オブジェクト" name="1"/> + <radio_item label="ã™ã¹ã¦ã®ã‚¢ãƒã‚¿ãƒ¼ã¨ã‚ªãƒ–ジェクト" name="2"/> + <radio_item label="ã™ã¹ã¦" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š + </text> + <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"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="最大パーティクル数:" name="MaxParticleCount"/> + <slider label="ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + メッシュ詳細: + </text> + <slider label=" オブジェクト:" name="ObjectMeshDetail"/> + <slider label=" フレã‚シプリム:" name="FlexibleMeshDetail"/> + <slider label=" 樹木:" name="TreeMeshDetail"/> + <slider label=" ã‚¢ãƒã‚¿ãƒ¼ï¼š" name="AvatarMeshDetail"/> + <slider label=" 地形:" name="TerrainMeshDetail"/> + <slider label=" 空:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + 低 + </text> + <text name="ObjectMeshDetailText"> + 低 + </text> + <text name="FlexibleMeshDetailText"> + 低 + </text> + <text name="TreeMeshDetailText"> + 低 + </text> + <text name="AvatarMeshDetailText"> + 低 + </text> + <text name="TerrainMeshDetailText"> + 低 + </text> + <text name="SkyMeshDetailText"> + 低 + </text> + <text name="LightingDetailText"> + ライティング詳細: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="å¤ªé™½ã¨æœˆã®ã¿" name="SunMoon"/> + <radio_item label="近隣ã®ãƒãƒ¼ã‚«ãƒ«ãƒ»ãƒ©ã‚¤ãƒˆ" name="LocalLights"/> + </radio_group> + <text name="TerrainDetailText"> + 地形詳細: + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="低" name="0"/> + <radio_item label="高" name="2"/> + </radio_group> + </panel> + <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply"/> + <button label="リセット" name="Defaults"/> + <button label="詳ã—ã„è¨å®š" name="Advanced"/> + <button label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" label_selected="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" name="GraphicsHardwareButton"/> +</panel> 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 f7b727de6c8c8aa92a564171d38d190654ad1445..e0122d123f3eac0486dfc03f2e071727a35146ba 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml @@ -1,20 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="ãƒãƒ£ãƒƒãƒˆè¨å®š" name="im"> - <panel.string name="log_in_to_change"> - ãƒã‚°ã‚¤ãƒ³ã—ã¦å¤‰æ›´ã—ã¦ãã ã•ã„ - </panel.string> - <button label="å±¥æ´ã®æ¶ˆåŽ»" name="clear_cache"/> - <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="log_instant_messages"/> - <radio_group name="ChatIMLogs"> - <radio_item label="ãƒãƒ£ãƒƒãƒˆ" name="radio1"/> - <radio_item label="IM" name="radio2"/> - </radio_group> - <button label="ブラウズ" label_selected="ブラウズ" name="log_path_button"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ãƒãƒ£ãƒƒãƒˆè¨å®š" name="im"> + <panel.string name="log_in_to_change"> + ãƒã‚°ã‚¤ãƒ³ã—ã¦å¤‰æ›´ã—ã¦ãã ã•ã„ + </panel.string> + <button label="å±¥æ´ã®æ¶ˆåŽ»" name="clear_cache"/> + <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="log_instant_messages"/> + <radio_group name="ChatIMLogs"> + <radio_item label="ãƒãƒ£ãƒƒãƒˆ" name="radio1"/> + <radio_item label="IM" name="radio2"/> + </radio_group> + <button label="ブラウズ" label_selected="ブラウズ" name="log_path_button"/> +</panel> 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 59357a366e143229bb6c6259fe4827c46e5a99d3..af8390ba5c3b6fa6de524953209de621e6f72528 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml @@ -1,46 +1,46 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="æ“作ã¨ã‚«ãƒ¡ãƒ©" name="Input panel"> - <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/> - <text name="Mouselook:"> - 一人称視点: - </text> - <text name=" Mouse Sensitivity"> - マウスã®ç²¾åº¦ - </text> - <check_box label="切り替ãˆ" name="invert_mouse"/> - <text name="Network:"> - ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ï¼š - </text> - <text name="Maximum bandwidth"> - 最大帯域幅 - </text> - <text name="text_box2"> - kbps - </text> - <check_box label="カスタムãƒãƒ¼ãƒˆ" name="connection_port_enabled"/> - <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_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> - <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_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"/> - <text name="Proxy location"> - プãƒã‚ã‚· - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="æ“作ã¨ã‚«ãƒ¡ãƒ©" name="Input panel"> + <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/> + <text name="Mouselook:"> + 一人称視点: + </text> + <text name=" Mouse Sensitivity"> + マウスã®ç²¾åº¦ + </text> + <check_box label="切り替ãˆ" name="invert_mouse"/> + <text name="Network:"> + ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ï¼š + </text> + <text name="Maximum bandwidth"> + 最大帯域幅 + </text> + <text name="text_box2"> + kbps + </text> + <check_box label="カスタムãƒãƒ¼ãƒˆ" name="connection_port_enabled"/> + <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_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> + <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_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"/> + <text name="Proxy location"> + プãƒã‚ã‚· + </text> +</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 c4bd21a5baf67341e7df736cdc3b71c3e38408f5..499f57d75e1d552ccb18b7aef9a7858c7f8af3a4 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -1,72 +1,72 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="音声ã¨ãƒ“デオ" name="Preference Media panel"> - <slider label="音é‡" name="System Volume"/> - <slider label="風ã®éŸ³é‡" name="Wind Volume"/> - <slider label="サウンド" name="SFX Volume"/> - <slider label="メディア" name="Media Volume"/> - <slider label="UI" name="UI Volume"/> - <slider label="ミュージック" name="Music Volume"/> - <slider label="ボイス" name="Voice Volume"/> - <text_editor name="voice_unavailable"> - ボイスãƒãƒ£ãƒƒãƒˆã‚’利用ã§ãã¾ã›ã‚“ - </text_editor> - <check_box label="ボイスãƒãƒ£ãƒƒãƒˆ" name="enable_voice_check"/> - <radio_group name="ear_location"> - <radio_item label="カメラã®ä½ç½®ã‹ã‚‰èžã" name="0"/> - <radio_item label="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰èžã" name="1"/> - </radio_group> - <button label="機器ã®è¨å®š" name="device_settings_btn"/> - <text name="muting_text"> - ボリューム: - </text> - <check_box label="オーディオをミュート" name="disable audio"/> - <text name="streaming_prefs_text"> - ストリーム環境è¨å®šï¼š - </text> - <text name="audio_prefs_text"> - オーディオ環境è¨å®šï¼š - </text> - <panel label="ボリューム" name="Volume Panel"/> - <check_box label="メディアを自動å†ç”Ÿ" name="auto_streaming_video"/> - <check_box label="最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ" name="mute_when_minimized"/> - <text name="streaming_text"> - ストリーミング: - </text> - <check_box label="音楽ãŒã‚ã‚‹å ´åˆå†ç”Ÿã™ã‚‹" name="streaming_music"/> - <check_box label="ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢ä½¿ç”¨å¯æ™‚ã«å†ç”Ÿ" name="streaming_video"/> - <text name="system_volume_text"> - サウンド効果: - </text> - <text name="wind_volume_text"> - 風ã®éŸ³é‡ï¼š - </text> - <text name="footsteps_volume_text"> - 足音: - </text> - <text name="ui_volume_text"> - UI音é‡ï¼š - </text> - <slider label="ドップラー効果" name="Doppler Effect"/> - <slider label="é éš”è¦å› " name="Distance Factor"/> - <slider label="ãƒãƒ¼ãƒ«ã‚ªãƒ•ä¿‚æ•°" name="Rolloff Factor"/> - <spinner label="L$変更基準点" name="L$ Change Threshold"/> - <spinner label="ヘルス変化基準点" name="Health Change Threshold"/> - <text name="doppler_effect_text"> - オーディオ環境è¨å®šï¼š - </text> - <text name="distance_factor_text"> - è·é›¢ä¿‚数: - </text> - <text name="rolloff_factor_text"> - ãƒãƒ¼ãƒ«ã‚ªãƒ•: - </text> - <text name="default_upload_bitrate_text"> - デフォルトUL速度: - </text> - <radio_group name="bitrate"> - <radio_item label="32kbps" name="32kbps"/> - <radio_item label="64kbps" name="64kbps"/> - <radio_item label="96kbps" name="96kbps"/> - <radio_item label="128kbps" name="128kbps"/> - </radio_group> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="音声ã¨ãƒ“デオ" name="Preference Media panel"> + <slider label="音é‡" name="System Volume"/> + <slider label="風ã®éŸ³é‡" name="Wind Volume"/> + <slider label="サウンド" name="SFX Volume"/> + <slider label="メディア" name="Media Volume"/> + <slider label="UI" name="UI Volume"/> + <slider label="ミュージック" name="Music Volume"/> + <slider label="ボイス" name="Voice Volume"/> + <text_editor name="voice_unavailable"> + ボイスãƒãƒ£ãƒƒãƒˆã‚’利用ã§ãã¾ã›ã‚“ + </text_editor> + <check_box label="ボイスãƒãƒ£ãƒƒãƒˆ" name="enable_voice_check"/> + <radio_group name="ear_location"> + <radio_item label="カメラã®ä½ç½®ã‹ã‚‰èžã" name="0"/> + <radio_item label="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰èžã" name="1"/> + </radio_group> + <button label="機器ã®è¨å®š" name="device_settings_btn"/> + <text name="muting_text"> + ボリューム: + </text> + <check_box label="オーディオをミュート" name="disable audio"/> + <text name="streaming_prefs_text"> + ストリーム環境è¨å®šï¼š + </text> + <text name="audio_prefs_text"> + オーディオ環境è¨å®šï¼š + </text> + <panel label="ボリューム" name="Volume Panel"/> + <check_box label="メディアを自動å†ç”Ÿ" name="auto_streaming_video"/> + <check_box label="最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ" name="mute_when_minimized"/> + <text name="streaming_text"> + ストリーミング: + </text> + <check_box label="音楽ãŒã‚ã‚‹å ´åˆå†ç”Ÿã™ã‚‹" name="streaming_music"/> + <check_box label="ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢ä½¿ç”¨å¯æ™‚ã«å†ç”Ÿ" name="streaming_video"/> + <text name="system_volume_text"> + サウンド効果: + </text> + <text name="wind_volume_text"> + 風ã®éŸ³é‡ï¼š + </text> + <text name="footsteps_volume_text"> + 足音: + </text> + <text name="ui_volume_text"> + UI音é‡ï¼š + </text> + <slider label="ドップラー効果" name="Doppler Effect"/> + <slider label="é éš”è¦å› " name="Distance Factor"/> + <slider label="ãƒãƒ¼ãƒ«ã‚ªãƒ•ä¿‚æ•°" name="Rolloff Factor"/> + <spinner label="L$変更基準点" name="L$ Change Threshold"/> + <spinner label="ヘルス変化基準点" name="Health Change Threshold"/> + <text name="doppler_effect_text"> + オーディオ環境è¨å®šï¼š + </text> + <text name="distance_factor_text"> + è·é›¢ä¿‚数: + </text> + <text name="rolloff_factor_text"> + ãƒãƒ¼ãƒ«ã‚ªãƒ•: + </text> + <text name="default_upload_bitrate_text"> + デフォルトUL速度: + </text> + <radio_group name="bitrate"> + <radio_item label="32kbps" name="32kbps"/> + <radio_item label="64kbps" name="64kbps"/> + <radio_item label="96kbps" name="96kbps"/> + <radio_item label="128kbps" name="128kbps"/> + </radio_group> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml index ff82043a0d9aaaf4f37b4d47d23c5de91610587b..a449c10e10896b5c1b8f33205f08dc906c1d655f 100644 --- a/indra/newview/skins/default/xui/ja/panel_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_profile.xml @@ -1,41 +1,45 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="プãƒãƒ•ィール" name="panel_profile"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="payment_update_link_url"> - http://www.secondlife.com/account/billing.php?lang=ja - </string> - <string name="my_account_link_url" value="http://secondlife.com/account"/> - <string name="no_partner_text" value="ãªã—"/> - <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="ç¾å®Ÿä¸–界:"/> - </panel> - <text name="me_homepage_text"> - Webサイト: - </text> - <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/> - <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> - <text name="title_partner_text" value="パートナー:"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="title_groups_text" value="グループ:"/> - </panel> - </scroll_container> - <panel name="profile_buttons_panel"> - <button label="フレンド登録" name="add_friend"/> - <button label="IM" name="im"/> - <button label="コール" name="call"/> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport"/> - </panel> - <panel name="profile_me_buttons_panel"> - <button label="プãƒãƒ•ィールã®ç·¨é›†" name="edit_profile_btn"/> - <button label="容姿ã®ç·¨é›†" name="edit_appearance_btn"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="プãƒãƒ•ィール" name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=ja-JP + </string> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=ja + </string> + <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=ja-JP"/> + <string name="no_partner_text" value="ãªã—"/> + <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="ç¾å®Ÿä¸–界:"/> + </panel> + <text name="me_homepage_text"> + Webサイト: + </text> + <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/> + <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> + <text name="title_partner_text" value="パートナー:"/> + <panel name="partner_data_panel"> + <text name="partner_text" value="[FIRST] [LAST]"/> + </panel> + <text name="title_groups_text" value="グループ:"/> + </panel> + </scroll_container> + <panel name="profile_buttons_panel"> + <button label="フレンド登録" name="add_friend"/> + <button label="IM" name="im"/> + <button label="コール" name="call"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport"/> + </panel> + <panel name="profile_me_buttons_panel"> + <button label="プãƒãƒ•ィールã®ç·¨é›†" name="edit_profile_btn"/> + <button label="容姿ã®ç·¨é›†" name="edit_appearance_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml index 7663851f61ac4346fce550be6436d45f9e0f8444..4aa2d5d9475415c0c7f93eca836ba9b5fc3ecc6c 100644 --- a/indra/newview/skins/default/xui/ja/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/ja/panel_profile_view.xml @@ -1,15 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_target_profile"> - <string name="status_online"> - オンライン - </string> - <string name="status_offline"> - オフライン - </string> - <text name="user_name" value="(ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°...)"/> - <text name="status" value="オンライン"/> - <tab_container name="tabs"> - <panel label="プãƒãƒ•ィール" name="panel_profile"/> - <panel label="ピック" name="panel_picks"/> - </tab_container> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + オンライン + </string> + <string name="status_offline"> + オフライン + </string> + <text name="user_name" value="(ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°...)"/> + <text name="status" value="オンライン"/> + <tab_container name="tabs"> + <panel label="プãƒãƒ•ィール" name="panel_profile"/> + <panel label="ピック" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml index 596d59b5777b51208dfa9af0369836338b22e20c..a7305fa7636a3ab35112f3e0b2750b5a424e6ca6 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/ja/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"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... - </panel.string> - <panel.string name="can_not_view"> - ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºãƒ»ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºãƒ»ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚ - </panel.string> - <panel.string name="public_objects_can_not_run"> - 公共ã®ã‚ªãƒ–ジェクトã§ã¯ã‚¹ã‚¯ãƒªãƒ—トを実行ã§ãã¾ã›ã‚“ - </panel.string> - <panel.string name="script_running"> - å®Ÿè¡Œä¸ - </panel.string> - <panel.string name="Title"> - スクリプト: [NAME] - </panel.string> - <text_editor name="Script Editor"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... - </text_editor> - <button label="ä¿å˜" label_selected="ä¿å˜" name="Save_btn"/> - <combo_box label="挿入..." name="Insert..."/> - <menu_bar name="script_menu"> - <menu label="ファイル" name="File"> - <menu_item_call label="ä¿å˜" name="Save"/> - <menu_item_call label="å¤‰æ›´ã‚’å…ƒã«æˆ»ã™" name="Revert All Changes"/> - </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="Select All"/> - <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/> - <menu_item_call label="検索 / å†é…ç½®..." name="Search / Replace..."/> - </menu> - <menu label="ヘルプ" name="Help"> - <menu_item_call label="ヘルプ..." name="Help..."/> - <menu_item_call label="ã‚ーワードヘルプ..." name="Keyword Help..."/> - </menu> - </menu_bar> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... + </panel.string> + <panel.string name="can_not_view"> + ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºãƒ»ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºãƒ»ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚ + </panel.string> + <panel.string name="public_objects_can_not_run"> + 公共ã®ã‚ªãƒ–ジェクトã§ã¯ã‚¹ã‚¯ãƒªãƒ—トを実行ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="script_running"> + å®Ÿè¡Œä¸ + </panel.string> + <panel.string name="Title"> + スクリプト: [NAME] + </panel.string> + <text_editor name="Script Editor"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... + </text_editor> + <button label="ä¿å˜" label_selected="ä¿å˜" name="Save_btn"/> + <combo_box label="挿入..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="ファイル" name="File"> + <menu_item_call label="ä¿å˜" name="Save"/> + <menu_item_call label="å¤‰æ›´ã‚’å…ƒã«æˆ»ã™" name="Revert All Changes"/> + </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="Select All"/> + <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/> + <menu_item_call label="検索 / å†é…ç½®..." name="Search / Replace..."/> + </menu> + <menu label="ヘルプ" name="Help"> + <menu_item_call label="ヘルプ..." name="Help..."/> + <menu_item_call label="ã‚ーワードヘルプ..." name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml index aea057657eb8fdb345687d788f4657e1c7e2493a..2308aff19bd9f028025428ca9f5b87f2e283db31 100644 --- a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml +++ b/indra/newview/skins/default/xui/ja/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="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_btn" tool_tip="ã“ã“をクリックã—ã¦ç«‹ã¡ä¸ŠãŒã‚Šã¾ã™ã€‚"/> - <button label="é£›è¡Œåœæ¢" name="stop_fly_btn" tool_tip="é£›è¡Œåœæ¢"/> -</panel> +<?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="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_btn" tool_tip="ã“ã“をクリックã—ã¦ç«‹ã¡ä¸ŠãŒã‚Šã¾ã™ã€‚"/> + <button label="é£›è¡Œåœæ¢" name="stop_fly_btn" tool_tip="é£›è¡Œåœæ¢"/> +</panel> 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 05f29b75908f1194dab07a107a74249226389846..a58a6d68aad68217aa38f52e2b283178ecb9db9e 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -1,22 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="status"> - <panel.string name="StatBarDaysOfWeek"> - 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日 - </panel.string> - <panel.string name="StatBarMonthsOfYear"> - 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月 - </panel.string> - <panel.string name="packet_loss_tooltip"> - パケットæå¤± - </panel.string> - <panel.string name="bandwidth_tooltip"> - 帯域幅 - </panel.string> - <panel.string name="buycurrencylabel"> - L$ [AMT] - </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="ç§ã®æ®‹é«˜ï¼š ã“ã“をクリックã—㦠L$ を購入"/> - <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋時)"> - 12:00 AM - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日 + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月 + </panel.string> + <panel.string name="packet_loss_tooltip"> + パケットæå¤± + </panel.string> + <panel.string name="bandwidth_tooltip"> + 帯域幅 + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="ç§ã®æ®‹é«˜ï¼š ã“ã“をクリックã—㦠L$ を購入"/> + <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋時)"> + 12:00 AM + </text> +</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 6cf008c5149099e1d604950ca0790dcbf3b836e1..2f5c2bf6a18e6856523700dfc31b3eed4eb88582 100644 --- a/indra/newview/skins/default/xui/ja/panel_world_map.xml +++ b/indra/newview/skins/default/xui/ja/panel_world_map.xml @@ -1,57 +1,57 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="world_map"> - <panel.string name="Loading"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... - </panel.string> - <panel.string name="InvalidLocation"> - 無効ãªä½ç½® - </panel.string> - <panel.string name="world_map_north"> - 北 - </panel.string> - <panel.string name="world_map_east"> - æ± - </panel.string> - <panel.string name="world_map_west"> - 西 - </panel.string> - <panel.string name="world_map_south"> - å— - </panel.string> - <panel.string name="world_map_southeast"> - å—æ± - </panel.string> - <panel.string name="world_map_northeast"> - åŒ—æ± - </panel.string> - <panel.string name="world_map_southwest"> - å—西 - </panel.string> - <panel.string name="world_map_northwest"> - 北西 - </panel.string> - <text label="北" name="floater_map_north" text="北"> - 北 - </text> - <text label="æ±" name="floater_map_east" text="æ±"> - æ± - </text> - <text label="西" name="floater_map_west" text="西"> - 西 - </text> - <text label="å—" name="floater_map_south" text="å—"> - å— - </text> - <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> - å—æ± - </text> - <text label="北æ±" name="floater_map_northeast" text="北æ±"> - åŒ—æ± - </text> - <text label="å—西" name="floater_map_southwest" text="å—西"> - å—西 - </text> - <text label="北西" name="floater_map_northwest" text="北西"> - 北西 - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="world_map"> + <panel.string name="Loading"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... + </panel.string> + <panel.string name="InvalidLocation"> + 無効ãªä½ç½® + </panel.string> + <panel.string name="world_map_north"> + 北 + </panel.string> + <panel.string name="world_map_east"> + æ± + </panel.string> + <panel.string name="world_map_west"> + 西 + </panel.string> + <panel.string name="world_map_south"> + å— + </panel.string> + <panel.string name="world_map_southeast"> + å—æ± + </panel.string> + <panel.string name="world_map_northeast"> + åŒ—æ± + </panel.string> + <panel.string name="world_map_southwest"> + å—西 + </panel.string> + <panel.string name="world_map_northwest"> + 北西 + </panel.string> + <text label="北" name="floater_map_north" text="北"> + 北 + </text> + <text label="æ±" name="floater_map_east" text="æ±"> + æ± + </text> + <text label="西" name="floater_map_west" text="西"> + 西 + </text> + <text label="å—" name="floater_map_south" text="å—"> + å— + </text> + <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> + å—æ± + </text> + <text label="北æ±" name="floater_map_northeast" text="北æ±"> + åŒ—æ± + </text> + <text label="å—西" name="floater_map_southwest" text="å—西"> + å—西 + </text> + <text label="北西" name="floater_map_northwest" text="北西"> + 北西 + </text> +</panel> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index ad630ab5dcd36d1f151555efe28fe22b56b3491c..fc9e4b67b71593288b92dda87d063faa2472ba53 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1,3149 +1,3150 @@ -<?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 - that are returned from one component and may appear in many places--> -<strings> - <string name="SECOND_LIFE"> - Second Life - </string> - <string name="APP_NAME"> - Second Life - </string> - <string name="SECOND_LIFE_GRID"> - Second Life Grid - </string> - <string name="SUPPORT_SITE"> - Second Lifeサãƒãƒ¼ãƒˆãƒãƒ¼ã‚¿ãƒ« - </string> - <string name="StartupDetectingHardware"> - ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºä¸ã§ã™... - </string> - <string name="StartupLoading"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚° - </string> - <string name="Fullbright"> - 明るã•全開(レガシー) - </string> - <string name="LoginInProgress"> - ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™ã€‚[APP_NAME]ã®è¡¨ç¤ºãŒãƒ•リーズã™ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。 - </string> - <string name="LoginInProgressNoFrozen"> - ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™... - </string> - <string name="LoginAuthenticating"> - èªè¨¼ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginMaintenance"> - アカウント・メンテナンスを実行ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginAttempt"> - å‰å›žã®ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™([NUMBER]回目) - </string> - <string name="LoginPrecaching"> - ワールドをãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingBrowser"> - 埋ã‚è¾¼ã¿Webãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingMultimedia"> - マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginVerifyingCache"> - ã‚ャッシュ・ファイルを検証ã—ã¦ã„ã¾ã™(æ‰€è¦æ™‚é–“ã¯60~90ç§’)... - </string> - <string name="LoginProcessingResponse"> - 応ç”を処ç†ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingWorld"> - ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginDecodingImages"> - ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingQuicktime"> - QuickTimeã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginQuicktimeNotFound"> - QuickTimeãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ - </string> - <string name="LoginQuicktimeOK"> - QuickTimeãŒæ£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚ - </string> - <string name="LoginWaitingForRegionHandshake"> - 地域ã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™... - </string> - <string name="LoginConnectingToRegion"> - åœ°åŸŸã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... - </string> - <string name="LoginDownloadingClothing"> - æœã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... - </string> - <string name="AgentLostConnection"> - ã“ã®åœ°åŸŸã«ã¯ã€å•題ãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。 - </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] - </string> - <string name="TooltipFlagGroupBuild"> - ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ - </string> - <string name="TooltipFlagNoBuild"> - 作æˆç¦æ¢ - </string> - <string name="TooltipFlagNoEdit"> - ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ - </string> - <string name="TooltipFlagNotSafe"> - å±é™º - </string> - <string name="TooltipFlagNoFly"> - é£›è¡Œç¦æ¢ - </string> - <string name="TooltipFlagGroupScripts"> - グループ・スクリプト - </string> - <string name="TooltipFlagNoScripts"> - スクリプトãªã— - </string> - <string name="TooltipLand"> - 土地: - </string> - <string name="TooltipMustSingleDrop"> - 1ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã‚’ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™ - </string> - <string name="TooltipHttpUrl"> - クリックã—ã¦ã“ã®Webページを見る - </string> - <string name="TooltipSLURL"> - クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…å ±ã‚’è¦‹ã‚‹ - </string> - <string name="TooltipAgentUrl"> - クリックã—ã¦ã“ã®ä½äººã®ãƒ—ãƒãƒ•ィールを見る - </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="TooltipSLAPP"> - クリックã—㦠secondlife:// コマンドを出㙠- </string> - <string name="BUTTON_CLOSE_DARWIN"> - é–‰ã˜ã‚‹ (⌘-W) - </string> - <string name="BUTTON_CLOSE_WIN"> - é–‰ã˜ã‚‹ (Ctrl+W) - </string> - <string name="BUTTON_RESTORE"> - 復元 - </string> - <string name="BUTTON_MINIMIZE"> - å…ƒã«æˆ»ã™ï¼ˆç¸®å°ï¼‰ - </string> - <string name="BUTTON_TEAR_OFF"> - 別ウィンドウã§é–‹ã - </string> - <string name="BUTTON_DOCK"> - ドッã‚ング - </string> - <string name="BUTTON_UNDOCK"> - 切り離㙠- </string> - <string name="BUTTON_HELP"> - ヘルプを表示 - </string> - <string name="RetrievingData"> - 検索ä¸... - </string> - <string name="ReleaseNotes"> - リリースノート - </string> - <string name="LoadingData"> - ãƒãƒ¼ãƒ‰ä¸... - </string> - <string name="AvatarNameNobody"> - (無人) - </string> - <string name="AvatarNameWaiting"> - (待機ä¸) - </string> - <string name="AvatarNameHippos"> - (ã‚«ãƒ) - </string> - <string name="GroupNameNone"> - (ãªã—) - </string> - <string name="AssetErrorNone"> - エラーãªã— - </string> - <string name="AssetErrorRequestFailed"> - 資産ã®è¦æ±‚: 失敗 - </string> - <string name="AssetErrorNonexistentFile"> - 資産ã®è¦æ±‚: å˜åœ¨ã—ãªã„ファイル - </string> - <string name="AssetErrorNotInDatabase"> - 資産ã®è¦æ±‚: データベースã§ã¯è¦‹ã¤ã‹ã‚‰ãªã„資産 - </string> - <string name="AssetErrorEOF"> - ファイルã®çµ‚ã‚り - </string> - <string name="AssetErrorCannotOpenFile"> - ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <string name="AssetErrorFileNotFound"> - ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ - </string> - <string name="AssetErrorTCPTimeout"> - ファイル転é€ã‚¿ã‚¤ãƒ アウトã§ã™ - </string> - <string name="AssetErrorCircuitGone"> - 接続ãŒè§£é™¤ã•れã¾ã—㟠- </string> - <string name="AssetErrorPriceMismatch"> - ビューワã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¾¡æ ¼ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“ - </string> - <string name="AssetErrorUnknownStatus"> - ステータスãŒä¸æ˜Žã§ã™ - </string> - <string name="texture"> - テクスãƒãƒ£ - </string> - <string name="sound"> - サウンド - </string> - <string name="calling card"> - コーリングカード - </string> - <string name="landmark"> - ランドマーク - </string> - <string name="legacy script"> - レガシースクリプト - </string> - <string name="clothing"> - 衣類 - </string> - <string name="object"> - オブジェクト - </string> - <string name="note card"> - ノートカード - </string> - <string name="folder"> - フォルダ - </string> - <string name="root"> - ルート - </string> - <string name="lsl2 script"> - lsl2 スクリプト - </string> - <string name="lsl bytecode"> - LSL ãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰ - </string> - <string name="tga texture"> - tga テクスãƒãƒ£ - </string> - <string name="body part"> - èº«ä½“éƒ¨ä½ - </string> - <string name="snapshot"> - スナップショット - </string> - <string name="lost and found"> - 紛失物 - </string> - <string name="targa image"> - targa ç”»åƒ - </string> - <string name="trash"> - ゴミ箱 - </string> - <string name="jpeg image"> - jpeg ç”»åƒ - </string> - <string name="animation"> - アニメーション - </string> - <string name="gesture"> - ジェスãƒãƒ£ãƒ¼ - </string> - <string name="simstate"> - 統計 - </string> - <string name="favorite"> - ãŠæ°—ã«å…¥ã‚Š - </string> - <string name="symbolic link"> - リンク - </string> - <string name="AvatarAway"> - 退å¸ä¸ - </string> - <string name="AvatarBusy"> - å–り込ã¿ä¸ - </string> - <string name="AvatarMuted"> - ミュート - </string> - <string name="anim_express_afraid"> - 怖れ - </string> - <string name="anim_express_anger"> - 怒り - </string> - <string name="anim_away"> - 退å¸ä¸ - </string> - <string name="anim_backflip"> - 後ã‚宙返り - </string> - <string name="anim_express_laugh"> - 大笑ㄠ- </string> - <string name="anim_express_toothsmile"> - 満é¢ã®ç¬‘é¡” - </string> - <string name="anim_blowkiss"> - 投ã’ã‚ッス - </string> - <string name="anim_express_bored"> - 退屈 - </string> - <string name="anim_bow"> - ãŠã˜ãŽ - </string> - <string name="anim_clap"> - æ‹æ‰‹ - </string> - <string name="anim_courtbow"> - æ·±ã„ãŠã˜ãŽ - </string> - <string name="anim_express_cry"> - æ³£ã - </string> - <string name="anim_dance1"> - ダンス1 - </string> - <string name="anim_dance2"> - ダンス2 - </string> - <string name="anim_dance3"> - ダンス3 - </string> - <string name="anim_dance4"> - ダンス4 - </string> - <string name="anim_dance5"> - ダンス5 - </string> - <string name="anim_dance6"> - ダンス6 - </string> - <string name="anim_dance7"> - ダンス7 - </string> - <string name="anim_dance8"> - ダンス8 - </string> - <string name="anim_express_disdain"> - 侮蔑 - </string> - <string name="anim_drink"> - é…”ã£ã±ã‚‰ã† - </string> - <string name="anim_express_embarrased"> - 困惑 - </string> - <string name="anim_angry_fingerwag"> - 指を振る - </string> - <string name="anim_fist_pump"> - ガッツãƒãƒ¼ã‚º - </string> - <string name="anim_yoga_float"> - ãƒ¨ã‚¬æµ®éŠ - </string> - <string name="anim_express_frown"> - ã—ã‹ã‚ã£é¢ - </string> - <string name="anim_impatient"> - ã„らã„らã™ã‚‹ - </string> - <string name="anim_jumpforjoy"> - 飛ã³ä¸ŠãŒã£ã¦å–œã¶ - </string> - <string name="anim_kissmybutt"> - 挑発ãƒãƒ¼ã‚º - </string> - <string name="anim_express_kiss"> - ã‚ス - </string> - <string name="anim_laugh_short"> - 笑ㆠ- </string> - <string name="anim_musclebeach"> - 力ã“ã¶ã‚’見ã›ã‚‹ - </string> - <string name="anim_no_unhappy"> - 䏿º€ã’ã«å¦å®šã™ã‚‹ - </string> - <string name="anim_no_head"> - å¦å®šã™ã‚‹ - </string> - <string name="anim_nyanya"> - 冷やã‹ã™ - </string> - <string name="anim_punch_onetwo"> - ワンツー・パンム- </string> - <string name="anim_express_open_mouth"> - å£ã‚’é–‹ã‘ã¦é©šã - </string> - <string name="anim_peace"> - ピース・サイン - </string> - <string name="anim_point_you"> - 他人を指差㙠- </string> - <string name="anim_point_me"> - 自分を指差㙠- </string> - <string name="anim_punch_l"> - 左パンム- </string> - <string name="anim_punch_r"> - å³ãƒ‘ンム- </string> - <string name="anim_rps_countdown"> - ã˜ã‚ƒã‚“ã‘ã‚“ãƒãƒ¼ã‚º - </string> - <string name="anim_rps_paper"> - パー - </string> - <string name="anim_rps_rock"> - グー - </string> - <string name="anim_rps_scissors"> - ãƒãƒ§ã‚ - </string> - <string name="anim_express_repulsed"> - 嫌悪感 - </string> - <string name="anim_kick_roundhouse_r"> - ã¾ã‚ã—蹴り - </string> - <string name="anim_express_sad"> - 悲ã—ã‚€ - </string> - <string name="anim_salute"> - 敬礼ã™ã‚‹ - </string> - <string name="anim_shout"> - å«ã¶ - </string> - <string name="anim_express_shrug"> - è‚©ã‚’ã™ãã‚ã‚‹ - </string> - <string name="anim_express_smile"> - 微笑む - </string> - <string name="anim_smoke_idle"> - ãŸã°ã“ã‚’ãゆら㙠- </string> - <string name="anim_smoke_inhale"> - ãŸã°ã“ã‚’å¸ã† - </string> - <string name="anim_smoke_throw_down"> - ãŸã°ã“ã‚’æ¨ã¦ã‚‹ - </string> - <string name="anim_express_surprise"> - 驚ã - </string> - <string name="anim_sword_strike_r"> - å‰£ã§æ–¬ã‚Šã¤ã‘ã‚‹ - </string> - <string name="anim_angry_tantrum"> - ã˜ã ã‚“ã ã‚’è¸ã‚€ - </string> - <string name="anim_express_tongue_out"> - 舌を出㙠- </string> - <string name="anim_hello"> - 手を振る - </string> - <string name="anim_whisper"> - å°å£°ã§è©±ã™ - </string> - <string name="anim_whistle"> - å£ç¬›ã‚’å¹ã - </string> - <string name="anim_express_wink"> - ウィンク - </string> - <string name="anim_wink_hollywood"> - ウィンク(ãƒãƒªã‚¦ãƒƒãƒ‰) - </string> - <string name="anim_express_worry"> - 心é…ã™ã‚‹ - </string> - <string name="anim_yes_happy"> - 笑顔ã§é ·ã - </string> - <string name="anim_yes_head"> - é ·ã - </string> - <string name="texture_loading"> - ãƒãƒ¼ãƒ‰ä¸... - </string> - <string name="worldmap_offline"> - オフライン - </string> - <string name="Ok"> - OK - </string> - <string name="Premature end of file"> - ä¸å®Œå…¨ãªãƒ•ァイル - </string> - <string name="ST_NO_JOINT"> - ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ - </string> - <string name="whisper"> - ã®ã•ã•ã‚„ã: - </string> - <string name="shout"> - ã®å«ã³: - </string> - <string name="ringing"> - インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸... - </string> - <string name="connected"> - 接続ã—ã¾ã—㟠- </string> - <string name="unavailable"> - ã‚ãªãŸã®ç¾åœ¨ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。 - </string> - <string name="hang_up"> - インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–ã•れã¾ã—㟠- </string> - <string name="ScriptQuestionCautionChatGranted"> - [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS] - </string> - <string name="ScriptQuestionCautionChatDenied"> - [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS] - </string> - <string name="ScriptTakeMoney"> - リンデンドル(L$)を支払ㆠ- </string> - <string name="ActOnControlInputs"> - 制御入力ã«åŸºã¥ã„ã¦è¡Œå‹• - </string> - <string name="RemapControlInputs"> - 制御入力ã®ãƒªãƒžãƒƒãƒ— - </string> - <string name="AnimateYourAvatar"> - ã‚¢ãƒã‚¿ãƒ¼ã¸ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å‹•作 - </string> - <string name="AttachToYourAvatar"> - ã‚¢ãƒã‚¿ãƒ¼ã«è£…ç€ - </string> - <string name="ReleaseOwnership"> - 所有権を解放ã—å…¬ã®ã‚‚ã®ã¨ã™ã‚‹ - </string> - <string name="LinkAndDelink"> - ä»–ã®ã‚ªãƒ–ジェクトã®ãƒªãƒ³ã‚¯ã¨ãƒªãƒ³ã‚¯è§£é™¤ - </string> - <string name="AddAndRemoveJoints"> - ä»–ã®ã‚ªãƒ–ジェクトã¨ã®ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è¿½åŠ ã¨å‰Šé™¤ - </string> - <string name="ChangePermissions"> - 権é™ã®å¤‰æ›´ - </string> - <string name="TrackYourCamera"> - カメラ追従 - </string> - <string name="ControlYourCamera"> - カメラã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« - </string> - <string name="SIM_ACCESS_PG"> - PG - </string> - <string name="SIM_ACCESS_MATURE"> - Mature - </string> - <string name="SIM_ACCESS_ADULT"> - Adult - </string> - <string name="SIM_ACCESS_DOWN"> - オフライン - </string> - <string name="SIM_ACCESS_MIN"> - 䏿˜Ž - </string> - <string name="land_type_unknown"> - ï¼ˆä¸æ˜Žï¼‰ - </string> - <string name="all_files"> - å…¨ã¦ã®ãƒ•ァイル - </string> - <string name="sound_files"> - サウンド - </string> - <string name="animation_files"> - アニメーション - </string> - <string name="image_files"> - ç”»åƒ - </string> - <string name="save_file_verb"> - ä¿å˜ - </string> - <string name="load_file_verb"> - ãƒãƒ¼ãƒ‰ - </string> - <string name="targa_image_files"> - Targaç”»åƒ - </string> - <string name="bitmap_image_files"> - ãƒ“ãƒƒãƒˆãƒžãƒƒãƒ—ç”»åƒ - </string> - <string name="avi_movie_file"> - AVIムービーファイル - </string> - <string name="xaf_animation_file"> - XAFアニメーションファイル - </string> - <string name="xml_file"> - XMLファイル - </string> - <string name="dot_raw_file"> - RAWファイル - </string> - <string name="compressed_image_files"> - åœ§ç¸®ç”»åƒ - </string> - <string name="load_files"> - ファイルã®ãƒãƒ¼ãƒ‰ - </string> - <string name="choose_the_directory"> - å‚ç…§ - </string> - <string name="AvatarSetNotAway"> - 一時退å¸ä¸ã‚’解除 - </string> - <string name="AvatarSetAway"> - 一時退å¸ä¸ - </string> - <string name="AvatarSetNotBusy"> - å–り込ã¿ä¸ã‚’解除 - </string> - <string name="AvatarSetBusy"> - å–り込ã¿ä¸ - </string> - <string name="shape"> - シェイプ - </string> - <string name="skin"> - スã‚ン - </string> - <string name="hair"> - 髪型 - </string> - <string name="eyes"> - ç›® - </string> - <string name="shirt"> - シャツ - </string> - <string name="pants"> - ズボン - </string> - <string name="shoes"> - é´ - </string> - <string name="socks"> - é´ä¸‹ - </string> - <string name="jacket"> - ä¸Šç€ - </string> - <string name="gloves"> - 手袋 - </string> - <string name="undershirt"> - 下ç€ã‚·ãƒ£ãƒ„ - </string> - <string name="underpants"> - 下ç€ãƒ‘ンツ - </string> - <string name="skirt"> - スカート - </string> - <string name="invalid"> - 無効 - </string> - <string name="BodyPartsRightArm"> - å³è…• - </string> - <string name="BodyPartsHead"> - é - </string> - <string name="BodyPartsLeftArm"> - 左腕 - </string> - <string name="BodyPartsLeftLeg"> - 左脚 - </string> - <string name="BodyPartsTorso"> - é - </string> - <string name="BodyPartsRightLeg"> - å³è„š - </string> - <string name="GraphicsQualityLow"> - 低 - </string> - <string name="GraphicsQualityMid"> - ä¸ - </string> - <string name="GraphicsQualityHigh"> - 高 - </string> - <string name="LeaveMouselook"> - ESC ã‚ーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚‹ - </string> - <string name="InventoryNoMatchingItems"> - 一致ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒæŒã¡ç‰©ã«ã‚りã¾ã›ã‚“ã§ã—㟠- </string> - <string name="InventoryNoTexture"> - æŒã¡ç‰©å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“ - </string> - <string name="LoadingContents"> - コンテンツをãƒãƒ¼ãƒ‰ä¸ã§ã™... - </string> - <string name="NoContents"> - コンテンツãªã— - </string> - <string name="InvFolder My Inventory"> - ç§ã®æŒã¡ç‰© - </string> - <string name="InvFolder My Favorites"> - ãŠæ°—ã«å…¥ã‚Š - </string> - <string name="InvFolder Library"> - ライブラリ - </string> - <string name="InvFolder Textures"> - テクスãƒãƒ£ - </string> - <string name="InvFolder Sounds"> - サウンド - </string> - <string name="InvFolder Calling Cards"> - コーリングカード - </string> - <string name="InvFolder Landmarks"> - ランドマーク - </string> - <string name="InvFolder Scripts"> - スクリプト - </string> - <string name="InvFolder Clothing"> - 衣類 - </string> - <string name="InvFolder Objects"> - オブジェクト - </string> - <string name="InvFolder Notecards"> - ノートカード - </string> - <string name="InvFolder New Folder"> - æ–°è¦ãƒ•ォルダ - </string> - <string name="InvFolder Inventory"> - æŒã¡ç‰© - </string> - <string name="InvFolder Uncompressed Images"> - 圧縮ã•れã¦ã„ãªã„ç”»åƒ - </string> - <string name="InvFolder Body Parts"> - èº«ä½“éƒ¨ä½ - </string> - <string name="InvFolder Trash"> - ゴミ箱 - </string> - <string name="InvFolder Photo Album"> - フォトアルãƒãƒ - </string> - <string name="InvFolder Lost And Found"> - 紛失物 - </string> - <string name="InvFolder Uncompressed Sounds"> - 圧縮ã•れã¦ã„ãªã„サウンド - </string> - <string name="InvFolder Animations"> - アニメーション - </string> - <string name="InvFolder Gestures"> - ジェスãƒãƒ£ãƒ¼ - </string> - <string name="InvFolder favorite"> - ãŠæ°—ã«å…¥ã‚Š - </string> - <string name="InvFolder Current Outfit"> - ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィット - </string> - <string name="InvFolder My Outfits"> - ç§ã®ã‚¢ã‚¦ãƒˆãƒ•ィット - </string> - <string name="InvFolder Friends"> - フレンド - </string> - <string name="InvFolder All"> - 全員 - </string> - <string name="Buy"> - 買ㆠ- </string> - <string name="BuyforL$"> - Buy for L$ - </string> - <string name="Stone"> - 石 - </string> - <string name="Metal"> - 金属 - </string> - <string name="Glass"> - ガラス - </string> - <string name="Wood"> - 木 - </string> - <string name="Flesh"> - 肌 - </string> - <string name="Plastic"> - プラスãƒãƒƒã‚¯ - </string> - <string name="Rubber"> - ゴム- </string> - <string name="Light"> - ライト - </string> - <string name="KBShift"> - Shift - </string> - <string name="KBCtrl"> - Ctrl - </string> - <string name="Chest"> - 胸部 - </string> - <string name="Skull"> - é è“‹ - </string> - <string name="Left Shoulder"> - 左肩 - </string> - <string name="Right Shoulder"> - å³è‚© - </string> - <string name="Left Hand"> - 左手 - </string> - <string name="Right Hand"> - 峿‰‹ - </string> - <string name="Left Foot"> - 左足 - </string> - <string name="Right Foot"> - å³è¶³ - </string> - <string name="Spine"> - 背骨 - </string> - <string name="Pelvis"> - 骨盤 - </string> - <string name="Mouth"> - å£ - </string> - <string name="Chin"> - ã‚ã” - </string> - <string name="Left Ear"> - 左耳 - </string> - <string name="Right Ear"> - å³è€³ - </string> - <string name="Left Eyeball"> - å·¦ç›®çœ¼çƒ - </string> - <string name="Right Eyeball"> - å³ç›®çœ¼çƒ - </string> - <string name="Nose"> - é¼» - </string> - <string name="R Upper Arm"> - å³ä¸Šè…• - </string> - <string name="R Forearm"> - å³å‰è…• - </string> - <string name="L Upper Arm"> - 左上腕 - </string> - <string name="L Forearm"> - å·¦å‰è…• - </string> - <string name="Right Hip"> - å³è…° - </string> - <string name="R Upper Leg"> - å³ä¸Šè„š - </string> - <string name="R Lower Leg"> - å³ä¸‹è„š - </string> - <string name="Left Hip"> - 左腰 - </string> - <string name="L Upper Leg"> - 左上脚 - </string> - <string name="L Lower Leg"> - 左下脚 - </string> - <string name="Stomach"> - è…¹ - </string> - <string name="Left Pec"> - å·¦èƒ¸ç‹ - </string> - <string name="Right Pec"> - å³èƒ¸ç‹ - </string> - <string name="YearsMonthsOld"> - [AGEYEARS] [AGEMONTHS] - </string> - <string name="YearsOld"> - [AGEYEARS] - </string> - <string name="MonthsOld"> - [AGEMONTHS] - </string> - <string name="WeeksOld"> - [AGEWEEKS] - </string> - <string name="DaysOld"> - [AGEDAYS] - </string> - <string name="TodayOld"> - 今日å‚åŠ - </string> - <string name="AgeYearsA"> - [COUNT] å¹´ - </string> - <string name="AgeYearsB"> - [COUNT] å¹´ - </string> - <string name="AgeYearsC"> - [COUNT] å¹´ - </string> - <string name="AgeMonthsA"> - [COUNT] ヶ月 - </string> - <string name="AgeMonthsB"> - [COUNT] ヶ月 - </string> - <string name="AgeMonthsC"> - [COUNT] ヶ月 - </string> - <string name="AgeWeeksA"> - [COUNT] 週間 - </string> - <string name="AgeWeeksB"> - [COUNT] 週間 - </string> - <string name="AgeWeeksC"> - [COUNT] 週間 - </string> - <string name="AgeDaysA"> - [COUNT] 日間 - </string> - <string name="AgeDaysB"> - [COUNT] 日間 - </string> - <string name="AgeDaysC"> - [COUNT] 日間 - </string> - <string name="AcctTypeResident"> - ä½äºº - </string> - <string name="AcctTypeTrial"> - トライアル - </string> - <string name="AcctTypeCharterMember"> - 特権メンãƒãƒ¼ - </string> - <string name="AcctTypeEmployee"> - Linden Lab従æ¥å“¡ - </string> - <string name="PaymentInfoUsed"> - æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆ - </string> - <string name="PaymentInfoOnFile"> - æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿ - </string> - <string name="NoPaymentInfoOnFile"> - æ”¯æ‰•ã„æƒ…å ±æœªç™»éŒ² - </string> - <string name="AgeVerified"> - å¹´é½¢ç¢ºèªæ¸ˆã¿ - </string> - <string name="NotAgeVerified"> - å¹´é½¢æœªç¢ºèª - </string> - <string name="Center 2"> - ä¸å¿ƒ 2 - </string> - <string name="Top Right"> - å³ä¸Š - </string> - <string name="Top"> - 上部 - </string> - <string name="Top Left"> - 左上 - </string> - <string name="Center"> - ä¸å¿ƒ - </string> - <string name="Bottom Left"> - Bottom Left - </string> - <string name="Bottom"> - Bottom - </string> - <string name="Bottom Right"> - Bottom Right - </string> - <string name="CompileQueueDownloadedCompiling"> - ダウンãƒãƒ¼ãƒ‰å®Œäº†ã€ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«ä¸ - </string> - <string name="CompileQueueScriptNotFound"> - サーãƒãƒ¼ä¸Šã«ã‚¹ã‚¯ãƒªãƒ—トãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </string> - <string name="CompileQueueProblemDownloading"> - ダウンãƒãƒ¼ãƒ‰ã«å•題ãŒã‚りã¾ã™ - </string> - <string name="CompileQueueInsufficientPermDownload"> - 権é™ä¸è¶³ã®ãŸã‚スクリプトをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 - </string> - <string name="CompileQueueInsufficientPermFor"> - 権é™ä¸è¶³ï¼š - </string> - <string name="CompileQueueUnknownFailure"> - åŽŸå› ä¸æ˜Žã®å¤±æ•—ã«ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“ - </string> - <string name="CompileQueueTitle"> - リコンパイル進行 - </string> - <string name="CompileQueueStart"> - リコンパイル - </string> - <string name="ResetQueueTitle"> - 進行をリセット - </string> - <string name="ResetQueueStart"> - リセット - </string> - <string name="RunQueueTitle"> - 実行を続ã‘るよã†è¨å®š - </string> - <string name="RunQueueStart"> - 実行ä¸ã«è¨å®š - </string> - <string name="NotRunQueueTitle"> - å®Ÿè¡Œã‚’åœæ¢ã™ã‚‹ã‚ˆã†è¨å®š - </string> - <string name="NotRunQueueStart"> - å®Ÿè¡Œåœæ¢ã«è¨å®š - </string> - <string name="CompileSuccessful"> - コンパイルãŒå®Œäº†ã—ã¾ã—ãŸï¼ - </string> - <string name="CompileSuccessfulSaving"> - コンパイル完了ã€ä¿å˜ä¸ã§ã™... - </string> - <string name="SaveComplete"> - ä¿å˜å®Œäº†ã€‚ - </string> - <string name="ObjectOutOfRange"> - スクリプト(オブジェクトãŒç¯„囲外ã«ã‚りã¾ã™ï¼‰ - </string> - <string name="GodToolsObjectOwnedBy"> - [OWNER] 所有ã®ã‚ªãƒ–ジェクト「[OBJECT]〠- </string> - <string name="GroupsNone"> - ãªã— - </string> - <string name="Unknown"> - ï¼ˆä¸æ˜Žï¼‰ - </string> - <string name="Balance"> - 残高 - </string> - <string name="Credits"> - åŽå…¥ - </string> - <string name="Debits"> - 支出 - </string> - <string name="Total"> - åˆè¨ˆ - </string> - <string name="NoGroupDataFound"> - グループã®ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠- </string> - <string name="IMParentEstate"> - parent estate - </string> - <string name="IMMainland"> - メインランド - </string> - <string name="IMTeen"> - ティーン - </string> - <string name="RegionInfoError"> - エラー - </string> - <string name="RegionInfoAllEstatesOwnedBy"> - [OWNER] ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産 - </string> - <string name="RegionInfoAllEstatesYouOwn"> - ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産 - </string> - <string name="RegionInfoAllEstatesYouManage"> - ã‚ãªãŸãŒ [OWNER] ã®ãŸã‚ã«ç®¡ç†ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産 - </string> - <string name="RegionInfoAllowedResidents"> - 許å¯ã•れãŸä½äººï¼š ([ALLOWEDAGENTS] äººã€æœ€å¤§ [MAXACCESS] 人) - </string> - <string name="RegionInfoAllowedGroups"> - 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] グループ) - </string> - <string name="CursorPos"> - [LINE] 行目ã€[COLUMN] 列目 - </string> - <string name="PanelDirCountFound"> - [COUNT] 件見ã¤ã‹ã‚Šã¾ã—㟠- </string> - <string name="PanelContentsNewScript"> - æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト - </string> - <string name="MuteByName"> - (å称別) - </string> - <string name="MuteAgent"> - (ä½äººï¼‰ - </string> - <string name="MuteObject"> - (オブジェクト) - </string> - <string name="MuteGroup"> - (グループ) - </string> - <string name="RegionNoCovenant"> - ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 - </string> - <string name="RegionNoCovenantOtherOwner"> - ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 ã“ã®ä¸å‹•産上ã®åœŸåœ°ã¯ä¸å‹•産所有者ã«ã‚ˆã‚Šè²©å£²ã•れã€Linden Lab ã§ã¯è²©å£²ã—ã¦ã„ã¾ã›ã‚“。 販売ã«é–¢ã™ã‚‹ãŠå•ã„åˆã‚ã›ã¯ã€ä¸å‹•産所有者ã¾ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚ - </string> - <string name="covenant_last_modified"> - æœ€çµ‚ä¿®æ£æ—¥ï¼š - </string> - <string name="GroupOwned"> - グループ所有 - </string> - <string name="Public"> - パブリック - </string> - <string name="ClassifiedClicksTxt"> - クリック数: [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プãƒãƒ•ィール - </string> - <string name="ClassifiedUpdateAfterPublish"> - (掲載後更新) - </string> - <string name="GroupVoteYes"> - ã¯ã„ - </string> - <string name="GroupVoteNo"> - ã„ã„㈠- </string> - <string name="GroupVoteNoActiveProposals"> - 継続ä¸ã®ææ¡ˆã¯ç¾åœ¨ã‚りã¾ã›ã‚“ - </string> - <string name="GroupVoteNoArchivedProposals"> - ææ¡ˆã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã¯ç¾åœ¨ã‚りã¾ã›ã‚“ - </string> - <string name="GroupVoteRetrievingArchivedProposals"> - ææ¡ˆã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‚’å–å¾—ä¸ã§ã™ - </string> - <string name="GroupVoteRetrievingActiveProposals"> - 継続ä¸ã®ææ¡ˆã‚’å–å¾—ä¸ã§ã™ - </string> - <string name="MultiPreviewTitle"> - プレビュー - </string> - <string name="MultiPropertiesTitle"> - Properties - </string> - <string name="InvOfferAnObjectNamed"> - オブジェクトå - </string> - <string name="InvOfferOwnedByGroup"> - 所有グループ - </string> - <string name="InvOfferOwnedByUnknownGroup"> - 䏿˜Žãªã‚°ãƒ«ãƒ¼ãƒ—所有 - </string> - <string name="InvOfferOwnedBy"> - 所有者 - </string> - <string name="InvOfferOwnedByUnknownUser"> - 䏿˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼æ‰€æœ‰ - </string> - <string name="InvOfferGaveYou"> - gave you - </string> - <string name="InvOfferYouDecline"> - You decline - </string> - <string name="InvOfferFrom"> - from - </string> - <string name="GroupMoneyTotal"> - åˆè¨ˆ - </string> - <string name="GroupMoneyBought"> - bought - </string> - <string name="GroupMoneyPaidYou"> - paid you - </string> - <string name="GroupMoneyPaidInto"> - paid into - </string> - <string name="GroupMoneyBoughtPassTo"> - bought pass to - </string> - <string name="GroupMoneyPaidFeeForEvent"> - paid fee for event - </string> - <string name="GroupMoneyPaidPrizeForEvent"> - paid prize for event - </string> - <string name="GroupMoneyBalance"> - 残高 - </string> - <string name="GroupMoneyCredits"> - åŽå…¥ - </string> - <string name="GroupMoneyDebits"> - 支出 - </string> - <string name="ViewerObjectContents"> - ä¸èº« - </string> - <string name="AcquiredItems"> - å–得アイテム- </string> - <string name="Cancel"> - ã‚ャンセル - </string> - <string name="UploadingCosts"> - %s ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ä»£é‡‘: - </string> - <string name="UnknownFileExtension"> - 䏿˜Žã®æ‹¡å¼µå: %s -使用å¯èƒ½ãªæ‹¡å¼µå: .wav, .tga, .bmp, .jpg, .jpeg, or .bvh - </string> - <string name="AddLandmarkNavBarMenu"> - ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’è¿½åŠ ... - </string> - <string name="EditLandmarkNavBarMenu"> - ランドマークを編集... - </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> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Shift+ - </string> - <string name="FileSaved"> - ファイルãŒä¿å˜ã•れã¾ã—㟠- </string> - <string name="Receiving"> - å–å¾—ä¸ - </string> - <string name="AM"> - AM - </string> - <string name="PM"> - PM - </string> - <string name="PST"> - 米国西部標準時 - </string> - <string name="PDT"> - ç±³å›½è¥¿éƒ¨å¤æ™‚é–“ - </string> - <string name="Forward"> - å‰ - </string> - <string name="Left"> - å·¦ - </string> - <string name="Right"> - å³ - </string> - <string name="Back"> - 後゠- </string> - <string name="North"> - 北 - </string> - <string name="South"> - å— - </string> - <string name="West"> - 西 - </string> - <string name="East"> - æ± - </string> - <string name="Up"> - 上 - </string> - <string name="Down"> - 下 - </string> - <string name="Any Category"> - 全カテゴリ - </string> - <string name="Shopping"> - ショッピング - </string> - <string name="Land Rental"> - 土地ã®ãƒ¬ãƒ³ã‚¿ãƒ« - </string> - <string name="Property Rental"> - 建物ã®ãƒ¬ãƒ³ã‚¿ãƒ« - </string> - <string name="Special Attraction"> - 特別アトラクション - </string> - <string name="New Products"> - æ–°è£½å“ - </string> - <string name="Employment"> - 雇用 - </string> - <string name="Wanted"> - 求む - </string> - <string name="Service"> - サービス - </string> - <string name="Personal"> - パーソナル - </string> - <string name="None"> - ãªã— - </string> - <string name="Linden Location"> - Linden所在地 - </string> - <string name="Adult"> - Adult - </string> - <string name="Arts&Culture"> - アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼ - </string> - <string name="Business"> - ビジãƒã‚¹ - </string> - <string name="Educational"> - 教育的 - </string> - <string name="Gaming"> - ゲーム- </string> - <string name="Hangout"> - ãŸã¾ã‚Šå ´ - </string> - <string name="Newcomer Friendly"> - æ–°ä½äººã«å¥½æ„çš„ - </string> - <string name="Parks&Nature"> - 公園ã¨è‡ªç„¶ - </string> - <string name="Residential"> - ä½å®…用 - </string> - <string name="Stage"> - ステージ - </string> - <string name="Other"> - ãã®ä»– - </string> - <string name="Any"> - 全員 - </string> - <string name="You"> - ã‚ãªãŸ - </string> - <string name=":"> - : - </string> - <string name=","> - , - </string> - <string name="..."> - ... - </string> - <string name="***"> - *** - </string> - <string name="("> - ( - </string> - <string name=")"> - ) - </string> - <string name="."> - . - </string> - <string name="'"> - ' - </string> - <string name="---"> - --- - </string> - <string name="MBCmdLineError"> - コマンドラインã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ -リンク先をå‚ç…§ã—ã¦ãã ã•ã„: http://wiki.secondlife.com/wiki/Client_parameters -エラー: - </string> - <string name="MBCmdLineUsg"> - [APP_NAME] コマンドライン使用: - </string> - <string name="MBUnableToAccessFile"> - [APP_NAME] ã¯å¿…è¦ãªãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。 - -複数ã®ã‚³ãƒ”ーを実行ä¸ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«é–‹ã„ã¦ã„ã‚‹ã¨ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãŒèª¤èªè˜ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 -ãれã§ã‚‚å•題ãŒç¶šãå ´åˆã€[APP_NAME] を完全ã«ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã€å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã—ã¦ãã ã•ã„。 - </string> - <string name="MBFatalError"> - 致命的ãªã‚¨ãƒ©ãƒ¼ - </string> - <string name="MBRequiresAltiVec"> - [APP_NAME] ã¯ã€AltiVecæè¼‰ã®ãƒ—ãƒã‚»ãƒƒã‚µãŒå¿…è¦ã§ã™ã€‚(G4 以é™ï¼‰ - </string> - <string name="MBAlreadyRunning"> - [APP_NAME] ã¯ã™ã§ã«å®Ÿè¡Œä¸ã§ã™ã€‚ -最å°åŒ–ã•れãŸãƒ—ãƒã‚°ãƒ©ãƒ ã®ã‚³ãƒ”ーをタスクãƒãƒ¼ã§ç¢ºèªã—ã¦ãã ã•ã„。 -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ãã ã•ã„。 - </string> - <string name="MBFrozenCrashed"> - [APP_NAME] ã¯å‰å›žã®å®Ÿè¡Œæ™‚ã«ãƒ•リーズã—ã¦ã„ã¾ã™ã€‚ -ã‚¯ãƒ©ãƒƒã‚·ãƒ¥å ±å‘Šã‚’é€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ - </string> - <string name="MBAlert"> - è¦å‘Š - </string> - <string name="MBNoDirectX"> - [APP_NAME] 㯠DirectX 9.0b åŠã³ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’検出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -[APP_NAME] 㯠DirectX を使用ã—ã¦å®‰å®šæ€§ã®å•題ã€ä½Žãƒ‘フォーマンスã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ç‰æ‚ªå½±éŸ¿ã‚’与ãˆã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚„å¤ã„ドライãƒã‚’検出ã—ã¾ã™ã€‚ DirectX 9.0b ãŒãªãã¦ã‚‚ [APP_NAME] を実行ã§ãã¾ã™ãŒã€DirectX 9.0bã¨ã®ã”ä½¿ç”¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ã€‚ - -ç¶šã‘ã¾ã™ã‹ï¼Ÿ - </string> - <string name="MBWarning"> - è¦å‘Š - </string> - <string name="MBNoAutoUpdate"> - 自動更新ã¯ç¾åœ¨ Linux ã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。 -www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 - </string> - <string name="MBRegClassFailed"> - RegisterClass 失敗 - </string> - <string name="MBError"> - エラー - </string> - <string name="MBFullScreenErr"> - [WIDTH] x [HEIGHT] ã§ã¯å…¨ç”»é¢ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 -ウィンドウモードã§å®Ÿè¡Œä¸ã§ã™ã€‚ - </string> - <string name="MBDestroyWinFailed"> - シャットダウンエラー(DestroyWindow() 失敗) - </string> - <string name="MBShutdownErr"> - シャットダウンエラー - </string> - <string name="MBDevContextErr"> - GL ディãƒã‚¤ã‚¹ã‚³ãƒ³ãƒ†ã‚ストãŒä½œã‚Œã¾ã›ã‚“ - </string> - <string name="MBPixelFmtErr"> - é©åˆ‡ãªãƒ”クセル形å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ - </string> - <string name="MBPixelFmtDescErr"> - ãƒ”ã‚¯ã‚»ãƒ«å½¢å¼æƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ - </string> - <string name="MBTrueColorWindow"> - [APP_NAME] をウィンドウã§å®Ÿè¡Œã™ã‚‹ã«ã¯ã€True Color(32ビット)ãŒå¿…è¦ã§ã™ã€‚ -「コントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€ã«è¡Œãã€ã€Œæœ€é«˜ (32 ビット)ã€ã«è¨å®šã—ã¦ãã ã•ã„。 -全画é¢ã‚’é¸æŠžã—ãŸå ´åˆã€å®Ÿè¡Œæ™‚ã« [APP_NAME] ã¯è‡ªå‹•çš„ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚’調整ã—ã¾ã™ã€‚ - </string> - <string name="MBAlpha"> - [APP_NAME] 㯠8 ビットã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã§ããªã„ãŸã‚実行ã§ãã¾ã›ã‚“。 通常ビデオカードã®ãƒ‰ãƒ©ã‚¤ãƒã®å•題ã§èµ·ã“りã¾ã™ã€‚ -ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã«æœ€æ–°ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 -ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32ビット)ã€ã«è¨å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。 -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 - </string> - <string name="MBPixelFmtSetErr"> - ピクセル形å¼ãŒè¨å®šã§ãã¾ã›ã‚“ - </string> - <string name="MBGLContextErr"> - GL レンダーコンテã‚ストãŒä½œã‚Œã¾ã›ã‚“ - </string> - <string name="MBGLContextActErr"> - GL レンダーコンテã‚ストをアクティベートã§ãã¾ã›ã‚“ - </string> - <string name="MBVideoDrvErr"> - ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。 - -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 - </string> - <string name="5 O'Clock Shadow"> - ã†ã£ã™ã‚‰ã¨ã—ãŸãƒ’ゲ - </string> - <string name="All White"> - 真ã£ç™½ - </string> - <string name="Anime Eyes"> - アニメ風ã®ç›® - </string> - <string name="Arced"> - アーム- </string> - <string name="Arm Length"> - è…•ã®é•·ã• - </string> - <string name="Attached"> - å° - </string> - <string name="Attached Earlobes"> - 耳ãŸã¶ - </string> - <string name="Back Bangs"> - 後ã‚ã«ã‹ã上ã’ãŸå‰é«ª - </string> - <string name="Back Bangs Down"> - 後ã‚ã«ã‹ã上ã’ã¦ä¸‹ã‚ã—ãŸå‰é«ª - </string> - <string name="Back Bangs Up"> - 後ã‚ã«ã‹ã上ã’ã¦æŒã¡ä¸Šã’ãŸå‰é«ª - </string> - <string name="Back Fringe"> - 後ã‚é«ªã®æ¯›å…ˆ - </string> - <string name="Back Hair"> - 後ã‚髪 - </string> - <string name="Back Hair Down"> - 下ã‚ã—ãŸå¾Œã‚髪 - </string> - <string name="Back Hair Up"> - アップã«ã—ãŸå¾Œã‚髪 - </string> - <string name="Baggy"> - ãŸã‚‹ã‚“ã§ã„ã‚‹ - </string> - <string name="Bangs"> - å‰é«ª - </string> - <string name="Bangs Down"> - 下ã‚ã—ãŸå‰é«ª - </string> - <string name="Bangs Up"> - æŒã¡ä¸Šã’ãŸå‰é«ª - </string> - <string name="Beady Eyes"> - ビーズã®ã‚ˆã†ãªç›® - </string> - <string name="Belly Size"> - ãŠè…¹ã®å¤§ãã• - </string> - <string name="Big"> - 大 - </string> - <string name="Big Butt"> - 大 - </string> - <string name="Big Eyeball"> - 大ãã„çœ¼çƒ - </string> - <string name="Big Hair Back"> - 髪ã®å¤§éƒ¨åˆ†ï¼š 後゠- </string> - <string name="Big Hair Front"> - 髪ã®å¤§éƒ¨åˆ†ï¼š å‰ - </string> - <string name="Big Hair Top"> - 髪ã®å¤§éƒ¨åˆ†ï¼š 上部 - </string> - <string name="Big Head"> - 大 - </string> - <string name="Big Pectorals"> - 大 - </string> - <string name="Big Spikes"> - ã¨ã’ã‚り - </string> - <string name="Black"> - é»’ - </string> - <string name="Blonde"> - ブãƒãƒ³ãƒ‰ - </string> - <string name="Blonde Hair"> - ブãƒãƒ³ãƒ‰ã®é«ª - </string> - <string name="Blush"> - ãƒãƒ¼ã‚¯ - </string> - <string name="Blush Color"> - ãƒãƒ¼ã‚¯ã‚«ãƒ©ãƒ¼ - </string> - <string name="Blush Opacity"> - ãƒãƒ¼ã‚¯ã®æ¿ƒã• - </string> - <string name="Body Definition"> - 体ã®ç²¾ç´°åº¦ - </string> - <string name="Body Fat"> - 体脂肪 - </string> - <string name="Body Freckles"> - 体ã®ã—ã¿ãƒ»ãã°ã‹ã™ - </string> - <string name="Body Thick"> - 骨太 - </string> - <string name="Body Thickness"> - 体ã®åŽšã¿ - </string> - <string name="Body Thin"> - ç´°ã‚ - </string> - <string name="Bow Legged"> - 外股 - </string> - <string name="Breast Buoyancy"> - 胸ã®é‡åŠ› - </string> - <string name="Breast Cleavage"> - 胸ã®è°·é–“ - </string> - <string name="Breast Size"> - 胸ã®å¤§ãã• - </string> - <string name="Bridge Width"> - 両目ã®é–“ã®å¹… - </string> - <string name="Broad"> - 広 - </string> - <string name="Brow Size"> - 眉毛ã®å¤§ãã• - </string> - <string name="Bug Eyes"> - Bug Eyes - </string> - <string name="Bugged Eyes"> - çªã出ãŸç›® - </string> - <string name="Bulbous"> - ã ã‚“ã” - </string> - <string name="Bulbous Nose"> - ã ã‚“ã”é¼» - </string> - <string name="Bushy Eyebrows"> - 太 - </string> - <string name="Bushy Hair"> - ã¼ã•ã¼ã•ヘア - </string> - <string name="Butt Size"> - ãŠå°»ã®å¤§ãã• - </string> - <string name="bustle skirt"> - 後ã‚ã®è†¨ã‚‰ã¿ - </string> - <string name="no bustle"> - 膨らã¿ãªã— - </string> - <string name="more bustle"> - 膨らã¿å¤§ - </string> - <string name="Chaplin"> - Chaplin - </string> - <string name="Cheek Bones"> - ã»ãŠéª¨ - </string> - <string name="Chest Size"> - 胸部ã®å¤§ãã• - </string> - <string name="Chin Angle"> - ã‚ã”ã®è§’度 - </string> - <string name="Chin Cleft"> - ã‚ã”ã®å…ˆã®å‰²ã‚Œå…·åˆ - </string> - <string name="Chin Curtains"> - ã‚ã”ã«æ²¿ã£ãŸã²ã’ - </string> - <string name="Chin Depth"> - ã‚ã”ã®é•·ã• - </string> - <string name="Chin Heavy"> - ã‚ã”ã«é‡ç‚¹ - </string> - <string name="Chin In"> - ã²ã„ãŸã‚ã” - </string> - <string name="Chin Out"> - çªã出ãŸã‚ã” - </string> - <string name="Chin-Neck"> - ã‚ã”ã¨é¦– - </string> - <string name="Clear"> - クリア - </string> - <string name="Cleft"> - 割れ㟠- </string> - <string name="Close Set Eyes"> - é¡”ã®ä¸å¿ƒå¯„りã®ç›® - </string> - <string name="Closed"> - クãƒãƒ¼ã‚º - </string> - <string name="Closed Back"> - 後ã‚ã¨ã˜ - </string> - <string name="Closed Front"> - å‰ã¨ã˜ - </string> - <string name="Closed Left"> - å·¦ã¨ã˜ - </string> - <string name="Closed Right"> - å³ã¨ã˜ - </string> - <string name="Coin Purse"> - コイン入れ - </string> - <string name="Collar Back"> - 後ã‚ãˆã‚Š - </string> - <string name="Collar Front"> - å‰ãˆã‚Š - </string> - <string name="Corner Down"> - ダウン - </string> - <string name="Corner Normal"> - ノーマル - </string> - <string name="Corner Up"> - アップ - </string> - <string name="Creased"> - é‡ã„ã¾ã¶ãŸ - </string> - <string name="Crooked Nose"> - 曲ãŒã£ãŸé¼» - </string> - <string name="Cropped Hair"> - çŸã刈り込んã 髪 - </string> - <string name="Cuff Flare"> - 袖å£ã®ãƒ•レア - </string> - <string name="Dark"> - ダーク - </string> - <string name="Dark Green"> - ダークグリーン - </string> - <string name="Darker"> - ダーク - </string> - <string name="Deep"> - å°–ã£ãŸ - </string> - <string name="Default Heels"> - デフォルトã®ã‹ã‹ã¨ - </string> - <string name="Default Toe"> - デフォルトã®ã¤ã¾å…ˆ - </string> - <string name="Dense"> - 濃 - </string> - <string name="Dense hair"> - 密度ã®å¤šã„髪 - </string> - <string name="Double Chin"> - 二é‡ã‚ã” - </string> - <string name="Downturned"> - 下å‘ã - </string> - <string name="Duffle Bag"> - ダッフルãƒãƒƒã‚° - </string> - <string name="Ear Angle"> - 耳ã®è§’度 - </string> - <string name="Ear Size"> - 耳ã®å¤§ãã• - </string> - <string name="Ear Tips"> - 耳ã®å…ˆ - </string> - <string name="Egg Head"> - ãŸã¾ã”é - </string> - <string name="Eye Bags"> - 下ã¾ã¶ãŸ - </string> - <string name="Eye Color"> - çž³ã®è‰² - </string> - <string name="Eye Depth"> - ç›®ã®ãã¼ã¿ - </string> - <string name="Eye Lightness"> - çž³ã®æ˜Žã‚‹ã• - </string> - <string name="Eye Opening"> - 見開ãå…·åˆ - </string> - <string name="Eye Pop"> - 両目ã®å¤§ãã•ã®å¯¾ç§° - </string> - <string name="Eye Size"> - ç›®ã®å¤§ãã• - </string> - <string name="Eye Spacing"> - ç›®ã¨ç›®ã®ã‚ã„ã ã®å¹… - </string> - <string name="Eyeball Size"> - 眼çƒã®å¤§ãã• - </string> - <string name="Eyebrow Arc"> - 眉毛ã®ã‚¢ãƒ¼ãƒ - </string> - <string name="Eyebrow Density"> - 眉毛ã®å¯†é›†åº¦ - </string> - <string name="Eyebrow Height"> - 眉毛ã®é«˜ã• - </string> - <string name="Eyebrow Points"> - 眉毛ã®è§’ - </string> - <string name="Eyebrow Size"> - 眉毛ã®å¤§ãã• - </string> - <string name="Eyelash Length"> - ã¾ã¤ã’ã®é•·ã• - </string> - <string name="Eyeliner"> - アイライナー - </string> - <string name="Eyeliner Color"> - アイライナーã®è‰² - </string> - <string name="Eyes Back"> - 目・戻る - </string> - <string name="Eyes Bugged"> - 下ã¾ã¶ãŸãŒãŸã‚‹ã‚“ã ç›® - </string> - <string name="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"> - 離れãŸç›® - </string> - <string name="Eyes Sunken"> - ãã¼ã‚“ã ç›® - </string> - <string name="Eyes Together"> - Eyes Together - </string> - <string name="Face Shear"> - é¡”ã®ã‚†ãŒã¿ - </string> - <string name="Facial Definition"> - é¡”ã®ç²¾ç´°åº¦ - </string> - <string name="Far Set Eyes"> - 離れãŸç›® - </string> - <string name="Fat"> - 太ã£ãŸ - </string> - <string name="Fat Head"> - 太ã‚ã®é - </string> - <string name="Fat Lips"> - 大 - </string> - <string name="Fat Lower"> - Fat Lower - </string> - <string name="Fat Lower Lip"> - 厚ã‚ã®ä¸‹å”‡ - </string> - <string name="Fat Torso"> - 太ã‚ã®é 部 - </string> - <string name="Fat Upper"> - Fat Upper - </string> - <string name="Fat Upper Lip"> - 厚ã‚ã®ä¸Šå”‡ - </string> - <string name="Female"> - 女性 - </string> - <string name="Fingerless"> - 指ãªã— - </string> - <string name="Fingers"> - 指ã‚り - </string> - <string name="Flared Cuffs"> - 広ãŒã£ãŸè¢–å£ - </string> - <string name="Flat"> - 平ら - </string> - <string name="Flat Butt"> - å° - </string> - <string name="Flat Head"> - çµ¶å£é - </string> - <string name="Flat Toe"> - フラット - </string> - <string name="Foot Size"> - è¶³ã®å¤§ãã• - </string> - <string name="Forehead Angle"> - ã²ãŸã„ã®è§’度 - </string> - <string name="Forehead Heavy"> - ã²ãŸã„ã«é‡ç‚¹ - </string> - <string name="Freckles"> - ã—ã¿ãƒ»ãã°ã‹ã™ - </string> - <string name="Front Bangs Down"> - 下ã‚ã—ãŸå‰é«ª - </string> - <string name="Front Bangs Up"> - 上ã’ãŸå‰é«ª - </string> - <string name="Front Fringe"> - å‰é«ªã®æ¯›å…ˆ - </string> - <string name="Front Hair"> - å‰é«ª - </string> - <string name="Front Hair Down"> - 下ã‚ã—ãŸå‰é«ª - </string> - <string name="Front Hair Up"> - アップã«ã—ãŸå‰é«ª - </string> - <string name="Full Back"> - 刈られã¦ã„ãªã„髪 - </string> - <string name="Full Eyeliner"> - ã‚り - </string> - <string name="Full Front"> - 刈られã¦ã„ãªã„髪 - </string> - <string name="Full Hair Sides"> - サイドã®é«ª - </string> - <string name="Full Sides"> - ç”Ÿãˆæƒã£ãŸã‚µã‚¤ãƒ‰ - </string> - <string name="Glossy"> - ã‚り - </string> - <string name="Glove Fingers"> - æ‰‹è¢‹ã®æŒ‡ - </string> - <string name="Glove Length"> - 手袋ã®é•·ã• - </string> - <string name="Hair"> - 髪 - </string> - <string name="Hair Back"> - 髪: 後゠- </string> - <string name="Hair Front"> - 髪: å‰ - </string> - <string name="Hair Sides"> - 髪: サイド - </string> - <string name="Hair Sweep"> - æµã™ - </string> - <string name="Hair Thickess"> - 髪ã®é‡ - </string> - <string name="Hair Thickness"> - 髪ã®é‡ - </string> - <string name="Hair Tilt"> - 髪ã®å‘ã - </string> - <string name="Hair Tilted Left"> - å·¦å‘ã - </string> - <string name="Hair Tilted Right"> - å³å‘ã - </string> - <string name="Hair Volume"> - 髪: ボリューム- </string> - <string name="Hand Size"> - 手ã®å¤§ãã• - </string> - <string name="Handlebars"> - ãƒãƒ³ãƒ‰ãƒ«ãƒãƒ¼ - </string> - <string name="Head Length"> - é ã®é•·ã• - </string> - <string name="Head Shape"> - é ã®å½¢ - </string> - <string name="Head Size"> - é ã®å¤§ãã• - </string> - <string name="Head Stretch"> - é ã®ä¼¸ã³å…·åˆ - </string> - <string name="Heel Height"> - ヒールã®é«˜ã• - </string> - <string name="Heel Shape"> - ヒールã®å½¢ - </string> - <string name="Height"> - 身長 - </string> - <string name="High"> - 高 - </string> - <string name="High Heels"> - ãƒã‚¤ãƒ’ール - </string> - <string name="High Jaw"> - 高 - </string> - <string name="High Platforms"> - 厚底 - </string> - <string name="High and Tight"> - 高ã‚ã§ã‚¿ã‚¤ãƒˆ - </string> - <string name="Higher"> - 高 - </string> - <string name="Hip Length"> - è…°ã®é•·ã• - </string> - <string name="Hip Width"> - è…°ã®å¹… - </string> - <string name="In"> - 内å‘ã - </string> - <string name="In Shdw Color"> - 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼ - </string> - <string name="In Shdw Opacity"> - 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã• - </string> - <string name="Inner Eye Corner"> - ç›®é - </string> - <string name="Inner Eye Shadow"> - 内å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦ - </string> - <string name="Inner Shadow"> - 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ - </string> - <string name="Jacket Length"> - ジャケット丈 - </string> - <string name="Jacket Wrinkles"> - ジャケットã®ã—ã‚ - </string> - <string name="Jaw Angle"> - ã‚ã”ã®è§’度 - </string> - <string name="Jaw Jut"> - ã‚ã”ã®çªå‡º - </string> - <string name="Jaw Shape"> - ã‚ã”ã®å½¢ - </string> - <string name="Join"> - 寄ã›ãŸ - </string> - <string name="Jowls"> - ãˆã‚‰ - </string> - <string name="Knee Angle"> - è†ã®è§’度 - </string> - <string name="Knock Kneed"> - 内股 - </string> - <string name="Large"> - 大 - </string> - <string name="Large Hands"> - 大 - </string> - <string name="Left Part"> - 左分㑠- </string> - <string name="Leg Length"> - 脚ã®é•·ã• - </string> - <string name="Leg Muscles"> - 脚ã®ç‹è‚‰ - </string> - <string name="Less"> - å° - </string> - <string name="Less Body Fat"> - å°‘ãªã‚ - </string> - <string name="Less Curtains"> - å°‘ãªã‚ - </string> - <string name="Less Freckles"> - å°‘ãªã‚ - </string> - <string name="Less Full"> - è–„ã„ - </string> - <string name="Less Gravity"> - å°‘ - </string> - <string name="Less Love"> - å°‘ - </string> - <string name="Less Muscles"> - å°‘ãªã‚ - </string> - <string name="Less Muscular"> - å°‘ãªã‚ - </string> - <string name="Less Rosy"> - å°‘ãªç›® - </string> - <string name="Less Round"> - 丸ã¿å°‘ãªç›® - </string> - <string name="Less Saddle"> - å° - </string> - <string name="Less Square"> - å° - </string> - <string name="Less Volume"> - ボリューム少ãªç›® - </string> - <string name="Less soul"> - å° - </string> - <string name="Lighter"> - ライト - </string> - <string name="Lip Cleft"> - 唇ã®å±± - </string> - <string name="Lip Cleft Depth"> - 唇ã®å±±ã®é«˜ã• - </string> - <string name="Lip Fullness"> - 唇ã®åŽšã¿ - </string> - <string name="Lip Pinkness"> - 唇ã®èµ¤ã¿ - </string> - <string name="Lip Ratio"> - 上下唇ã®å¤§ãã• - </string> - <string name="Lip Thickness"> - 唇ã®å‰å¾Œå¹… - </string> - <string name="Lip Width"> - å£ã®å¤§ãã• - </string> - <string name="Lipgloss"> - リップグãƒã‚¹ - </string> - <string name="Lipstick"> - å£ç´… - </string> - <string name="Lipstick Color"> - å£ç´…ã®è‰² - </string> - <string name="Long"> - é•· - </string> - <string name="Long Head"> - å‰å¾Œå¹…ãŒåºƒã„é - </string> - <string name="Long Hips"> - é•· - </string> - <string name="Long Legs"> - é•· - </string> - <string name="Long Neck"> - é•· - </string> - <string name="Long Pigtails"> - é•· - </string> - <string name="Long Ponytail"> - é•· - </string> - <string name="Long Torso"> - é•· - </string> - <string name="Long arms"> - é•· - </string> - <string name="Longcuffs"> - ãƒãƒ³ã‚°ã‚«ãƒ•ス - </string> - <string name="Loose Pants"> - ゆã£ãŸã‚Š - </string> - <string name="Loose Shirt"> - ゆる゠- </string> - <string name="Loose Sleeves"> - ゆる゠- </string> - <string name="Love Handles"> - ウエスト周り - </string> - <string name="Low"> - 低 - </string> - <string name="Low Heels"> - ãƒãƒ¼ãƒ’ール - </string> - <string name="Low Jaw"> - 低 - </string> - <string name="Low Platforms"> - 低゠- </string> - <string name="Low and Loose"> - 低ã‚ã§ã‚†ã£ãŸã‚Š - </string> - <string name="Lower"> - 低 - </string> - <string name="Lower Bridge"> - é¼»ç‹ - </string> - <string name="Lower Cheeks"> - ã»ãŠã®ä¸‹éƒ¨ - </string> - <string name="Male"> - 男性 - </string> - <string name="Middle Part"> - 真んä¸åˆ†ã‘ - </string> - <string name="More"> - 大 - </string> - <string name="More Blush"> - ãã¤ã‚ - </string> - <string name="More Body Fat"> - 多゠- </string> - <string name="More Curtains"> - 多゠- </string> - <string name="More Eyeshadow"> - ã‚り - </string> - <string name="More Freckles"> - 多゠- </string> - <string name="More Full"> - 厚ㄠ- </string> - <string name="More Gravity"> - 大 - </string> - <string name="More Lipstick"> - ã‚り - </string> - <string name="More Love"> - 大 - </string> - <string name="More Lower Lip"> - 大 - </string> - <string name="More Muscles"> - 多゠- </string> - <string name="More Muscular"> - ç‹éª¨éš†ã€… - </string> - <string name="More Rosy"> - 多゠- </string> - <string name="More Round"> - ã¾ã‚‹ - </string> - <string name="More Saddle"> - 大 - </string> - <string name="More Sloped"> - ãªã ら㋠- </string> - <string name="More Square"> - 四角 - </string> - <string name="More Upper Lip"> - 大 - </string> - <string name="More Vertical"> - 垂直 - </string> - <string name="More Volume"> - 大 - </string> - <string name="More soul"> - 大 - </string> - <string name="Moustache"> - å£ã²ã’ - </string> - <string name="Mouth Corner"> - å£è§’ - </string> - <string name="Mouth Position"> - å£ã®ä½ç½® - </string> - <string name="Mowhawk"> - モヒカン - </string> - <string name="Muscular"> - ç‹éª¨ãŸãã¾ã—ã„ - </string> - <string name="Mutton Chops"> - マトンãƒãƒ§ãƒƒãƒ—ス - </string> - <string name="Nail Polish"> - マニã‚ュア - </string> - <string name="Nail Polish Color"> - マニã‚ュアã®è‰² - </string> - <string name="Narrow"> - ç‹ - </string> - <string name="Narrow Back"> - ç‹ - </string> - <string name="Narrow Front"> - ç‹ - </string> - <string name="Narrow Lips"> - ãŠã¡ã‚‡ã¼å£ - </string> - <string name="Natural"> - ナãƒãƒ¥ãƒ©ãƒ« - </string> - <string name="Neck Length"> - 首ã®é•·ã• - </string> - <string name="Neck Thickness"> - 首ã®å¤ªã• - </string> - <string name="No Blush"> - ãªã— - </string> - <string name="No Eyeliner"> - ãªã— - </string> - <string name="No Eyeshadow"> - ãªã— - </string> - <string name="No Heels"> - ãªã— - </string> - <string name="No Lipgloss"> - ãªã— - </string> - <string name="No Lipstick"> - ãªã— - </string> - <string name="No Part"> - ãªã— - </string> - <string name="No Polish"> - ãªã— - </string> - <string name="No Red"> - ãªã— - </string> - <string name="No Spikes"> - ãªã— - </string> - <string name="No White"> - ãªã— - </string> - <string name="No Wrinkles"> - ãªã— - </string> - <string name="Normal Lower"> - Normal Lower - </string> - <string name="Normal Upper"> - Normal Upper - </string> - <string name="Nose Left"> - 左曲ãŒã‚Š - </string> - <string name="Nose Right"> - 峿›²ãŒã‚Š - </string> - <string name="Nose Size"> - é¼»ã®å¤§ãã• - </string> - <string name="Nose Thickness"> - é¼»ã®åŽšã¿ - </string> - <string name="Nose Tip Angle"> - 鼻先ã®è§’度 - </string> - <string name="Nose Tip Shape"> - 鼻先ã®å½¢ - </string> - <string name="Nose Width"> - é¼»ã®å¹… - </string> - <string name="Nostril Division"> - é¼»ã®ç©´ã®é«˜ã• - </string> - <string name="Nostril Width"> - é¼»ã®ç©´ã®å¹… - </string> - <string name="Old"> - Old - </string> - <string name="Opaque"> - 濃ã„ã‚ - </string> - <string name="Open"> - オープン - </string> - <string name="Open Back"> - 後ã‚ã‚ã - </string> - <string name="Open Front"> - å‰ã‚ã - </string> - <string name="Open Left"> - å·¦ã‚ã - </string> - <string name="Open Right"> - å³ã‚ã - </string> - <string name="Orange"> - オレンジ - </string> - <string name="Out"> - 外å‘ã - </string> - <string name="Out Shdw Color"> - 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼ - </string> - <string name="Out Shdw Opacity"> - 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã• - </string> - <string name="Outer Eye Corner"> - 目尻 - </string> - <string name="Outer Eye Shadow"> - 外å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦ - </string> - <string name="Outer Shadow"> - 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ - </string> - <string name="Overbite"> - å‡ºã£æ¯ - </string> - <string name="Package"> - パッケージ - </string> - <string name="Painted Nails"> - ã‚り - </string> - <string name="Pale"> - 悪ㄠ- </string> - <string name="Pants Crotch"> - パンツã®è‚¡ - </string> - <string name="Pants Fit"> - パンツã®ãƒ•ィット感 - </string> - <string name="Pants Length"> - パンツ丈 - </string> - <string name="Pants Waist"> - ウエスト - </string> - <string name="Pants Wrinkles"> - パンツã®ã—ã‚ - </string> - <string name="Part"> - ã‚り - </string> - <string name="Part Bangs"> - 分ã‘ãŸå‰é«ª - </string> - <string name="Pectorals"> - èƒ¸ç‹ - </string> - <string name="Pigment"> - è‰²ç´ - </string> - <string name="Pigtails"> - 下ã’髪 - </string> - <string name="Pink"> - ピンク - </string> - <string name="Pinker"> - ピンク - </string> - <string name="Platform Height"> - é´åº•ã®é«˜ã• - </string> - <string name="Platform Width"> - é´åº•ã®å¹… - </string> - <string name="Pointy"> - å°–ã£ãŸ - </string> - <string name="Pointy Heels"> - å¹…ç‹ - </string> - <string name="Pointy Toe"> - å…ˆã®ç´°ã„ã¤ã¾å…ˆ - </string> - <string name="Ponytail"> - ãƒãƒ‹ãƒ¼ãƒ†ãƒ¼ãƒ« - </string> - <string name="Poofy Skirt"> - ãµã‚“ã‚り - </string> - <string name="Pop Left Eye"> - 左目を大ãã - </string> - <string name="Pop Right Eye"> - å³ç›®ã‚’大ãã - </string> - <string name="Puffy"> - ãµã£ãら - </string> - <string name="Puffy Eyelids"> - ç›®ã®å‘¨ã‚Šã®è†¨ã‚‰ã¿ - </string> - <string name="Rainbow Color"> - 虹色 - </string> - <string name="Red Hair"> - 赤毛 - </string> - <string name="Red Skin"> - 赤ã„肌 - </string> - <string name="Regular"> - 凿•´ã®ã¨ã‚ŒãŸ - </string> - <string name="Regular Muscles"> - 凿•´ã®ã¨ã‚ŒãŸç‹è‚‰ - </string> - <string name="Right Part"> - å³åˆ†ã‘ - </string> - <string name="Rosy Complexion"> - ã»ãŠã®èµ¤ã‚‰ã¿ - </string> - <string name="Round"> - ã¾ã‚‹ã£ã“ã„ - </string> - <string name="Round Forehead"> - 丸ã¿ã‚’帯ã³ãŸé¡ - </string> - <string name="Ruddiness"> - 血色 - </string> - <string name="Ruddy"> - 良ㄠ- </string> - <string name="Rumpled Hair"> - ãã—ゃãã—ゃヘア - </string> - <string name="Saddle Bags"> - 腰回りã®è‚‰ä»˜ã - </string> - <string name="Saddlebags"> - 腰回りã®è‚‰ä»˜ã - </string> - <string name="Scrawny"> - 骨張ã£ãŸ - </string> - <string name="Scrawny Leg"> - 骨張ã£ãŸè„š - </string> - <string name="Separate"> - 離れ㟠- </string> - <string name="Shading"> - Shading - </string> - <string name="Shadow hair"> - Shadow hair - </string> - <string name="Shallow"> - ãªã ら㋠- </string> - <string name="Shear Back"> - 後方を刈る - </string> - <string name="Shear Face"> - é¡”ã®ã‚†ãŒã¿ - </string> - <string name="Shear Front"> - 剿–¹ã‚’刈る - </string> - <string name="Shear Left"> - å·¦å´ - </string> - <string name="Shear Left Up"> - å·¦åŠåˆ†ã‚’上㫠- </string> - <string name="Shear Right"> - å³å´ - </string> - <string name="Shear Right Up"> - å³åŠåˆ†ã‚’上㫠- </string> - <string name="Sheared Back"> - 後ã‚を刈られãŸé«ª - </string> - <string name="Sheared Front"> - å‰ã‚’刈られãŸé«ª - </string> - <string name="Shift Left"> - å·¦å‘ã - </string> - <string name="Shift Mouth"> - å£ã®å‘ã - </string> - <string name="Shift Right"> - å³å‘ã - </string> - <string name="Shirt Bottom"> - シャツã®è£¾ - </string> - <string name="Shirt Fit"> - シャツã®ãƒ•ィット感 - </string> - <string name="Shirt Wrinkles"> - シャツã®ã—ã‚ - </string> - <string name="Shoe Height"> - é´ã®é•·ã• - </string> - <string name="Short"> - çŸ - </string> - <string name="Short Arms"> - çŸ - </string> - <string name="Short Legs"> - çŸ - </string> - <string name="Short Neck"> - çŸ - </string> - <string name="Short Pigtails"> - çŸ - </string> - <string name="Short Ponytail"> - çŸ - </string> - <string name="Short Sideburns"> - çŸã‚ - </string> - <string name="Short Torso"> - çŸ - </string> - <string name="Short hips"> - çŸ - </string> - <string name="Shoulders"> - è‚© - </string> - <string name="Side Bangs"> - ã‚µã‚¤ãƒ‰ã«æµã—ãŸå‰é«ª - </string> - <string name="Side Bangs Down"> - ダウン - </string> - <string name="Side Bangs Up"> - アップ - </string> - <string name="Side Fringe"> - ã‚µã‚¤ãƒ‰ã®æ¯›å…ˆ - </string> - <string name="Sideburns"> - ã‚‚ã¿ã‚ã’ - </string> - <string name="Sides Hair"> - サイドã®é«ª - </string> - <string name="Sides Hair Down"> - ダウン - </string> - <string name="Sides Hair Up"> - アップ - </string> - <string name="Skinny"> - 細身 - </string> - <string name="Skinny Neck"> - ç´° - </string> - <string name="Skirt Fit"> - スカートã®ãƒ•ィット感 - </string> - <string name="Skirt Length"> - スカート丈 - </string> - <string name="Slanted Forehead"> - 傾斜ã—ãŸé¡ - </string> - <string name="Sleeve Length"> - 袖丈 - </string> - <string name="Sleeve Looseness"> - 袖ã®ãƒ•ィット感 - </string> - <string name="Slit Back"> - スリット: 後゠- </string> - <string name="Slit Front"> - スリット: å‰ - </string> - <string name="Slit Left"> - スリット: å·¦ - </string> - <string name="Slit Right"> - スリット: å³ - </string> - <string name="Small"> - å° - </string> - <string name="Small Hands"> - å° - </string> - <string name="Small Head"> - å° - </string> - <string name="Smooth"> - 滑ら㋠- </string> - <string name="Smooth Hair"> - スムーズ - </string> - <string name="Socks Length"> - é´ä¸‹ä¸ˆ - </string> - <string name="Some"> - Some - </string> - <string name="Soulpatch"> - ソウルパッム- </string> - <string name="Sparse"> - è–„ - </string> - <string name="Spiked Hair"> - ã¨ã’ã¨ã’ヘア - </string> - <string name="Square"> - è§’å¼µã£ãŸ - </string> - <string name="Square Toe"> - スクエアトゥ - </string> - <string name="Squash Head"> - カボãƒãƒ£åž‹ - </string> - <string name="Squash/Stretch Head"> - カボãƒãƒ£/縦長é - </string> - <string name="Stretch Head"> - 縦長 - </string> - <string name="Sunken"> - ã“ã‘㟠- </string> - <string name="Sunken Chest"> - å° - </string> - <string name="Sunken Eyes"> - ãã¼ã‚“ã ç›® - </string> - <string name="Sweep Back"> - 後ã‚㸠- </string> - <string name="Sweep Forward"> - å‰ã¸ - </string> - <string name="Swept Back"> - オールãƒãƒƒã‚¯ - </string> - <string name="Swept Back Hair"> - オールãƒãƒƒã‚¯ãƒ˜ã‚¢ - </string> - <string name="Swept Forward"> - å‰ã¸ - </string> - <string name="Swept Forward Hair"> - 後ã‚㸠- </string> - <string name="Tall"> - 高 - </string> - <string name="Taper Back"> - 後ã‚ã«å…ˆç´° - </string> - <string name="Taper Front"> - å‰ã«å…ˆç´° - </string> - <string name="Thick Heels"> - 幅広 - </string> - <string name="Thick Neck"> - 太 - </string> - <string name="Thick Toe"> - 厚゠- </string> - <string name="Thickness"> - 厚㿠- </string> - <string name="Thin"> - è–„ã„ - </string> - <string name="Thin Eyebrows"> - ç´° - </string> - <string name="Thin Lips"> - å° - </string> - <string name="Thin Nose"> - ç´°ã„é¼» - </string> - <string name="Tight Chin"> - ã²ãã—ã¾ã£ãŸã‚ã” - </string> - <string name="Tight Cuffs"> - タイト - </string> - <string name="Tight Pants"> - タイト - </string> - <string name="Tight Shirt"> - タイト - </string> - <string name="Tight Skirt"> - タイト - </string> - <string name="Tight Sleeves"> - タイト - </string> - <string name="Tilt Left"> - å·¦ã«å‚¾æ–œ - </string> - <string name="Tilt Right"> - å³ã«å‚¾æ–œ - </string> - <string name="Toe Shape"> - ã¤ã¾å…ˆã®å½¢ - </string> - <string name="Toe Thickness"> - ã¤ã¾å…ˆã®åŽšã¿ - </string> - <string name="Torso Length"> - 上åŠèº«ã®é•·ã• - </string> - <string name="Torso Muscles"> - 上åŠèº«ã®ç‹è‚‰ - </string> - <string name="Torso Scrawny"> - 上åŠèº«ã®éª¨å¼µã‚Š - </string> - <string name="Unattached"> - 大 - </string> - <string name="Uncreased"> - 軽ã„ã¾ã¶ãŸ - </string> - <string name="Underbite"> - å—ã‘å£ - </string> - <string name="Unnatural"> - ユニーク - </string> - <string name="Upper Bridge"> - 両目ã®ã‚ã„ã - </string> - <string name="Upper Cheeks"> - ã»ãŠã®ä¸Šéƒ¨ - </string> - <string name="Upper Chin Cleft"> - ã‚ã”上部ã®å‰²ã‚Œå…·åˆ - </string> - <string name="Upper Eyelid Fold"> - 二é‡ã®å¹… - </string> - <string name="Upturned"> - 上å‘ã - </string> - <string name="Very Red"> - 真ã£èµ¤ - </string> - <string name="Waist Height"> - ウエストã®é«˜ã• - </string> - <string name="Well-Fed"> - ã¤ã¾ã£ãŸ - </string> - <string name="White Hair"> - 白髪 - </string> - <string name="Wide"> - 広 - </string> - <string name="Wide Back"> - 広 - </string> - <string name="Wide Front"> - 広 - </string> - <string name="Wide Lips"> - 大ãã„å£ - </string> - <string name="Wild"> - ワイルド - </string> - <string name="Wrinkles"> - ã—ã‚ã‚り - </string> - <string name="LocationCtrlAddLandmarkTooltip"> - マイ ランドマークã«è¿½åŠ - </string> - <string name="LocationCtrlEditLandmarkTooltip"> - マイ ランドマークを編集 - </string> - <string name="UpdaterWindowTitle"> - [APP_NAME] アップデート - </string> - <string name="UpdaterNowUpdating"> - åªä»Š [APP_NAME] をアップデートä¸ã§ã™... - </string> - <string name="UpdaterNowInstalling"> - [APP_NAME] をインストールä¸ã§ã™... - </string> - <string name="UpdaterUpdatingDescriptive"> - ãŠä½¿ã„ã® [APP_NAME] ãƒ“ãƒ¥ãƒ¼ãƒ¯ãŒæœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—デートã•れã¦ã„ã¾ã™ã€‚ 数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã®ã§ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。 - </string> - <string name="UpdaterProgressBarTextWithEllipses"> - アップデートをダウンãƒãƒ¼ãƒ‰ä¸ã§ã™... - </string> - <string name="UpdaterProgressBarText"> - アップデートをダウンãƒãƒ¼ãƒ‰ä¸ - </string> - <string name="UpdaterFailDownloadTitle"> - アップデートã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—㟠- </string> - <string name="UpdaterFailUpdateDescriptive"> - [APP_NAME] をアップデートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 - </string> - <string name="UpdaterFailInstallTitle"> - アップデートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—㟠- </string> - <string name="UpdaterFailStartTitle"> - ビューワã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—㟠- </string> - <string name="only_user_message"> - ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ - </string> - <string name="offline_message"> - [FIRST] [LAST]ã¯ã‚ªãƒ•ラインã§ã™ã€‚ - </string> - <string name="invite_message"> - ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。 - </string> - <string name="generic_request_error"> - è¦æ±‚ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </string> - <string name="insufficient_perms_error"> - ã‚ãªãŸã«ã¯å……åˆ†ãªæ¨©é™ãŒã‚りã¾ã›ã‚“。 - </string> - <string name="session_does_not_exist_error"> - ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯æ—¢ã«åˆ‡æ–ã•れã¦ã„ã¾ã™ã€‚ - </string> - <string name="no_ability_error"> - ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。 - </string> - <string name="no_ability"> - ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。 - </string> - <string name="not_a_mod_error"> - ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。 - </string> - <string name="muted_error"> - グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚ストãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—㟠- </string> - <string name="add_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <string name="message_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <string name="removed_from_group"> - ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚ - </string> - <string name="close_on_no_ability"> - ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ - </string> -</strings> +<?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 + 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=ja-JP</string> + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Second Life + </string> + <string name="SECOND_LIFE_GRID"> + Second Life Grid + </string> + <string name="SUPPORT_SITE"> + Second Lifeサãƒãƒ¼ãƒˆãƒãƒ¼ã‚¿ãƒ« + </string> + <string name="StartupDetectingHardware"> + ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºä¸ã§ã™... + </string> + <string name="StartupLoading"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚° + </string> + <string name="Fullbright"> + 明るã•全開(レガシー) + </string> + <string name="LoginInProgress"> + ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™ã€‚[APP_NAME]ã®è¡¨ç¤ºãŒãƒ•リーズã™ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。 + </string> + <string name="LoginInProgressNoFrozen"> + ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™... + </string> + <string name="LoginAuthenticating"> + èªè¨¼ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginMaintenance"> + アカウント・メンテナンスを実行ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginAttempt"> + å‰å›žã®ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™([NUMBER]回目) + </string> + <string name="LoginPrecaching"> + ワールドをãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingBrowser"> + 埋ã‚è¾¼ã¿Webãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingMultimedia"> + マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginVerifyingCache"> + ã‚ャッシュ・ファイルを検証ã—ã¦ã„ã¾ã™(æ‰€è¦æ™‚é–“ã¯60~90ç§’)... + </string> + <string name="LoginProcessingResponse"> + 応ç”を処ç†ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingWorld"> + ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginDecodingImages"> + ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingQuicktime"> + QuickTimeã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginQuicktimeNotFound"> + QuickTimeãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </string> + <string name="LoginQuicktimeOK"> + QuickTimeãŒæ£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚ + </string> + <string name="LoginWaitingForRegionHandshake"> + 地域ã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™... + </string> + <string name="LoginConnectingToRegion"> + åœ°åŸŸã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... + </string> + <string name="LoginDownloadingClothing"> + æœã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... + </string> + <string name="AgentLostConnection"> + ã“ã®åœ°åŸŸã«ã¯ã€å•題ãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。 + </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] + </string> + <string name="TooltipFlagGroupBuild"> + ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ + </string> + <string name="TooltipFlagNoBuild"> + 作æˆç¦æ¢ + </string> + <string name="TooltipFlagNoEdit"> + ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ + </string> + <string name="TooltipFlagNotSafe"> + å±é™º + </string> + <string name="TooltipFlagNoFly"> + é£›è¡Œç¦æ¢ + </string> + <string name="TooltipFlagGroupScripts"> + グループ・スクリプト + </string> + <string name="TooltipFlagNoScripts"> + スクリプトãªã— + </string> + <string name="TooltipLand"> + 土地: + </string> + <string name="TooltipMustSingleDrop"> + 1ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã‚’ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™ + </string> + <string name="TooltipHttpUrl"> + クリックã—ã¦ã“ã®Webページを見る + </string> + <string name="TooltipSLURL"> + クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…å ±ã‚’è¦‹ã‚‹ + </string> + <string name="TooltipAgentUrl"> + クリックã—ã¦ã“ã®ä½äººã®ãƒ—ãƒãƒ•ィールを見る + </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="TooltipSLAPP"> + クリックã—㦠secondlife:// コマンドを出㙠+ </string> + <string name="BUTTON_CLOSE_DARWIN"> + é–‰ã˜ã‚‹ (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + é–‰ã˜ã‚‹ (Ctrl+W) + </string> + <string name="BUTTON_RESTORE"> + 復元 + </string> + <string name="BUTTON_MINIMIZE"> + å…ƒã«æˆ»ã™ï¼ˆç¸®å°ï¼‰ + </string> + <string name="BUTTON_TEAR_OFF"> + 別ウィンドウã§é–‹ã + </string> + <string name="BUTTON_DOCK"> + ドッã‚ング + </string> + <string name="BUTTON_UNDOCK"> + 切り離㙠+ </string> + <string name="BUTTON_HELP"> + ヘルプを表示 + </string> + <string name="RetrievingData"> + 検索ä¸... + </string> + <string name="ReleaseNotes"> + リリースノート + </string> + <string name="LoadingData"> + ãƒãƒ¼ãƒ‰ä¸... + </string> + <string name="AvatarNameNobody"> + (無人) + </string> + <string name="AvatarNameWaiting"> + (待機ä¸) + </string> + <string name="AvatarNameHippos"> + (ã‚«ãƒ) + </string> + <string name="GroupNameNone"> + (ãªã—) + </string> + <string name="AssetErrorNone"> + エラーãªã— + </string> + <string name="AssetErrorRequestFailed"> + 資産ã®è¦æ±‚: 失敗 + </string> + <string name="AssetErrorNonexistentFile"> + 資産ã®è¦æ±‚: å˜åœ¨ã—ãªã„ファイル + </string> + <string name="AssetErrorNotInDatabase"> + 資産ã®è¦æ±‚: データベースã§ã¯è¦‹ã¤ã‹ã‚‰ãªã„資産 + </string> + <string name="AssetErrorEOF"> + ファイルã®çµ‚ã‚り + </string> + <string name="AssetErrorCannotOpenFile"> + ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ + </string> + <string name="AssetErrorFileNotFound"> + ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="AssetErrorTCPTimeout"> + ファイル転é€ã‚¿ã‚¤ãƒ アウトã§ã™ + </string> + <string name="AssetErrorCircuitGone"> + 接続ãŒè§£é™¤ã•れã¾ã—㟠+ </string> + <string name="AssetErrorPriceMismatch"> + ビューワã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¾¡æ ¼ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“ + </string> + <string name="AssetErrorUnknownStatus"> + ステータスãŒä¸æ˜Žã§ã™ + </string> + <string name="texture"> + テクスãƒãƒ£ + </string> + <string name="sound"> + サウンド + </string> + <string name="calling card"> + コーリングカード + </string> + <string name="landmark"> + ランドマーク + </string> + <string name="legacy script"> + レガシースクリプト + </string> + <string name="clothing"> + 衣類 + </string> + <string name="object"> + オブジェクト + </string> + <string name="note card"> + ノートカード + </string> + <string name="folder"> + フォルダ + </string> + <string name="root"> + ルート + </string> + <string name="lsl2 script"> + lsl2 スクリプト + </string> + <string name="lsl bytecode"> + LSL ãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰ + </string> + <string name="tga texture"> + tga テクスãƒãƒ£ + </string> + <string name="body part"> + èº«ä½“éƒ¨ä½ + </string> + <string name="snapshot"> + スナップショット + </string> + <string name="lost and found"> + 紛失物 + </string> + <string name="targa image"> + targa ç”»åƒ + </string> + <string name="trash"> + ゴミ箱 + </string> + <string name="jpeg image"> + jpeg ç”»åƒ + </string> + <string name="animation"> + アニメーション + </string> + <string name="gesture"> + ジェスãƒãƒ£ãƒ¼ + </string> + <string name="simstate"> + 統計 + </string> + <string name="favorite"> + ãŠæ°—ã«å…¥ã‚Š + </string> + <string name="symbolic link"> + リンク + </string> + <string name="AvatarAway"> + 退å¸ä¸ + </string> + <string name="AvatarBusy"> + å–り込ã¿ä¸ + </string> + <string name="AvatarMuted"> + ミュート + </string> + <string name="anim_express_afraid"> + 怖れ + </string> + <string name="anim_express_anger"> + 怒り + </string> + <string name="anim_away"> + 退å¸ä¸ + </string> + <string name="anim_backflip"> + 後ã‚宙返り + </string> + <string name="anim_express_laugh"> + 大笑ㄠ+ </string> + <string name="anim_express_toothsmile"> + 満é¢ã®ç¬‘é¡” + </string> + <string name="anim_blowkiss"> + 投ã’ã‚ッス + </string> + <string name="anim_express_bored"> + 退屈 + </string> + <string name="anim_bow"> + ãŠã˜ãŽ + </string> + <string name="anim_clap"> + æ‹æ‰‹ + </string> + <string name="anim_courtbow"> + æ·±ã„ãŠã˜ãŽ + </string> + <string name="anim_express_cry"> + æ³£ã + </string> + <string name="anim_dance1"> + ダンス1 + </string> + <string name="anim_dance2"> + ダンス2 + </string> + <string name="anim_dance3"> + ダンス3 + </string> + <string name="anim_dance4"> + ダンス4 + </string> + <string name="anim_dance5"> + ダンス5 + </string> + <string name="anim_dance6"> + ダンス6 + </string> + <string name="anim_dance7"> + ダンス7 + </string> + <string name="anim_dance8"> + ダンス8 + </string> + <string name="anim_express_disdain"> + 侮蔑 + </string> + <string name="anim_drink"> + é…”ã£ã±ã‚‰ã† + </string> + <string name="anim_express_embarrased"> + 困惑 + </string> + <string name="anim_angry_fingerwag"> + 指を振る + </string> + <string name="anim_fist_pump"> + ガッツãƒãƒ¼ã‚º + </string> + <string name="anim_yoga_float"> + ãƒ¨ã‚¬æµ®éŠ + </string> + <string name="anim_express_frown"> + ã—ã‹ã‚ã£é¢ + </string> + <string name="anim_impatient"> + ã„らã„らã™ã‚‹ + </string> + <string name="anim_jumpforjoy"> + 飛ã³ä¸ŠãŒã£ã¦å–œã¶ + </string> + <string name="anim_kissmybutt"> + 挑発ãƒãƒ¼ã‚º + </string> + <string name="anim_express_kiss"> + ã‚ス + </string> + <string name="anim_laugh_short"> + 笑ㆠ+ </string> + <string name="anim_musclebeach"> + 力ã“ã¶ã‚’見ã›ã‚‹ + </string> + <string name="anim_no_unhappy"> + 䏿º€ã’ã«å¦å®šã™ã‚‹ + </string> + <string name="anim_no_head"> + å¦å®šã™ã‚‹ + </string> + <string name="anim_nyanya"> + 冷やã‹ã™ + </string> + <string name="anim_punch_onetwo"> + ワンツー・パンム+ </string> + <string name="anim_express_open_mouth"> + å£ã‚’é–‹ã‘ã¦é©šã + </string> + <string name="anim_peace"> + ピース・サイン + </string> + <string name="anim_point_you"> + 他人を指差㙠+ </string> + <string name="anim_point_me"> + 自分を指差㙠+ </string> + <string name="anim_punch_l"> + 左パンム+ </string> + <string name="anim_punch_r"> + å³ãƒ‘ンム+ </string> + <string name="anim_rps_countdown"> + ã˜ã‚ƒã‚“ã‘ã‚“ãƒãƒ¼ã‚º + </string> + <string name="anim_rps_paper"> + パー + </string> + <string name="anim_rps_rock"> + グー + </string> + <string name="anim_rps_scissors"> + ãƒãƒ§ã‚ + </string> + <string name="anim_express_repulsed"> + 嫌悪感 + </string> + <string name="anim_kick_roundhouse_r"> + ã¾ã‚ã—蹴り + </string> + <string name="anim_express_sad"> + 悲ã—ã‚€ + </string> + <string name="anim_salute"> + 敬礼ã™ã‚‹ + </string> + <string name="anim_shout"> + å«ã¶ + </string> + <string name="anim_express_shrug"> + è‚©ã‚’ã™ãã‚ã‚‹ + </string> + <string name="anim_express_smile"> + 微笑む + </string> + <string name="anim_smoke_idle"> + ãŸã°ã“ã‚’ãゆら㙠+ </string> + <string name="anim_smoke_inhale"> + ãŸã°ã“ã‚’å¸ã† + </string> + <string name="anim_smoke_throw_down"> + ãŸã°ã“ã‚’æ¨ã¦ã‚‹ + </string> + <string name="anim_express_surprise"> + 驚ã + </string> + <string name="anim_sword_strike_r"> + å‰£ã§æ–¬ã‚Šã¤ã‘ã‚‹ + </string> + <string name="anim_angry_tantrum"> + ã˜ã ã‚“ã ã‚’è¸ã‚€ + </string> + <string name="anim_express_tongue_out"> + 舌を出㙠+ </string> + <string name="anim_hello"> + 手を振る + </string> + <string name="anim_whisper"> + å°å£°ã§è©±ã™ + </string> + <string name="anim_whistle"> + å£ç¬›ã‚’å¹ã + </string> + <string name="anim_express_wink"> + ウィンク + </string> + <string name="anim_wink_hollywood"> + ウィンク(ãƒãƒªã‚¦ãƒƒãƒ‰) + </string> + <string name="anim_express_worry"> + 心é…ã™ã‚‹ + </string> + <string name="anim_yes_happy"> + 笑顔ã§é ·ã + </string> + <string name="anim_yes_head"> + é ·ã + </string> + <string name="texture_loading"> + ãƒãƒ¼ãƒ‰ä¸... + </string> + <string name="worldmap_offline"> + オフライン + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + ä¸å®Œå…¨ãªãƒ•ァイル + </string> + <string name="ST_NO_JOINT"> + ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="whisper"> + ã®ã•ã•ã‚„ã: + </string> + <string name="shout"> + ã®å«ã³: + </string> + <string name="ringing"> + インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸... + </string> + <string name="connected"> + 接続ã—ã¾ã—㟠+ </string> + <string name="unavailable"> + ã‚ãªãŸã®ç¾åœ¨ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。 + </string> + <string name="hang_up"> + インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–ã•れã¾ã—㟠+ </string> + <string name="ScriptQuestionCautionChatGranted"> + [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS] + </string> + <string name="ScriptQuestionCautionChatDenied"> + [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS] + </string> + <string name="ScriptTakeMoney"> + リンデンドル(L$)を支払ㆠ+ </string> + <string name="ActOnControlInputs"> + 制御入力ã«åŸºã¥ã„ã¦è¡Œå‹• + </string> + <string name="RemapControlInputs"> + 制御入力ã®ãƒªãƒžãƒƒãƒ— + </string> + <string name="AnimateYourAvatar"> + ã‚¢ãƒã‚¿ãƒ¼ã¸ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å‹•作 + </string> + <string name="AttachToYourAvatar"> + ã‚¢ãƒã‚¿ãƒ¼ã«è£…ç€ + </string> + <string name="ReleaseOwnership"> + 所有権を解放ã—å…¬ã®ã‚‚ã®ã¨ã™ã‚‹ + </string> + <string name="LinkAndDelink"> + ä»–ã®ã‚ªãƒ–ジェクトã®ãƒªãƒ³ã‚¯ã¨ãƒªãƒ³ã‚¯è§£é™¤ + </string> + <string name="AddAndRemoveJoints"> + ä»–ã®ã‚ªãƒ–ジェクトã¨ã®ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è¿½åŠ ã¨å‰Šé™¤ + </string> + <string name="ChangePermissions"> + 権é™ã®å¤‰æ›´ + </string> + <string name="TrackYourCamera"> + カメラ追従 + </string> + <string name="ControlYourCamera"> + カメラã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« + </string> + <string name="SIM_ACCESS_PG"> + PG + </string> + <string name="SIM_ACCESS_MATURE"> + Mature + </string> + <string name="SIM_ACCESS_ADULT"> + Adult + </string> + <string name="SIM_ACCESS_DOWN"> + オフライン + </string> + <string name="SIM_ACCESS_MIN"> + 䏿˜Ž + </string> + <string name="land_type_unknown"> + ï¼ˆä¸æ˜Žï¼‰ + </string> + <string name="all_files"> + å…¨ã¦ã®ãƒ•ァイル + </string> + <string name="sound_files"> + サウンド + </string> + <string name="animation_files"> + アニメーション + </string> + <string name="image_files"> + ç”»åƒ + </string> + <string name="save_file_verb"> + ä¿å˜ + </string> + <string name="load_file_verb"> + ãƒãƒ¼ãƒ‰ + </string> + <string name="targa_image_files"> + Targaç”»åƒ + </string> + <string name="bitmap_image_files"> + ãƒ“ãƒƒãƒˆãƒžãƒƒãƒ—ç”»åƒ + </string> + <string name="avi_movie_file"> + AVIムービーファイル + </string> + <string name="xaf_animation_file"> + XAFアニメーションファイル + </string> + <string name="xml_file"> + XMLファイル + </string> + <string name="dot_raw_file"> + RAWファイル + </string> + <string name="compressed_image_files"> + åœ§ç¸®ç”»åƒ + </string> + <string name="load_files"> + ファイルã®ãƒãƒ¼ãƒ‰ + </string> + <string name="choose_the_directory"> + å‚ç…§ + </string> + <string name="AvatarSetNotAway"> + 一時退å¸ä¸ã‚’解除 + </string> + <string name="AvatarSetAway"> + 一時退å¸ä¸ + </string> + <string name="AvatarSetNotBusy"> + å–り込ã¿ä¸ã‚’解除 + </string> + <string name="AvatarSetBusy"> + å–り込ã¿ä¸ + </string> + <string name="shape"> + シェイプ + </string> + <string name="skin"> + スã‚ン + </string> + <string name="hair"> + 髪型 + </string> + <string name="eyes"> + ç›® + </string> + <string name="shirt"> + シャツ + </string> + <string name="pants"> + ズボン + </string> + <string name="shoes"> + é´ + </string> + <string name="socks"> + é´ä¸‹ + </string> + <string name="jacket"> + ä¸Šç€ + </string> + <string name="gloves"> + 手袋 + </string> + <string name="undershirt"> + 下ç€ã‚·ãƒ£ãƒ„ + </string> + <string name="underpants"> + 下ç€ãƒ‘ンツ + </string> + <string name="skirt"> + スカート + </string> + <string name="invalid"> + 無効 + </string> + <string name="BodyPartsRightArm"> + å³è…• + </string> + <string name="BodyPartsHead"> + é + </string> + <string name="BodyPartsLeftArm"> + 左腕 + </string> + <string name="BodyPartsLeftLeg"> + 左脚 + </string> + <string name="BodyPartsTorso"> + é + </string> + <string name="BodyPartsRightLeg"> + å³è„š + </string> + <string name="GraphicsQualityLow"> + 低 + </string> + <string name="GraphicsQualityMid"> + ä¸ + </string> + <string name="GraphicsQualityHigh"> + 高 + </string> + <string name="LeaveMouselook"> + ESC ã‚ーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚‹ + </string> + <string name="InventoryNoMatchingItems"> + 一致ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒæŒã¡ç‰©ã«ã‚りã¾ã›ã‚“ã§ã—㟠+ </string> + <string name="InventoryNoTexture"> + æŒã¡ç‰©å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“ + </string> + <string name="LoadingContents"> + コンテンツをãƒãƒ¼ãƒ‰ä¸ã§ã™... + </string> + <string name="NoContents"> + コンテンツãªã— + </string> + <string name="InvFolder My Inventory"> + ç§ã®æŒã¡ç‰© + </string> + <string name="InvFolder My Favorites"> + ãŠæ°—ã«å…¥ã‚Š + </string> + <string name="InvFolder Library"> + ライブラリ + </string> + <string name="InvFolder Textures"> + テクスãƒãƒ£ + </string> + <string name="InvFolder Sounds"> + サウンド + </string> + <string name="InvFolder Calling Cards"> + コーリングカード + </string> + <string name="InvFolder Landmarks"> + ランドマーク + </string> + <string name="InvFolder Scripts"> + スクリプト + </string> + <string name="InvFolder Clothing"> + 衣類 + </string> + <string name="InvFolder Objects"> + オブジェクト + </string> + <string name="InvFolder Notecards"> + ノートカード + </string> + <string name="InvFolder New Folder"> + æ–°è¦ãƒ•ォルダ + </string> + <string name="InvFolder Inventory"> + æŒã¡ç‰© + </string> + <string name="InvFolder Uncompressed Images"> + 圧縮ã•れã¦ã„ãªã„ç”»åƒ + </string> + <string name="InvFolder Body Parts"> + èº«ä½“éƒ¨ä½ + </string> + <string name="InvFolder Trash"> + ゴミ箱 + </string> + <string name="InvFolder Photo Album"> + フォトアルãƒãƒ + </string> + <string name="InvFolder Lost And Found"> + 紛失物 + </string> + <string name="InvFolder Uncompressed Sounds"> + 圧縮ã•れã¦ã„ãªã„サウンド + </string> + <string name="InvFolder Animations"> + アニメーション + </string> + <string name="InvFolder Gestures"> + ジェスãƒãƒ£ãƒ¼ + </string> + <string name="InvFolder favorite"> + ãŠæ°—ã«å…¥ã‚Š + </string> + <string name="InvFolder Current Outfit"> + ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ィット + </string> + <string name="InvFolder My Outfits"> + ç§ã®ã‚¢ã‚¦ãƒˆãƒ•ィット + </string> + <string name="InvFolder Friends"> + フレンド + </string> + <string name="InvFolder All"> + 全員 + </string> + <string name="Buy"> + 買ㆠ+ </string> + <string name="BuyforL$"> + Buy for L$ + </string> + <string name="Stone"> + 石 + </string> + <string name="Metal"> + 金属 + </string> + <string name="Glass"> + ガラス + </string> + <string name="Wood"> + 木 + </string> + <string name="Flesh"> + 肌 + </string> + <string name="Plastic"> + プラスãƒãƒƒã‚¯ + </string> + <string name="Rubber"> + ゴム+ </string> + <string name="Light"> + ライト + </string> + <string name="KBShift"> + Shift + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + 胸部 + </string> + <string name="Skull"> + é è“‹ + </string> + <string name="Left Shoulder"> + 左肩 + </string> + <string name="Right Shoulder"> + å³è‚© + </string> + <string name="Left Hand"> + 左手 + </string> + <string name="Right Hand"> + 峿‰‹ + </string> + <string name="Left Foot"> + 左足 + </string> + <string name="Right Foot"> + å³è¶³ + </string> + <string name="Spine"> + 背骨 + </string> + <string name="Pelvis"> + 骨盤 + </string> + <string name="Mouth"> + å£ + </string> + <string name="Chin"> + ã‚ã” + </string> + <string name="Left Ear"> + 左耳 + </string> + <string name="Right Ear"> + å³è€³ + </string> + <string name="Left Eyeball"> + å·¦ç›®çœ¼çƒ + </string> + <string name="Right Eyeball"> + å³ç›®çœ¼çƒ + </string> + <string name="Nose"> + é¼» + </string> + <string name="R Upper Arm"> + å³ä¸Šè…• + </string> + <string name="R Forearm"> + å³å‰è…• + </string> + <string name="L Upper Arm"> + 左上腕 + </string> + <string name="L Forearm"> + å·¦å‰è…• + </string> + <string name="Right Hip"> + å³è…° + </string> + <string name="R Upper Leg"> + å³ä¸Šè„š + </string> + <string name="R Lower Leg"> + å³ä¸‹è„š + </string> + <string name="Left Hip"> + 左腰 + </string> + <string name="L Upper Leg"> + 左上脚 + </string> + <string name="L Lower Leg"> + 左下脚 + </string> + <string name="Stomach"> + è…¹ + </string> + <string name="Left Pec"> + å·¦èƒ¸ç‹ + </string> + <string name="Right Pec"> + å³èƒ¸ç‹ + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] + </string> + <string name="YearsOld"> + [AGEYEARS] + </string> + <string name="MonthsOld"> + [AGEMONTHS] + </string> + <string name="WeeksOld"> + [AGEWEEKS] + </string> + <string name="DaysOld"> + [AGEDAYS] + </string> + <string name="TodayOld"> + 今日å‚åŠ + </string> + <string name="AgeYearsA"> + [COUNT] å¹´ + </string> + <string name="AgeYearsB"> + [COUNT] å¹´ + </string> + <string name="AgeYearsC"> + [COUNT] å¹´ + </string> + <string name="AgeMonthsA"> + [COUNT] ヶ月 + </string> + <string name="AgeMonthsB"> + [COUNT] ヶ月 + </string> + <string name="AgeMonthsC"> + [COUNT] ヶ月 + </string> + <string name="AgeWeeksA"> + [COUNT] 週間 + </string> + <string name="AgeWeeksB"> + [COUNT] 週間 + </string> + <string name="AgeWeeksC"> + [COUNT] 週間 + </string> + <string name="AgeDaysA"> + [COUNT] 日間 + </string> + <string name="AgeDaysB"> + [COUNT] 日間 + </string> + <string name="AgeDaysC"> + [COUNT] 日間 + </string> + <string name="AcctTypeResident"> + ä½äºº + </string> + <string name="AcctTypeTrial"> + トライアル + </string> + <string name="AcctTypeCharterMember"> + 特権メンãƒãƒ¼ + </string> + <string name="AcctTypeEmployee"> + Linden Lab従æ¥å“¡ + </string> + <string name="PaymentInfoUsed"> + æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆ + </string> + <string name="PaymentInfoOnFile"> + æ”¯æ‰•ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿ + </string> + <string name="NoPaymentInfoOnFile"> + æ”¯æ‰•ã„æƒ…å ±æœªç™»éŒ² + </string> + <string name="AgeVerified"> + å¹´é½¢ç¢ºèªæ¸ˆã¿ + </string> + <string name="NotAgeVerified"> + å¹´é½¢æœªç¢ºèª + </string> + <string name="Center 2"> + ä¸å¿ƒ 2 + </string> + <string name="Top Right"> + å³ä¸Š + </string> + <string name="Top"> + 上部 + </string> + <string name="Top Left"> + 左上 + </string> + <string name="Center"> + ä¸å¿ƒ + </string> + <string name="Bottom Left"> + Bottom Left + </string> + <string name="Bottom"> + Bottom + </string> + <string name="Bottom Right"> + Bottom Right + </string> + <string name="CompileQueueDownloadedCompiling"> + ダウンãƒãƒ¼ãƒ‰å®Œäº†ã€ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«ä¸ + </string> + <string name="CompileQueueScriptNotFound"> + サーãƒãƒ¼ä¸Šã«ã‚¹ã‚¯ãƒªãƒ—トãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </string> + <string name="CompileQueueProblemDownloading"> + ダウンãƒãƒ¼ãƒ‰ã«å•題ãŒã‚りã¾ã™ + </string> + <string name="CompileQueueInsufficientPermDownload"> + 権é™ä¸è¶³ã®ãŸã‚スクリプトをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </string> + <string name="CompileQueueInsufficientPermFor"> + 権é™ä¸è¶³ï¼š + </string> + <string name="CompileQueueUnknownFailure"> + åŽŸå› ä¸æ˜Žã®å¤±æ•—ã«ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“ + </string> + <string name="CompileQueueTitle"> + リコンパイル進行 + </string> + <string name="CompileQueueStart"> + リコンパイル + </string> + <string name="ResetQueueTitle"> + 進行をリセット + </string> + <string name="ResetQueueStart"> + リセット + </string> + <string name="RunQueueTitle"> + 実行を続ã‘るよã†è¨å®š + </string> + <string name="RunQueueStart"> + 実行ä¸ã«è¨å®š + </string> + <string name="NotRunQueueTitle"> + å®Ÿè¡Œã‚’åœæ¢ã™ã‚‹ã‚ˆã†è¨å®š + </string> + <string name="NotRunQueueStart"> + å®Ÿè¡Œåœæ¢ã«è¨å®š + </string> + <string name="CompileSuccessful"> + コンパイルãŒå®Œäº†ã—ã¾ã—ãŸï¼ + </string> + <string name="CompileSuccessfulSaving"> + コンパイル完了ã€ä¿å˜ä¸ã§ã™... + </string> + <string name="SaveComplete"> + ä¿å˜å®Œäº†ã€‚ + </string> + <string name="ObjectOutOfRange"> + スクリプト(オブジェクトãŒç¯„囲外ã«ã‚りã¾ã™ï¼‰ + </string> + <string name="GodToolsObjectOwnedBy"> + [OWNER] 所有ã®ã‚ªãƒ–ジェクト「[OBJECT]〠+ </string> + <string name="GroupsNone"> + ãªã— + </string> + <string name="Unknown"> + ï¼ˆä¸æ˜Žï¼‰ + </string> + <string name="Balance"> + 残高 + </string> + <string name="Credits"> + åŽå…¥ + </string> + <string name="Debits"> + 支出 + </string> + <string name="Total"> + åˆè¨ˆ + </string> + <string name="NoGroupDataFound"> + グループã®ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+ </string> + <string name="IMParentEstate"> + parent estate + </string> + <string name="IMMainland"> + メインランド + </string> + <string name="IMTeen"> + ティーン + </string> + <string name="RegionInfoError"> + エラー + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + [OWNER] ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産 + </string> + <string name="RegionInfoAllEstatesYouOwn"> + ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産 + </string> + <string name="RegionInfoAllEstatesYouManage"> + ã‚ãªãŸãŒ [OWNER] ã®ãŸã‚ã«ç®¡ç†ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•産 + </string> + <string name="RegionInfoAllowedResidents"> + 許å¯ã•れãŸä½äººï¼š ([ALLOWEDAGENTS] äººã€æœ€å¤§ [MAXACCESS] 人) + </string> + <string name="RegionInfoAllowedGroups"> + 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] グループ) + </string> + <string name="CursorPos"> + [LINE] 行目ã€[COLUMN] 列目 + </string> + <string name="PanelDirCountFound"> + [COUNT] 件見ã¤ã‹ã‚Šã¾ã—㟠+ </string> + <string name="PanelContentsNewScript"> + æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト + </string> + <string name="MuteByName"> + (å称別) + </string> + <string name="MuteAgent"> + (ä½äººï¼‰ + </string> + <string name="MuteObject"> + (オブジェクト) + </string> + <string name="MuteGroup"> + (グループ) + </string> + <string name="RegionNoCovenant"> + ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 + </string> + <string name="RegionNoCovenantOtherOwner"> + ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 ã“ã®ä¸å‹•産上ã®åœŸåœ°ã¯ä¸å‹•産所有者ã«ã‚ˆã‚Šè²©å£²ã•れã€Linden Lab ã§ã¯è²©å£²ã—ã¦ã„ã¾ã›ã‚“。 販売ã«é–¢ã™ã‚‹ãŠå•ã„åˆã‚ã›ã¯ã€ä¸å‹•産所有者ã¾ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚ + </string> + <string name="covenant_last_modified"> + æœ€çµ‚ä¿®æ£æ—¥ï¼š + </string> + <string name="GroupOwned"> + グループ所有 + </string> + <string name="Public"> + パブリック + </string> + <string name="ClassifiedClicksTxt"> + クリック数: [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プãƒãƒ•ィール + </string> + <string name="ClassifiedUpdateAfterPublish"> + (掲載後更新) + </string> + <string name="GroupVoteYes"> + ã¯ã„ + </string> + <string name="GroupVoteNo"> + ã„ã„㈠+ </string> + <string name="GroupVoteNoActiveProposals"> + 継続ä¸ã®ææ¡ˆã¯ç¾åœ¨ã‚りã¾ã›ã‚“ + </string> + <string name="GroupVoteNoArchivedProposals"> + ææ¡ˆã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã¯ç¾åœ¨ã‚りã¾ã›ã‚“ + </string> + <string name="GroupVoteRetrievingArchivedProposals"> + ææ¡ˆã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‚’å–å¾—ä¸ã§ã™ + </string> + <string name="GroupVoteRetrievingActiveProposals"> + 継続ä¸ã®ææ¡ˆã‚’å–å¾—ä¸ã§ã™ + </string> + <string name="MultiPreviewTitle"> + プレビュー + </string> + <string name="MultiPropertiesTitle"> + Properties + </string> + <string name="InvOfferAnObjectNamed"> + オブジェクトå + </string> + <string name="InvOfferOwnedByGroup"> + 所有グループ + </string> + <string name="InvOfferOwnedByUnknownGroup"> + 䏿˜Žãªã‚°ãƒ«ãƒ¼ãƒ—所有 + </string> + <string name="InvOfferOwnedBy"> + 所有者 + </string> + <string name="InvOfferOwnedByUnknownUser"> + 䏿˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼æ‰€æœ‰ + </string> + <string name="InvOfferGaveYou"> + gave you + </string> + <string name="InvOfferYouDecline"> + You decline + </string> + <string name="InvOfferFrom"> + from + </string> + <string name="GroupMoneyTotal"> + åˆè¨ˆ + </string> + <string name="GroupMoneyBought"> + bought + </string> + <string name="GroupMoneyPaidYou"> + paid you + </string> + <string name="GroupMoneyPaidInto"> + paid into + </string> + <string name="GroupMoneyBoughtPassTo"> + bought pass to + </string> + <string name="GroupMoneyPaidFeeForEvent"> + paid fee for event + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + paid prize for event + </string> + <string name="GroupMoneyBalance"> + 残高 + </string> + <string name="GroupMoneyCredits"> + åŽå…¥ + </string> + <string name="GroupMoneyDebits"> + 支出 + </string> + <string name="ViewerObjectContents"> + ä¸èº« + </string> + <string name="AcquiredItems"> + å–得アイテム+ </string> + <string name="Cancel"> + ã‚ャンセル + </string> + <string name="UploadingCosts"> + %s ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ä»£é‡‘: + </string> + <string name="UnknownFileExtension"> + 䏿˜Žã®æ‹¡å¼µå: %s +使用å¯èƒ½ãªæ‹¡å¼µå: .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + </string> + <string name="AddLandmarkNavBarMenu"> + ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’è¿½åŠ ... + </string> + <string name="EditLandmarkNavBarMenu"> + ランドマークを編集... + </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> + <string name="accel-win-alt"> + Alt+ + </string> + <string name="accel-win-shift"> + Shift+ + </string> + <string name="FileSaved"> + ファイルãŒä¿å˜ã•れã¾ã—㟠+ </string> + <string name="Receiving"> + å–å¾—ä¸ + </string> + <string name="AM"> + AM + </string> + <string name="PM"> + PM + </string> + <string name="PST"> + 米国西部標準時 + </string> + <string name="PDT"> + ç±³å›½è¥¿éƒ¨å¤æ™‚é–“ + </string> + <string name="Forward"> + å‰ + </string> + <string name="Left"> + å·¦ + </string> + <string name="Right"> + å³ + </string> + <string name="Back"> + 後゠+ </string> + <string name="North"> + 北 + </string> + <string name="South"> + å— + </string> + <string name="West"> + 西 + </string> + <string name="East"> + æ± + </string> + <string name="Up"> + 上 + </string> + <string name="Down"> + 下 + </string> + <string name="Any Category"> + 全カテゴリ + </string> + <string name="Shopping"> + ショッピング + </string> + <string name="Land Rental"> + 土地ã®ãƒ¬ãƒ³ã‚¿ãƒ« + </string> + <string name="Property Rental"> + 建物ã®ãƒ¬ãƒ³ã‚¿ãƒ« + </string> + <string name="Special Attraction"> + 特別アトラクション + </string> + <string name="New Products"> + æ–°è£½å“ + </string> + <string name="Employment"> + 雇用 + </string> + <string name="Wanted"> + 求む + </string> + <string name="Service"> + サービス + </string> + <string name="Personal"> + パーソナル + </string> + <string name="None"> + ãªã— + </string> + <string name="Linden Location"> + Linden所在地 + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼ + </string> + <string name="Business"> + ビジãƒã‚¹ + </string> + <string name="Educational"> + 教育的 + </string> + <string name="Gaming"> + ゲーム+ </string> + <string name="Hangout"> + ãŸã¾ã‚Šå ´ + </string> + <string name="Newcomer Friendly"> + æ–°ä½äººã«å¥½æ„çš„ + </string> + <string name="Parks&Nature"> + 公園ã¨è‡ªç„¶ + </string> + <string name="Residential"> + ä½å®…用 + </string> + <string name="Stage"> + ステージ + </string> + <string name="Other"> + ãã®ä»– + </string> + <string name="Any"> + 全員 + </string> + <string name="You"> + ã‚ãªãŸ + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="MBCmdLineError"> + コマンドラインã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ +リンク先をå‚ç…§ã—ã¦ãã ã•ã„: http://wiki.secondlife.com/wiki/Client_parameters +エラー: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] コマンドライン使用: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] ã¯å¿…è¦ãªãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。 + +複数ã®ã‚³ãƒ”ーを実行ä¸ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«é–‹ã„ã¦ã„ã‚‹ã¨ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãŒèª¤èªè˜ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 +ãれã§ã‚‚å•題ãŒç¶šãå ´åˆã€[APP_NAME] を完全ã«ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã€å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã—ã¦ãã ã•ã„。 + </string> + <string name="MBFatalError"> + 致命的ãªã‚¨ãƒ©ãƒ¼ + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] ã¯ã€AltiVecæè¼‰ã®ãƒ—ãƒã‚»ãƒƒã‚µãŒå¿…è¦ã§ã™ã€‚(G4 以é™ï¼‰ + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] ã¯ã™ã§ã«å®Ÿè¡Œä¸ã§ã™ã€‚ +最å°åŒ–ã•れãŸãƒ—ãƒã‚°ãƒ©ãƒ ã®ã‚³ãƒ”ーをタスクãƒãƒ¼ã§ç¢ºèªã—ã¦ãã ã•ã„。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ãã ã•ã„。 + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] ã¯å‰å›žã®å®Ÿè¡Œæ™‚ã«ãƒ•リーズã—ã¦ã„ã¾ã™ã€‚ +ã‚¯ãƒ©ãƒƒã‚·ãƒ¥å ±å‘Šã‚’é€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ + </string> + <string name="MBAlert"> + è¦å‘Š + </string> + <string name="MBNoDirectX"> + [APP_NAME] 㯠DirectX 9.0b åŠã³ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’検出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +[APP_NAME] 㯠DirectX を使用ã—ã¦å®‰å®šæ€§ã®å•題ã€ä½Žãƒ‘フォーマンスã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ç‰æ‚ªå½±éŸ¿ã‚’与ãˆã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚„å¤ã„ドライãƒã‚’検出ã—ã¾ã™ã€‚ DirectX 9.0b ãŒãªãã¦ã‚‚ [APP_NAME] を実行ã§ãã¾ã™ãŒã€DirectX 9.0bã¨ã®ã”ä½¿ç”¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ã€‚ + +ç¶šã‘ã¾ã™ã‹ï¼Ÿ + </string> + <string name="MBWarning"> + è¦å‘Š + </string> + <string name="MBNoAutoUpdate"> + 自動更新ã¯ç¾åœ¨ Linux ã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。 +www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 + </string> + <string name="MBRegClassFailed"> + RegisterClass 失敗 + </string> + <string name="MBError"> + エラー + </string> + <string name="MBFullScreenErr"> + [WIDTH] x [HEIGHT] ã§ã¯å…¨ç”»é¢ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 +ウィンドウモードã§å®Ÿè¡Œä¸ã§ã™ã€‚ + </string> + <string name="MBDestroyWinFailed"> + シャットダウンエラー(DestroyWindow() 失敗) + </string> + <string name="MBShutdownErr"> + シャットダウンエラー + </string> + <string name="MBDevContextErr"> + GL ディãƒã‚¤ã‚¹ã‚³ãƒ³ãƒ†ã‚ストãŒä½œã‚Œã¾ã›ã‚“ + </string> + <string name="MBPixelFmtErr"> + é©åˆ‡ãªãƒ”クセル形å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="MBPixelFmtDescErr"> + ãƒ”ã‚¯ã‚»ãƒ«å½¢å¼æƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] をウィンドウã§å®Ÿè¡Œã™ã‚‹ã«ã¯ã€True Color(32ビット)ãŒå¿…è¦ã§ã™ã€‚ +「コントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€ã«è¡Œãã€ã€Œæœ€é«˜ (32 ビット)ã€ã«è¨å®šã—ã¦ãã ã•ã„。 +全画é¢ã‚’é¸æŠžã—ãŸå ´åˆã€å®Ÿè¡Œæ™‚ã« [APP_NAME] ã¯è‡ªå‹•çš„ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚’調整ã—ã¾ã™ã€‚ + </string> + <string name="MBAlpha"> + [APP_NAME] 㯠8 ビットã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã§ããªã„ãŸã‚実行ã§ãã¾ã›ã‚“。 通常ビデオカードã®ãƒ‰ãƒ©ã‚¤ãƒã®å•題ã§èµ·ã“りã¾ã™ã€‚ +ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã«æœ€æ–°ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 +ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32ビット)ã€ã«è¨å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </string> + <string name="MBPixelFmtSetErr"> + ピクセル形å¼ãŒè¨å®šã§ãã¾ã›ã‚“ + </string> + <string name="MBGLContextErr"> + GL レンダーコンテã‚ストãŒä½œã‚Œã¾ã›ã‚“ + </string> + <string name="MBGLContextActErr"> + GL レンダーコンテã‚ストをアクティベートã§ãã¾ã›ã‚“ + </string> + <string name="MBVideoDrvErr"> + ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。 + +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </string> + <string name="5 O'Clock Shadow"> + ã†ã£ã™ã‚‰ã¨ã—ãŸãƒ’ゲ + </string> + <string name="All White"> + 真ã£ç™½ + </string> + <string name="Anime Eyes"> + アニメ風ã®ç›® + </string> + <string name="Arced"> + アーム+ </string> + <string name="Arm Length"> + è…•ã®é•·ã• + </string> + <string name="Attached"> + å° + </string> + <string name="Attached Earlobes"> + 耳ãŸã¶ + </string> + <string name="Back Bangs"> + 後ã‚ã«ã‹ã上ã’ãŸå‰é«ª + </string> + <string name="Back Bangs Down"> + 後ã‚ã«ã‹ã上ã’ã¦ä¸‹ã‚ã—ãŸå‰é«ª + </string> + <string name="Back Bangs Up"> + 後ã‚ã«ã‹ã上ã’ã¦æŒã¡ä¸Šã’ãŸå‰é«ª + </string> + <string name="Back Fringe"> + 後ã‚é«ªã®æ¯›å…ˆ + </string> + <string name="Back Hair"> + 後ã‚髪 + </string> + <string name="Back Hair Down"> + 下ã‚ã—ãŸå¾Œã‚髪 + </string> + <string name="Back Hair Up"> + アップã«ã—ãŸå¾Œã‚髪 + </string> + <string name="Baggy"> + ãŸã‚‹ã‚“ã§ã„ã‚‹ + </string> + <string name="Bangs"> + å‰é«ª + </string> + <string name="Bangs Down"> + 下ã‚ã—ãŸå‰é«ª + </string> + <string name="Bangs Up"> + æŒã¡ä¸Šã’ãŸå‰é«ª + </string> + <string name="Beady Eyes"> + ビーズã®ã‚ˆã†ãªç›® + </string> + <string name="Belly Size"> + ãŠè…¹ã®å¤§ãã• + </string> + <string name="Big"> + 大 + </string> + <string name="Big Butt"> + 大 + </string> + <string name="Big Eyeball"> + 大ãã„çœ¼çƒ + </string> + <string name="Big Hair Back"> + 髪ã®å¤§éƒ¨åˆ†ï¼š 後゠+ </string> + <string name="Big Hair Front"> + 髪ã®å¤§éƒ¨åˆ†ï¼š å‰ + </string> + <string name="Big Hair Top"> + 髪ã®å¤§éƒ¨åˆ†ï¼š 上部 + </string> + <string name="Big Head"> + 大 + </string> + <string name="Big Pectorals"> + 大 + </string> + <string name="Big Spikes"> + ã¨ã’ã‚り + </string> + <string name="Black"> + é»’ + </string> + <string name="Blonde"> + ブãƒãƒ³ãƒ‰ + </string> + <string name="Blonde Hair"> + ブãƒãƒ³ãƒ‰ã®é«ª + </string> + <string name="Blush"> + ãƒãƒ¼ã‚¯ + </string> + <string name="Blush Color"> + ãƒãƒ¼ã‚¯ã‚«ãƒ©ãƒ¼ + </string> + <string name="Blush Opacity"> + ãƒãƒ¼ã‚¯ã®æ¿ƒã• + </string> + <string name="Body Definition"> + 体ã®ç²¾ç´°åº¦ + </string> + <string name="Body Fat"> + 体脂肪 + </string> + <string name="Body Freckles"> + 体ã®ã—ã¿ãƒ»ãã°ã‹ã™ + </string> + <string name="Body Thick"> + 骨太 + </string> + <string name="Body Thickness"> + 体ã®åŽšã¿ + </string> + <string name="Body Thin"> + ç´°ã‚ + </string> + <string name="Bow Legged"> + 外股 + </string> + <string name="Breast Buoyancy"> + 胸ã®é‡åŠ› + </string> + <string name="Breast Cleavage"> + 胸ã®è°·é–“ + </string> + <string name="Breast Size"> + 胸ã®å¤§ãã• + </string> + <string name="Bridge Width"> + 両目ã®é–“ã®å¹… + </string> + <string name="Broad"> + 広 + </string> + <string name="Brow Size"> + 眉毛ã®å¤§ãã• + </string> + <string name="Bug Eyes"> + Bug Eyes + </string> + <string name="Bugged Eyes"> + çªã出ãŸç›® + </string> + <string name="Bulbous"> + ã ã‚“ã” + </string> + <string name="Bulbous Nose"> + ã ã‚“ã”é¼» + </string> + <string name="Bushy Eyebrows"> + 太 + </string> + <string name="Bushy Hair"> + ã¼ã•ã¼ã•ヘア + </string> + <string name="Butt Size"> + ãŠå°»ã®å¤§ãã• + </string> + <string name="bustle skirt"> + 後ã‚ã®è†¨ã‚‰ã¿ + </string> + <string name="no bustle"> + 膨らã¿ãªã— + </string> + <string name="more bustle"> + 膨らã¿å¤§ + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + ã»ãŠéª¨ + </string> + <string name="Chest Size"> + 胸部ã®å¤§ãã• + </string> + <string name="Chin Angle"> + ã‚ã”ã®è§’度 + </string> + <string name="Chin Cleft"> + ã‚ã”ã®å…ˆã®å‰²ã‚Œå…·åˆ + </string> + <string name="Chin Curtains"> + ã‚ã”ã«æ²¿ã£ãŸã²ã’ + </string> + <string name="Chin Depth"> + ã‚ã”ã®é•·ã• + </string> + <string name="Chin Heavy"> + ã‚ã”ã«é‡ç‚¹ + </string> + <string name="Chin In"> + ã²ã„ãŸã‚ã” + </string> + <string name="Chin Out"> + çªã出ãŸã‚ã” + </string> + <string name="Chin-Neck"> + ã‚ã”ã¨é¦– + </string> + <string name="Clear"> + クリア + </string> + <string name="Cleft"> + 割れ㟠+ </string> + <string name="Close Set Eyes"> + é¡”ã®ä¸å¿ƒå¯„りã®ç›® + </string> + <string name="Closed"> + クãƒãƒ¼ã‚º + </string> + <string name="Closed Back"> + 後ã‚ã¨ã˜ + </string> + <string name="Closed Front"> + å‰ã¨ã˜ + </string> + <string name="Closed Left"> + å·¦ã¨ã˜ + </string> + <string name="Closed Right"> + å³ã¨ã˜ + </string> + <string name="Coin Purse"> + コイン入れ + </string> + <string name="Collar Back"> + 後ã‚ãˆã‚Š + </string> + <string name="Collar Front"> + å‰ãˆã‚Š + </string> + <string name="Corner Down"> + ダウン + </string> + <string name="Corner Normal"> + ノーマル + </string> + <string name="Corner Up"> + アップ + </string> + <string name="Creased"> + é‡ã„ã¾ã¶ãŸ + </string> + <string name="Crooked Nose"> + 曲ãŒã£ãŸé¼» + </string> + <string name="Cropped Hair"> + çŸã刈り込んã 髪 + </string> + <string name="Cuff Flare"> + 袖å£ã®ãƒ•レア + </string> + <string name="Dark"> + ダーク + </string> + <string name="Dark Green"> + ダークグリーン + </string> + <string name="Darker"> + ダーク + </string> + <string name="Deep"> + å°–ã£ãŸ + </string> + <string name="Default Heels"> + デフォルトã®ã‹ã‹ã¨ + </string> + <string name="Default Toe"> + デフォルトã®ã¤ã¾å…ˆ + </string> + <string name="Dense"> + 濃 + </string> + <string name="Dense hair"> + 密度ã®å¤šã„髪 + </string> + <string name="Double Chin"> + 二é‡ã‚ã” + </string> + <string name="Downturned"> + 下å‘ã + </string> + <string name="Duffle Bag"> + ダッフルãƒãƒƒã‚° + </string> + <string name="Ear Angle"> + 耳ã®è§’度 + </string> + <string name="Ear Size"> + 耳ã®å¤§ãã• + </string> + <string name="Ear Tips"> + 耳ã®å…ˆ + </string> + <string name="Egg Head"> + ãŸã¾ã”é + </string> + <string name="Eye Bags"> + 下ã¾ã¶ãŸ + </string> + <string name="Eye Color"> + çž³ã®è‰² + </string> + <string name="Eye Depth"> + ç›®ã®ãã¼ã¿ + </string> + <string name="Eye Lightness"> + çž³ã®æ˜Žã‚‹ã• + </string> + <string name="Eye Opening"> + 見開ãå…·åˆ + </string> + <string name="Eye Pop"> + 両目ã®å¤§ãã•ã®å¯¾ç§° + </string> + <string name="Eye Size"> + ç›®ã®å¤§ãã• + </string> + <string name="Eye Spacing"> + ç›®ã¨ç›®ã®ã‚ã„ã ã®å¹… + </string> + <string name="Eyeball Size"> + 眼çƒã®å¤§ãã• + </string> + <string name="Eyebrow Arc"> + 眉毛ã®ã‚¢ãƒ¼ãƒ + </string> + <string name="Eyebrow Density"> + 眉毛ã®å¯†é›†åº¦ + </string> + <string name="Eyebrow Height"> + 眉毛ã®é«˜ã• + </string> + <string name="Eyebrow Points"> + 眉毛ã®è§’ + </string> + <string name="Eyebrow Size"> + 眉毛ã®å¤§ãã• + </string> + <string name="Eyelash Length"> + ã¾ã¤ã’ã®é•·ã• + </string> + <string name="Eyeliner"> + アイライナー + </string> + <string name="Eyeliner Color"> + アイライナーã®è‰² + </string> + <string name="Eyes Back"> + 目・戻る + </string> + <string name="Eyes Bugged"> + 下ã¾ã¶ãŸãŒãŸã‚‹ã‚“ã ç›® + </string> + <string name="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"> + 離れãŸç›® + </string> + <string name="Eyes Sunken"> + ãã¼ã‚“ã ç›® + </string> + <string name="Eyes Together"> + Eyes Together + </string> + <string name="Face Shear"> + é¡”ã®ã‚†ãŒã¿ + </string> + <string name="Facial Definition"> + é¡”ã®ç²¾ç´°åº¦ + </string> + <string name="Far Set Eyes"> + 離れãŸç›® + </string> + <string name="Fat"> + 太ã£ãŸ + </string> + <string name="Fat Head"> + 太ã‚ã®é + </string> + <string name="Fat Lips"> + 大 + </string> + <string name="Fat Lower"> + Fat Lower + </string> + <string name="Fat Lower Lip"> + 厚ã‚ã®ä¸‹å”‡ + </string> + <string name="Fat Torso"> + 太ã‚ã®é 部 + </string> + <string name="Fat Upper"> + Fat Upper + </string> + <string name="Fat Upper Lip"> + 厚ã‚ã®ä¸Šå”‡ + </string> + <string name="Female"> + 女性 + </string> + <string name="Fingerless"> + 指ãªã— + </string> + <string name="Fingers"> + 指ã‚り + </string> + <string name="Flared Cuffs"> + 広ãŒã£ãŸè¢–å£ + </string> + <string name="Flat"> + 平ら + </string> + <string name="Flat Butt"> + å° + </string> + <string name="Flat Head"> + çµ¶å£é + </string> + <string name="Flat Toe"> + フラット + </string> + <string name="Foot Size"> + è¶³ã®å¤§ãã• + </string> + <string name="Forehead Angle"> + ã²ãŸã„ã®è§’度 + </string> + <string name="Forehead Heavy"> + ã²ãŸã„ã«é‡ç‚¹ + </string> + <string name="Freckles"> + ã—ã¿ãƒ»ãã°ã‹ã™ + </string> + <string name="Front Bangs Down"> + 下ã‚ã—ãŸå‰é«ª + </string> + <string name="Front Bangs Up"> + 上ã’ãŸå‰é«ª + </string> + <string name="Front Fringe"> + å‰é«ªã®æ¯›å…ˆ + </string> + <string name="Front Hair"> + å‰é«ª + </string> + <string name="Front Hair Down"> + 下ã‚ã—ãŸå‰é«ª + </string> + <string name="Front Hair Up"> + アップã«ã—ãŸå‰é«ª + </string> + <string name="Full Back"> + 刈られã¦ã„ãªã„髪 + </string> + <string name="Full Eyeliner"> + ã‚り + </string> + <string name="Full Front"> + 刈られã¦ã„ãªã„髪 + </string> + <string name="Full Hair Sides"> + サイドã®é«ª + </string> + <string name="Full Sides"> + ç”Ÿãˆæƒã£ãŸã‚µã‚¤ãƒ‰ + </string> + <string name="Glossy"> + ã‚り + </string> + <string name="Glove Fingers"> + æ‰‹è¢‹ã®æŒ‡ + </string> + <string name="Glove Length"> + 手袋ã®é•·ã• + </string> + <string name="Hair"> + 髪 + </string> + <string name="Hair Back"> + 髪: 後゠+ </string> + <string name="Hair Front"> + 髪: å‰ + </string> + <string name="Hair Sides"> + 髪: サイド + </string> + <string name="Hair Sweep"> + æµã™ + </string> + <string name="Hair Thickess"> + 髪ã®é‡ + </string> + <string name="Hair Thickness"> + 髪ã®é‡ + </string> + <string name="Hair Tilt"> + 髪ã®å‘ã + </string> + <string name="Hair Tilted Left"> + å·¦å‘ã + </string> + <string name="Hair Tilted Right"> + å³å‘ã + </string> + <string name="Hair Volume"> + 髪: ボリューム+ </string> + <string name="Hand Size"> + 手ã®å¤§ãã• + </string> + <string name="Handlebars"> + ãƒãƒ³ãƒ‰ãƒ«ãƒãƒ¼ + </string> + <string name="Head Length"> + é ã®é•·ã• + </string> + <string name="Head Shape"> + é ã®å½¢ + </string> + <string name="Head Size"> + é ã®å¤§ãã• + </string> + <string name="Head Stretch"> + é ã®ä¼¸ã³å…·åˆ + </string> + <string name="Heel Height"> + ヒールã®é«˜ã• + </string> + <string name="Heel Shape"> + ヒールã®å½¢ + </string> + <string name="Height"> + 身長 + </string> + <string name="High"> + 高 + </string> + <string name="High Heels"> + ãƒã‚¤ãƒ’ール + </string> + <string name="High Jaw"> + 高 + </string> + <string name="High Platforms"> + 厚底 + </string> + <string name="High and Tight"> + 高ã‚ã§ã‚¿ã‚¤ãƒˆ + </string> + <string name="Higher"> + 高 + </string> + <string name="Hip Length"> + è…°ã®é•·ã• + </string> + <string name="Hip Width"> + è…°ã®å¹… + </string> + <string name="In"> + 内å‘ã + </string> + <string name="In Shdw Color"> + 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼ + </string> + <string name="In Shdw Opacity"> + 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã• + </string> + <string name="Inner Eye Corner"> + ç›®é + </string> + <string name="Inner Eye Shadow"> + 内å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Inner Shadow"> + 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Jacket Length"> + ジャケット丈 + </string> + <string name="Jacket Wrinkles"> + ジャケットã®ã—ã‚ + </string> + <string name="Jaw Angle"> + ã‚ã”ã®è§’度 + </string> + <string name="Jaw Jut"> + ã‚ã”ã®çªå‡º + </string> + <string name="Jaw Shape"> + ã‚ã”ã®å½¢ + </string> + <string name="Join"> + 寄ã›ãŸ + </string> + <string name="Jowls"> + ãˆã‚‰ + </string> + <string name="Knee Angle"> + è†ã®è§’度 + </string> + <string name="Knock Kneed"> + 内股 + </string> + <string name="Large"> + 大 + </string> + <string name="Large Hands"> + 大 + </string> + <string name="Left Part"> + 左分㑠+ </string> + <string name="Leg Length"> + 脚ã®é•·ã• + </string> + <string name="Leg Muscles"> + 脚ã®ç‹è‚‰ + </string> + <string name="Less"> + å° + </string> + <string name="Less Body Fat"> + å°‘ãªã‚ + </string> + <string name="Less Curtains"> + å°‘ãªã‚ + </string> + <string name="Less Freckles"> + å°‘ãªã‚ + </string> + <string name="Less Full"> + è–„ã„ + </string> + <string name="Less Gravity"> + å°‘ + </string> + <string name="Less Love"> + å°‘ + </string> + <string name="Less Muscles"> + å°‘ãªã‚ + </string> + <string name="Less Muscular"> + å°‘ãªã‚ + </string> + <string name="Less Rosy"> + å°‘ãªç›® + </string> + <string name="Less Round"> + 丸ã¿å°‘ãªç›® + </string> + <string name="Less Saddle"> + å° + </string> + <string name="Less Square"> + å° + </string> + <string name="Less Volume"> + ボリューム少ãªç›® + </string> + <string name="Less soul"> + å° + </string> + <string name="Lighter"> + ライト + </string> + <string name="Lip Cleft"> + 唇ã®å±± + </string> + <string name="Lip Cleft Depth"> + 唇ã®å±±ã®é«˜ã• + </string> + <string name="Lip Fullness"> + 唇ã®åŽšã¿ + </string> + <string name="Lip Pinkness"> + 唇ã®èµ¤ã¿ + </string> + <string name="Lip Ratio"> + 上下唇ã®å¤§ãã• + </string> + <string name="Lip Thickness"> + 唇ã®å‰å¾Œå¹… + </string> + <string name="Lip Width"> + å£ã®å¤§ãã• + </string> + <string name="Lipgloss"> + リップグãƒã‚¹ + </string> + <string name="Lipstick"> + å£ç´… + </string> + <string name="Lipstick Color"> + å£ç´…ã®è‰² + </string> + <string name="Long"> + é•· + </string> + <string name="Long Head"> + å‰å¾Œå¹…ãŒåºƒã„é + </string> + <string name="Long Hips"> + é•· + </string> + <string name="Long Legs"> + é•· + </string> + <string name="Long Neck"> + é•· + </string> + <string name="Long Pigtails"> + é•· + </string> + <string name="Long Ponytail"> + é•· + </string> + <string name="Long Torso"> + é•· + </string> + <string name="Long arms"> + é•· + </string> + <string name="Longcuffs"> + ãƒãƒ³ã‚°ã‚«ãƒ•ス + </string> + <string name="Loose Pants"> + ゆã£ãŸã‚Š + </string> + <string name="Loose Shirt"> + ゆる゠+ </string> + <string name="Loose Sleeves"> + ゆる゠+ </string> + <string name="Love Handles"> + ウエスト周り + </string> + <string name="Low"> + 低 + </string> + <string name="Low Heels"> + ãƒãƒ¼ãƒ’ール + </string> + <string name="Low Jaw"> + 低 + </string> + <string name="Low Platforms"> + 低゠+ </string> + <string name="Low and Loose"> + 低ã‚ã§ã‚†ã£ãŸã‚Š + </string> + <string name="Lower"> + 低 + </string> + <string name="Lower Bridge"> + é¼»ç‹ + </string> + <string name="Lower Cheeks"> + ã»ãŠã®ä¸‹éƒ¨ + </string> + <string name="Male"> + 男性 + </string> + <string name="Middle Part"> + 真んä¸åˆ†ã‘ + </string> + <string name="More"> + 大 + </string> + <string name="More Blush"> + ãã¤ã‚ + </string> + <string name="More Body Fat"> + 多゠+ </string> + <string name="More Curtains"> + 多゠+ </string> + <string name="More Eyeshadow"> + ã‚り + </string> + <string name="More Freckles"> + 多゠+ </string> + <string name="More Full"> + 厚ㄠ+ </string> + <string name="More Gravity"> + 大 + </string> + <string name="More Lipstick"> + ã‚り + </string> + <string name="More Love"> + 大 + </string> + <string name="More Lower Lip"> + 大 + </string> + <string name="More Muscles"> + 多゠+ </string> + <string name="More Muscular"> + ç‹éª¨éš†ã€… + </string> + <string name="More Rosy"> + 多゠+ </string> + <string name="More Round"> + ã¾ã‚‹ + </string> + <string name="More Saddle"> + 大 + </string> + <string name="More Sloped"> + ãªã ら㋠+ </string> + <string name="More Square"> + 四角 + </string> + <string name="More Upper Lip"> + 大 + </string> + <string name="More Vertical"> + 垂直 + </string> + <string name="More Volume"> + 大 + </string> + <string name="More soul"> + 大 + </string> + <string name="Moustache"> + å£ã²ã’ + </string> + <string name="Mouth Corner"> + å£è§’ + </string> + <string name="Mouth Position"> + å£ã®ä½ç½® + </string> + <string name="Mowhawk"> + モヒカン + </string> + <string name="Muscular"> + ç‹éª¨ãŸãã¾ã—ã„ + </string> + <string name="Mutton Chops"> + マトンãƒãƒ§ãƒƒãƒ—ス + </string> + <string name="Nail Polish"> + マニã‚ュア + </string> + <string name="Nail Polish Color"> + マニã‚ュアã®è‰² + </string> + <string name="Narrow"> + ç‹ + </string> + <string name="Narrow Back"> + ç‹ + </string> + <string name="Narrow Front"> + ç‹ + </string> + <string name="Narrow Lips"> + ãŠã¡ã‚‡ã¼å£ + </string> + <string name="Natural"> + ナãƒãƒ¥ãƒ©ãƒ« + </string> + <string name="Neck Length"> + 首ã®é•·ã• + </string> + <string name="Neck Thickness"> + 首ã®å¤ªã• + </string> + <string name="No Blush"> + ãªã— + </string> + <string name="No Eyeliner"> + ãªã— + </string> + <string name="No Eyeshadow"> + ãªã— + </string> + <string name="No Heels"> + ãªã— + </string> + <string name="No Lipgloss"> + ãªã— + </string> + <string name="No Lipstick"> + ãªã— + </string> + <string name="No Part"> + ãªã— + </string> + <string name="No Polish"> + ãªã— + </string> + <string name="No Red"> + ãªã— + </string> + <string name="No Spikes"> + ãªã— + </string> + <string name="No White"> + ãªã— + </string> + <string name="No Wrinkles"> + ãªã— + </string> + <string name="Normal Lower"> + Normal Lower + </string> + <string name="Normal Upper"> + Normal Upper + </string> + <string name="Nose Left"> + 左曲ãŒã‚Š + </string> + <string name="Nose Right"> + 峿›²ãŒã‚Š + </string> + <string name="Nose Size"> + é¼»ã®å¤§ãã• + </string> + <string name="Nose Thickness"> + é¼»ã®åŽšã¿ + </string> + <string name="Nose Tip Angle"> + 鼻先ã®è§’度 + </string> + <string name="Nose Tip Shape"> + 鼻先ã®å½¢ + </string> + <string name="Nose Width"> + é¼»ã®å¹… + </string> + <string name="Nostril Division"> + é¼»ã®ç©´ã®é«˜ã• + </string> + <string name="Nostril Width"> + é¼»ã®ç©´ã®å¹… + </string> + <string name="Old"> + Old + </string> + <string name="Opaque"> + 濃ã„ã‚ + </string> + <string name="Open"> + オープン + </string> + <string name="Open Back"> + 後ã‚ã‚ã + </string> + <string name="Open Front"> + å‰ã‚ã + </string> + <string name="Open Left"> + å·¦ã‚ã + </string> + <string name="Open Right"> + å³ã‚ã + </string> + <string name="Orange"> + オレンジ + </string> + <string name="Out"> + 外å‘ã + </string> + <string name="Out Shdw Color"> + 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼ + </string> + <string name="Out Shdw Opacity"> + 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã• + </string> + <string name="Outer Eye Corner"> + 目尻 + </string> + <string name="Outer Eye Shadow"> + 外å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Outer Shadow"> + 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Overbite"> + å‡ºã£æ¯ + </string> + <string name="Package"> + パッケージ + </string> + <string name="Painted Nails"> + ã‚り + </string> + <string name="Pale"> + 悪ㄠ+ </string> + <string name="Pants Crotch"> + パンツã®è‚¡ + </string> + <string name="Pants Fit"> + パンツã®ãƒ•ィット感 + </string> + <string name="Pants Length"> + パンツ丈 + </string> + <string name="Pants Waist"> + ウエスト + </string> + <string name="Pants Wrinkles"> + パンツã®ã—ã‚ + </string> + <string name="Part"> + ã‚り + </string> + <string name="Part Bangs"> + 分ã‘ãŸå‰é«ª + </string> + <string name="Pectorals"> + èƒ¸ç‹ + </string> + <string name="Pigment"> + è‰²ç´ + </string> + <string name="Pigtails"> + 下ã’髪 + </string> + <string name="Pink"> + ピンク + </string> + <string name="Pinker"> + ピンク + </string> + <string name="Platform Height"> + é´åº•ã®é«˜ã• + </string> + <string name="Platform Width"> + é´åº•ã®å¹… + </string> + <string name="Pointy"> + å°–ã£ãŸ + </string> + <string name="Pointy Heels"> + å¹…ç‹ + </string> + <string name="Pointy Toe"> + å…ˆã®ç´°ã„ã¤ã¾å…ˆ + </string> + <string name="Ponytail"> + ãƒãƒ‹ãƒ¼ãƒ†ãƒ¼ãƒ« + </string> + <string name="Poofy Skirt"> + ãµã‚“ã‚り + </string> + <string name="Pop Left Eye"> + 左目を大ãã + </string> + <string name="Pop Right Eye"> + å³ç›®ã‚’大ãã + </string> + <string name="Puffy"> + ãµã£ãら + </string> + <string name="Puffy Eyelids"> + ç›®ã®å‘¨ã‚Šã®è†¨ã‚‰ã¿ + </string> + <string name="Rainbow Color"> + 虹色 + </string> + <string name="Red Hair"> + 赤毛 + </string> + <string name="Red Skin"> + 赤ã„肌 + </string> + <string name="Regular"> + 凿•´ã®ã¨ã‚ŒãŸ + </string> + <string name="Regular Muscles"> + 凿•´ã®ã¨ã‚ŒãŸç‹è‚‰ + </string> + <string name="Right Part"> + å³åˆ†ã‘ + </string> + <string name="Rosy Complexion"> + ã»ãŠã®èµ¤ã‚‰ã¿ + </string> + <string name="Round"> + ã¾ã‚‹ã£ã“ã„ + </string> + <string name="Round Forehead"> + 丸ã¿ã‚’帯ã³ãŸé¡ + </string> + <string name="Ruddiness"> + 血色 + </string> + <string name="Ruddy"> + 良ㄠ+ </string> + <string name="Rumpled Hair"> + ãã—ゃãã—ゃヘア + </string> + <string name="Saddle Bags"> + 腰回りã®è‚‰ä»˜ã + </string> + <string name="Saddlebags"> + 腰回りã®è‚‰ä»˜ã + </string> + <string name="Scrawny"> + 骨張ã£ãŸ + </string> + <string name="Scrawny Leg"> + 骨張ã£ãŸè„š + </string> + <string name="Separate"> + 離れ㟠+ </string> + <string name="Shading"> + Shading + </string> + <string name="Shadow hair"> + Shadow hair + </string> + <string name="Shallow"> + ãªã ら㋠+ </string> + <string name="Shear Back"> + 後方を刈る + </string> + <string name="Shear Face"> + é¡”ã®ã‚†ãŒã¿ + </string> + <string name="Shear Front"> + 剿–¹ã‚’刈る + </string> + <string name="Shear Left"> + å·¦å´ + </string> + <string name="Shear Left Up"> + å·¦åŠåˆ†ã‚’上㫠+ </string> + <string name="Shear Right"> + å³å´ + </string> + <string name="Shear Right Up"> + å³åŠåˆ†ã‚’上㫠+ </string> + <string name="Sheared Back"> + 後ã‚を刈られãŸé«ª + </string> + <string name="Sheared Front"> + å‰ã‚’刈られãŸé«ª + </string> + <string name="Shift Left"> + å·¦å‘ã + </string> + <string name="Shift Mouth"> + å£ã®å‘ã + </string> + <string name="Shift Right"> + å³å‘ã + </string> + <string name="Shirt Bottom"> + シャツã®è£¾ + </string> + <string name="Shirt Fit"> + シャツã®ãƒ•ィット感 + </string> + <string name="Shirt Wrinkles"> + シャツã®ã—ã‚ + </string> + <string name="Shoe Height"> + é´ã®é•·ã• + </string> + <string name="Short"> + çŸ + </string> + <string name="Short Arms"> + çŸ + </string> + <string name="Short Legs"> + çŸ + </string> + <string name="Short Neck"> + çŸ + </string> + <string name="Short Pigtails"> + çŸ + </string> + <string name="Short Ponytail"> + çŸ + </string> + <string name="Short Sideburns"> + çŸã‚ + </string> + <string name="Short Torso"> + çŸ + </string> + <string name="Short hips"> + çŸ + </string> + <string name="Shoulders"> + è‚© + </string> + <string name="Side Bangs"> + ã‚µã‚¤ãƒ‰ã«æµã—ãŸå‰é«ª + </string> + <string name="Side Bangs Down"> + ダウン + </string> + <string name="Side Bangs Up"> + アップ + </string> + <string name="Side Fringe"> + ã‚µã‚¤ãƒ‰ã®æ¯›å…ˆ + </string> + <string name="Sideburns"> + ã‚‚ã¿ã‚ã’ + </string> + <string name="Sides Hair"> + サイドã®é«ª + </string> + <string name="Sides Hair Down"> + ダウン + </string> + <string name="Sides Hair Up"> + アップ + </string> + <string name="Skinny"> + 細身 + </string> + <string name="Skinny Neck"> + ç´° + </string> + <string name="Skirt Fit"> + スカートã®ãƒ•ィット感 + </string> + <string name="Skirt Length"> + スカート丈 + </string> + <string name="Slanted Forehead"> + 傾斜ã—ãŸé¡ + </string> + <string name="Sleeve Length"> + 袖丈 + </string> + <string name="Sleeve Looseness"> + 袖ã®ãƒ•ィット感 + </string> + <string name="Slit Back"> + スリット: 後゠+ </string> + <string name="Slit Front"> + スリット: å‰ + </string> + <string name="Slit Left"> + スリット: å·¦ + </string> + <string name="Slit Right"> + スリット: å³ + </string> + <string name="Small"> + å° + </string> + <string name="Small Hands"> + å° + </string> + <string name="Small Head"> + å° + </string> + <string name="Smooth"> + 滑ら㋠+ </string> + <string name="Smooth Hair"> + スムーズ + </string> + <string name="Socks Length"> + é´ä¸‹ä¸ˆ + </string> + <string name="Some"> + Some + </string> + <string name="Soulpatch"> + ソウルパッム+ </string> + <string name="Sparse"> + è–„ + </string> + <string name="Spiked Hair"> + ã¨ã’ã¨ã’ヘア + </string> + <string name="Square"> + è§’å¼µã£ãŸ + </string> + <string name="Square Toe"> + スクエアトゥ + </string> + <string name="Squash Head"> + カボãƒãƒ£åž‹ + </string> + <string name="Squash/Stretch Head"> + カボãƒãƒ£/縦長é + </string> + <string name="Stretch Head"> + 縦長 + </string> + <string name="Sunken"> + ã“ã‘㟠+ </string> + <string name="Sunken Chest"> + å° + </string> + <string name="Sunken Eyes"> + ãã¼ã‚“ã ç›® + </string> + <string name="Sweep Back"> + 後ã‚㸠+ </string> + <string name="Sweep Forward"> + å‰ã¸ + </string> + <string name="Swept Back"> + オールãƒãƒƒã‚¯ + </string> + <string name="Swept Back Hair"> + オールãƒãƒƒã‚¯ãƒ˜ã‚¢ + </string> + <string name="Swept Forward"> + å‰ã¸ + </string> + <string name="Swept Forward Hair"> + 後ã‚㸠+ </string> + <string name="Tall"> + 高 + </string> + <string name="Taper Back"> + 後ã‚ã«å…ˆç´° + </string> + <string name="Taper Front"> + å‰ã«å…ˆç´° + </string> + <string name="Thick Heels"> + 幅広 + </string> + <string name="Thick Neck"> + 太 + </string> + <string name="Thick Toe"> + 厚゠+ </string> + <string name="Thickness"> + 厚㿠+ </string> + <string name="Thin"> + è–„ã„ + </string> + <string name="Thin Eyebrows"> + ç´° + </string> + <string name="Thin Lips"> + å° + </string> + <string name="Thin Nose"> + ç´°ã„é¼» + </string> + <string name="Tight Chin"> + ã²ãã—ã¾ã£ãŸã‚ã” + </string> + <string name="Tight Cuffs"> + タイト + </string> + <string name="Tight Pants"> + タイト + </string> + <string name="Tight Shirt"> + タイト + </string> + <string name="Tight Skirt"> + タイト + </string> + <string name="Tight Sleeves"> + タイト + </string> + <string name="Tilt Left"> + å·¦ã«å‚¾æ–œ + </string> + <string name="Tilt Right"> + å³ã«å‚¾æ–œ + </string> + <string name="Toe Shape"> + ã¤ã¾å…ˆã®å½¢ + </string> + <string name="Toe Thickness"> + ã¤ã¾å…ˆã®åŽšã¿ + </string> + <string name="Torso Length"> + 上åŠèº«ã®é•·ã• + </string> + <string name="Torso Muscles"> + 上åŠèº«ã®ç‹è‚‰ + </string> + <string name="Torso Scrawny"> + 上åŠèº«ã®éª¨å¼µã‚Š + </string> + <string name="Unattached"> + 大 + </string> + <string name="Uncreased"> + 軽ã„ã¾ã¶ãŸ + </string> + <string name="Underbite"> + å—ã‘å£ + </string> + <string name="Unnatural"> + ユニーク + </string> + <string name="Upper Bridge"> + 両目ã®ã‚ã„ã + </string> + <string name="Upper Cheeks"> + ã»ãŠã®ä¸Šéƒ¨ + </string> + <string name="Upper Chin Cleft"> + ã‚ã”上部ã®å‰²ã‚Œå…·åˆ + </string> + <string name="Upper Eyelid Fold"> + 二é‡ã®å¹… + </string> + <string name="Upturned"> + 上å‘ã + </string> + <string name="Very Red"> + 真ã£èµ¤ + </string> + <string name="Waist Height"> + ウエストã®é«˜ã• + </string> + <string name="Well-Fed"> + ã¤ã¾ã£ãŸ + </string> + <string name="White Hair"> + 白髪 + </string> + <string name="Wide"> + 広 + </string> + <string name="Wide Back"> + 広 + </string> + <string name="Wide Front"> + 広 + </string> + <string name="Wide Lips"> + 大ãã„å£ + </string> + <string name="Wild"> + ワイルド + </string> + <string name="Wrinkles"> + ã—ã‚ã‚り + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + マイ ランドマークã«è¿½åŠ + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + マイ ランドマークを編集 + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] アップデート + </string> + <string name="UpdaterNowUpdating"> + åªä»Š [APP_NAME] をアップデートä¸ã§ã™... + </string> + <string name="UpdaterNowInstalling"> + [APP_NAME] をインストールä¸ã§ã™... + </string> + <string name="UpdaterUpdatingDescriptive"> + ãŠä½¿ã„ã® [APP_NAME] ãƒ“ãƒ¥ãƒ¼ãƒ¯ãŒæœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—デートã•れã¦ã„ã¾ã™ã€‚ 数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã®ã§ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。 + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + アップデートをダウンãƒãƒ¼ãƒ‰ä¸ã§ã™... + </string> + <string name="UpdaterProgressBarText"> + アップデートをダウンãƒãƒ¼ãƒ‰ä¸ + </string> + <string name="UpdaterFailDownloadTitle"> + アップデートã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—㟠+ </string> + <string name="UpdaterFailUpdateDescriptive"> + [APP_NAME] をアップデートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 + </string> + <string name="UpdaterFailInstallTitle"> + アップデートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—㟠+ </string> + <string name="UpdaterFailStartTitle"> + ビューワã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—㟠+ </string> + <string name="only_user_message"> + ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ + </string> + <string name="offline_message"> + [FIRST] [LAST]ã¯ã‚ªãƒ•ラインã§ã™ã€‚ + </string> + <string name="invite_message"> + ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。 + </string> + <string name="generic_request_error"> + è¦æ±‚ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </string> + <string name="insufficient_perms_error"> + ã‚ãªãŸã«ã¯å……åˆ†ãªæ¨©é™ãŒã‚りã¾ã›ã‚“。 + </string> + <string name="session_does_not_exist_error"> + ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯æ—¢ã«åˆ‡æ–ã•れã¦ã„ã¾ã™ã€‚ + </string> + <string name="no_ability_error"> + ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。 + </string> + <string name="no_ability"> + ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。 + </string> + <string name="not_a_mod_error"> + ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。 + </string> + <string name="muted_error"> + グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚ストãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—㟠+ </string> + <string name="add_session_event"> + [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + </string> + <string name="message_session_event"> + [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + </string> + <string name="removed_from_group"> + ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚ + </string> + <string name="close_on_no_ability"> + ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ + </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 ef7571cac4981d11c9571af2b38a8bcda72cd08c..440704eafad4e9292f73f5bcf87c456ca24049e2 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -1,79 +1,79 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<teleport_messages name=""> - <message_set name="errors"> - <message name="invalid_tport"> - テレãƒãƒ¼ãƒˆå‡¦ç†ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 - </message> - <message name="invalid_region_handoff"> - リージョン間ã®ç§»å‹•ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 - </message> - <message name="blocked_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 -やり直ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。 - </message> - <message name="nolandmark_tport"> - 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ - </message> - <message name="timeout_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 - </message> - <message name="noaccess_tport"> - 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚りã¾ã›ã‚“。 - </message> - <message name="missing_attach_tport"> - 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’やり直ã—ã¦ã ã•ã„。 - </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"> - æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 - </message> - </message_set> - <message_set name="progress"> - <message name="sending_dest"> - 目的地ã«é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ - </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="resolving"> - 目的地を解決ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="contacting"> - æ–°ã—ã„地域ã«ã‚³ãƒ³ã‚¿ã‚¯ãƒˆã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="arriving"> - 到ç€... - </message> - <message name="requesting"> - テレãƒãƒ¼ãƒˆã‚’リクエスト... - </message> - </message_set> -</teleport_messages> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<teleport_messages name=""> + <message_set name="errors"> + <message name="invalid_tport"> + テレãƒãƒ¼ãƒˆå‡¦ç†ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </message> + <message name="invalid_region_handoff"> + リージョン間ã®ç§»å‹•ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </message> + <message name="blocked_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 +やり直ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。 + </message> + <message name="nolandmark_tport"> + 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ + </message> + <message name="timeout_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。 + </message> + <message name="noaccess_tport"> + 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚りã¾ã›ã‚“。 + </message> + <message name="missing_attach_tport"> + 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’やり直ã—ã¦ã ã•ã„。 + </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"> + æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 + </message> + </message_set> + <message_set name="progress"> + <message name="sending_dest"> + 目的地ã«é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ + </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="resolving"> + 目的地を解決ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="contacting"> + æ–°ã—ã„地域ã«ã‚³ãƒ³ã‚¿ã‚¯ãƒˆã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="arriving"> + 到ç€... + </message> + <message name="requesting"> + テレãƒãƒ¼ãƒˆã‚’リクエスト... + </message> + </message_set> +</teleport_messages> diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml index 9a83eaea614b4b67d096fcc8086fd62f7b863a5a..a282c267a1c65a507ccba6aa0c0fc724976fcb8a 100644 --- a/indra/newview/skins/default/xui/nl/notifications.xml +++ b/indra/newview/skins/default/xui/nl/notifications.xml @@ -380,6 +380,9 @@ De outfit folder bevat geen kleding, lichaamsdelen of externe bevestigingen. U moet zowel de voornaam als de achternaam van uw avatar opgeven. U heeft een account nodig om [SECOND_LIFE] binnen te gaan. Wilt u er nu een maken? + <url name="url"> + https://join.secondlife.com/index.php?lang=nl-NL + </url> <usetemplate name="okcancelbuttons" notext="Probeer het opnieuw" yestext="Maak een nieuw account"/> </notification> <notification name="AddClassified"> @@ -1131,7 +1134,7 @@ U kunt [SECOND_LIFE] normaal gebruiken en anderen zullen u correct zien. [APP_NAME] installatie compleet. Als dit de eerste keer is dat u [SECOND_LIFE] gebruikt, zult u een account aan moeten maken voordat u in kan loggen. -Terugkeren naar www.secondlife.com om een nieuw account aan te maken? +Terugkeren naar [https://join.secondlife.com/index.php?lang=nl-NL secondlife.com] om een nieuw account aan te maken? <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Nieuw Account..."/> </notification> <notification name="LoginPacketNeverReceived"> diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml index 5bfb9dd235864a615912a01d2855f10742359d04..235e15e7fbc0be23fdf501f4a29067cdc9dbc15e 100644 --- a/indra/newview/skins/default/xui/nl/panel_login.xml +++ b/indra/newview/skins/default/xui/nl/panel_login.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_login"> - <string name="real_url"> - http://secondlife.com/app/login/ - </string> - <string name="forgot_password_url"> - http://secondlife.com/account/request.php - </string> + <panel.string name="create_account_url"> + http://join.secondlife.com/index.php?lang=nl-NL + </panel.string> + <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> @@ -35,3 +36,4 @@ [VERSION] </text> </panel> +</panel> diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml index 49ebcd319ca08e67956c8debf78f783c30cff73d..0be5ec9e869f650e97cc75c7786e8a4de5e994d9 100644 --- a/indra/newview/skins/default/xui/nl/strings.xml +++ b/indra/newview/skins/default/xui/nl/strings.xml @@ -4,6 +4,7 @@ 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="LoginInProgress"> Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... . </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 3437dfcdba3c6d66753532b76d22a6b6ab618804..1cd6d5662c274e3af897731b37bedb89ec612046 100644 --- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater min_width="477" name="floater_about" title="NAVEGADOR DE MÃDIA" width="570"> + <floater.string name="home_page_url"> + http://br.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://br.secondlife.com/support + </floater.string> <layout_stack name="stack1" width="550"> <layout_panel name="nav_controls"> <button label="Para trás" name="back" width="75"/> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index c476ef0bbcd840e9a8bd31a5cb775b7c470d2c88..2c887fa50c0684d9222bb951d618cf2f5e3d3b36 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> + <menu 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> + </menu> <menu label="Arquivo" name="File"> <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/> <menu label="Upload" name="upload"> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 0ee2c5cb849cfb5eeb0c4c8a7c54308c949219c3..c3ce53861f482af537e995c192c43ff6cf4caeb4 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -377,10 +377,13 @@ Scripts devem ser permitidos para fazer as armas funcionarem. 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? + <url name="url"> + https://join.secondlife.com/index.php?lang=pt-BR + </url> <usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Criar uma nova conta"/> </notification> <notification name="AddClassified"> - Anúncios classificados aparecem na seção 'Classificados' do diretório de Busca e no www.secondlife.com por uma semana. + 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. @@ -401,6 +404,9 @@ Não há reembolso por taxas já pagas. </notification> <notification name="PromptGoToEventsPage"> Ir até a página web de enventos [SECOND_LIFE] ? + <url name="url"> + http://secondlife.com/events/?lang=pt-BR + </url> <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir à página"/> </notification> <notification name="SelectProposalToView"> @@ -492,7 +498,7 @@ O objeto pode estar fora de alcance ou ter sido deletado. MINSPECS Você deseja visitar [_URL] para maiores informações? <url name="url" option="0"> - http://www.secondlife.com/corporate/sysreqs.php + http://secondlife.com/support/sysreqs.php?lang=pt </url> <usetemplate ignoretext="Ao detectar hardware não suportado" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> @@ -571,6 +577,9 @@ Por favor, mova todos os objetos a serem adquiridos para uma mesma região. [EXTRA] Vá para [_URL] para informação sobre compra de L$. + <url name="url"> + http://secondlife.com/app/currency/?lang=pt-BR + </url> <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir até a página"/> </notification> <notification name="UnableToLinkObjects"> @@ -1115,13 +1124,16 @@ Você pode usar o [SECOND_LIFE] normalmente e os outros o visualizarão corretam A instalação do [APP_NAME] está completa. Se esta é a primeira vez usando o[SECOND_LIFE], será necessário que você crie uma conta antes de poder se logar. -Retornar a www.secondlife.com para criar uma nova conta? +Retornar a [https://join.secondlife.com/index.php?lang=pt-BR secondlife.com] para criar uma nova 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]. 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. + <url name="url"> + http://br.secondlife.com/support/ + </url> <form name="form"> <button name="OK" text="OK"/> <button name="Help" text="Ajuda"/> @@ -1492,7 +1504,7 @@ Por favor, verifique se você está com o último Visualizador instalado e vá a Ir para o Banco de Conhecimento para maiores informações sobre Classificações de maturidade? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt </url> <usetemplate name="okcancelignore" @@ -1531,7 +1543,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o Ir para a o Banco de Conhecimento para maiores informações sobre Classificações de maturidade? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt </url> <usetemplate name="okcancelignore" @@ -1565,7 +1577,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o Ir para o Banco de Conhecimento para maiores informações sobre Classificações de Maturidade? <url name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt </url> <usetemplate name="okcancelignore" @@ -1975,10 +1987,7 @@ Mover para o inventário o(s) item(s)? <usetemplate ignoretext="Quando Saindo do [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Sair"/> </notification> <notification name="HelpReportAbuseEmailLL"> - Use esta ferramenta para reportar violações aos Termos de Serviço e aos Padrões da Comunidade. Veja: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php + 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]. 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: diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml index c6f1433440cba378b58a2e78a45d30852cae578b..d7ff3f29df191ec2f41164bd291733cb662f4cca 100644 --- a/indra/newview/skins/default/xui/pt/panel_login.xml +++ b/indra/newview/skins/default/xui/pt/panel_login.xml @@ -1,5 +1,12 @@ <?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 + </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> @@ -29,3 +36,4 @@ [VERSION] </text> </panel> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff53aa6a41d3ca50fa95dfd5b3b56354019a9eba --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_profile.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] +[PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=pt-BR + </string> + <string name="partner_edit_link_url"> + 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"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 2d3514e5fe883e31f3a71c2c77e11d5beeb602dc..9acfce99dd159a0845f866a7d4fba349e9f44b6e 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -4,6 +4,7 @@ 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="LoginInProgress"> Fazendo Login. [APP_NAME] pode parecer congelado. Por favor, aguarde. </string> diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp index ed753b6ff7a2788f11a4c1f69fef47ac40e57127..142a5eb5e6aa02e5c83fbbef22e19e51e58ec9a7 100644 --- a/indra/newview/tests/lldateutil_test.cpp +++ b/indra/newview/tests/lldateutil_test.cpp @@ -60,6 +60,11 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil:: std::string LLTrans::getCountString(const std::string& language, const std::string& xml_desc, S32 count) { + count_string_t key(xml_desc, count); + if (gCountString.find(key) == gCountString.end()) + { + return std::string("Couldn't find ") + xml_desc; + } return gCountString[ count_string_t(xml_desc, count) ]; } @@ -91,8 +96,11 @@ namespace tut gCountString[ count_string_t("AgeYears", 2) ] = "2 years"; gCountString[ count_string_t("AgeMonths", 1) ] = "1 month"; gCountString[ count_string_t("AgeMonths", 2) ] = "2 months"; + gCountString[ count_string_t("AgeMonths", 11) ]= "11 months"; gCountString[ count_string_t("AgeWeeks", 1) ] = "1 week"; gCountString[ count_string_t("AgeWeeks", 2) ] = "2 weeks"; + gCountString[ count_string_t("AgeWeeks", 3) ] = "3 weeks"; + gCountString[ count_string_t("AgeWeeks", 4) ] = "4 weeks"; gCountString[ count_string_t("AgeDays", 1) ] = "1 day"; gCountString[ count_string_t("AgeDays", 2) ] = "2 days"; } @@ -113,12 +121,18 @@ namespace tut ensure_equals("years", LLDateUtil::ageFromDate("12/31/2007", mNow), "2 years old" ); - ensure_equals("single year", - LLDateUtil::ageFromDate("12/31/2008", mNow), - "1 year old" ); + ensure_equals("years", + LLDateUtil::ageFromDate("1/1/2008", mNow), + "1 year 11 months old" ); + ensure_equals("single year + one month", + LLDateUtil::ageFromDate("11/30/2008", mNow), + "1 year 1 month old" ); ensure_equals("single year + a bit", LLDateUtil::ageFromDate("12/12/2008", mNow), "1 year old" ); + ensure_equals("single year", + LLDateUtil::ageFromDate("12/31/2008", mNow), + "1 year old" ); } template<> template<> @@ -128,6 +142,9 @@ namespace tut ensure_equals("months", LLDateUtil::ageFromDate("10/30/2009", mNow), "2 months old" ); + ensure_equals("months 2", + LLDateUtil::ageFromDate("10/31/2009", mNow), + "2 months old" ); ensure_equals("single month", LLDateUtil::ageFromDate("11/30/2009", mNow), "1 month old" ); @@ -137,6 +154,9 @@ namespace tut void dateutil_object_t::test<3>() { set_test_name("Weeks"); + ensure_equals("4 weeks", + LLDateUtil::ageFromDate("12/1/2009", mNow), + "4 weeks old" ); ensure_equals("weeks", LLDateUtil::ageFromDate("12/17/2009", mNow), "2 weeks old" ); diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index d31a81e1280ae0f5be8087fee28d218cf56db24a..7b28a3b72c3898b63ebe3d5ab02f2570eb4d1d92 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -76,6 +76,7 @@ LLControlGroup::LLControlGroup(const std::string& name) : LLControlGroup::~LLControlGroup() {} void LLControlGroup::setBOOL(const std::string& name, BOOL val) {} BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; } +F32 LLControlGroup::getF32(const std::string& name) { return 0.0f; } U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; } void LLControlGroup::setString(const std::string& name, const std::string& val) {} std::string LLControlGroup::getString(const std::string& name) { return "test_string"; } diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp index 445ec7aa344cd13f1f1903a8ed3bf262dea9f969..217889c39005fc151774b0d015d040571b041b02 100644 --- a/indra/newview/tests/llmediadataclient_test.cpp +++ b/indra/newview/tests/llmediadataclient_test.cpp @@ -152,12 +152,13 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject std::istringstream d(data); LLSDSerialize::fromXML(mRep, d); mNumBounceBacks = 0; + mDead = false; // std::cout << ll_pretty_print_sd(mRep) << std::endl; // std::cout << "ID: " << getID() << std::endl; } LLMediaDataClientObjectTest(const LLSD &rep) - : mRep(rep), mNumBounceBacks(0) {} + : mRep(rep), mNumBounceBacks(0), mDead(false) {} ~LLMediaDataClientObjectTest() { LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClientObjectTest" << LL_ENDL; } @@ -187,12 +188,18 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject virtual std::string getCapabilityUrl(const std::string &name) const { return mRep["cap_urls"][name]; } + virtual bool isDead() const + { return mDead; } + int getNumBounceBacks() const { return mNumBounceBacks; } + void markDead() + { mDead = true; } private: LLSD mRep; int mNumBounceBacks; + bool mDead; }; // This special timer delay should ensure that the timer will fire on the very @@ -497,5 +504,95 @@ namespace tut ensure("REF COUNT", o->getNumRefs(), 1); } - + template<> template<> + void mediadataclient_object_t::test<7>() + { + // Test LLMediaDataClient::isInQueue() + LOG_TEST(7); + + LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest( + _DATA(VALID_OBJECT_ID_1,"3.0","1.0")); + LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest( + _DATA(VALID_OBJECT_ID_2,"1.0","1.0")); + int num_refs_start = o1->getNumRefs(); + { + LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); + + ensure("not in queue yet 1", ! mdc->isInQueue(o1)); + ensure("not in queue yet 2", ! mdc->isInQueue(o2)); + + mdc->fetchMedia(o1); + + ensure("is in queue", mdc->isInQueue(o1)); + ensure("is not in queue", ! mdc->isInQueue(o2)); + + ::pump_timers(); + + ensure("not in queue anymore", ! mdc->isInQueue(o1)); + ensure("still is not in queue", ! mdc->isInQueue(o2)); + + ensure("queue empty", mdc->isEmpty()); + } + + // Make sure everyone's destroyed properly + ensure("REF COUNT", o1->getNumRefs(), num_refs_start); + + } + + template<> template<> + void mediadataclient_object_t::test<8>() + { + // Test queue handling of objects that are marked dead. + LOG_TEST(8); + + LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","1.0")); + LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","1.0")); + LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","1.0")); + LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","1.0")); + { + LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); + + // queue up all 4 objects + mdc->fetchMedia(o1); + mdc->fetchMedia(o2); + mdc->fetchMedia(o3); + mdc->fetchMedia(o4); + + // and mark the second and fourth ones dead. + dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o2))->markDead(); + dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o4))->markDead(); + + ensure("is in queue 1", mdc->isInQueue(o1)); + ensure("is in queue 2", mdc->isInQueue(o2)); + ensure("is in queue 3", mdc->isInQueue(o3)); + ensure("is in queue 4", mdc->isInQueue(o4)); + ensure("post records", gPostRecords->size(), 0); + + ::pump_timers(); + + // The first tick should remove the first one + ensure("is not in queue 1", !mdc->isInQueue(o1)); + ensure("is in queue 2", mdc->isInQueue(o2)); + ensure("is in queue 3", mdc->isInQueue(o3)); + ensure("is in queue 4", mdc->isInQueue(o4)); + ensure("post records", gPostRecords->size(), 1); + + ::pump_timers(); + + // The second tick should skip the second and remove the third + ensure("is not in queue 2", !mdc->isInQueue(o2)); + ensure("is not in queue 3", !mdc->isInQueue(o3)); + ensure("is in queue 4", mdc->isInQueue(o4)); + ensure("post records", gPostRecords->size(), 2); + + ::pump_timers(); + + // The third tick should skip the fourth one and empty the queue. + ensure("is not in queue 4", !mdc->isInQueue(o4)); + ensure("post records", gPostRecords->size(), 2); + + ensure("queue empty", mdc->isEmpty()); + } + + } } diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index b85d31d1ac6563ce26a12340afd982688fea8a39..4193343d64f56fb499472a66db3bc735d9153171 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -221,18 +221,33 @@ def disable_manifest_check(self): def construct(self): super(WindowsManifest, self).construct() + + self.enable_crt_manifest_check() + # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) - self.enable_crt_manifest_check() # Plugin host application self.path(os.path.join(os.pardir, 'llplugin', 'slplugin', self.args['configuration'], "slplugin.exe"), "slplugin.exe") - # need to get the llcommon.dll from the build directory as well - if self.prefix(src=self.args['configuration'], dst=""): + self.disable_manifest_check() + + # Get shared libs from the shared libs staging directory + if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), + dst=""): + + self.enable_crt_manifest_check() + + # Get kdu dll, continue if missing. + try: + self.path('llkdu.dll', dst='llkdu.dll') + except RuntimeError: + print "Skipping llkdu.dll" + + # Get llcommon and deps. If missing assume static linkage and continue. try: self.path('llcommon.dll') self.path('libapr-1.dll') @@ -242,22 +257,41 @@ def construct(self): print err.message print "Skipping llcommon.dll (assuming llcommon was linked statically)" - self.end_prefix() - - # need to get the kdu dll from the build directory as well - try: - self.path('%s/llkdu.dll' % self.args['configuration'], dst='llkdu.dll') - except RuntimeError: - print "Skipping llkdu.dll" - - self.disable_manifest_check() + self.disable_manifest_check() - # For textures - if self.prefix(src=self.args['configuration'], dst=""): - if(self.args['configuration'].lower() == 'debug'): + # For textures + if self.args['configuration'].lower() == 'debug': self.path("openjpegd.dll") else: self.path("openjpeg.dll") + + # These need to be installed as a SxS assembly, currently a 'private' assembly. + # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx + if self.args['configuration'].lower() == 'debug': + self.path("msvcr80d.dll") + self.path("msvcp80d.dll") + self.path("Microsoft.VC80.DebugCRT.manifest") + else: + self.path("msvcr80.dll") + self.path("msvcp80.dll") + self.path("Microsoft.VC80.CRT.manifest") + + # Vivox runtimes + self.path("SLVoice.exe") + self.path("alut.dll") + self.path("vivoxsdk.dll") + self.path("ortp.dll") + self.path("wrap_oal.dll") + + # For google-perftools tcmalloc allocator. + try: + if self.args['configuration'].lower() == 'debug': + self.path('libtcmalloc_minimal-debug.dll') + else: + self.path('libtcmalloc_minimal.dll') + except: + print "Skipping libtcmalloc_minimal.dll" + self.end_prefix() self.path(src="licenses-win32.txt", dst="licenses.txt") @@ -270,6 +304,7 @@ def construct(self): self.path("fmod.dll") self.enable_no_crt_manifest_check() + # Media plugins - QuickTime if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"): self.path("media_plugin_quicktime.dll") @@ -302,28 +337,6 @@ def construct(self): self.disable_manifest_check() - # These need to be installed as a SxS assembly, currently a 'private' assembly. - # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx - if self.prefix(src=self.args['configuration'], dst=""): - if self.args['configuration'] == 'Debug': - self.path("msvcr80d.dll") - self.path("msvcp80d.dll") - self.path("Microsoft.VC80.DebugCRT.manifest") - else: - self.path("msvcr80.dll") - self.path("msvcp80.dll") - self.path("Microsoft.VC80.CRT.manifest") - self.end_prefix() - - # Vivox runtimes - if self.prefix(src=self.args['configuration'], dst=""): - self.path("SLVoice.exe") - self.path("alut.dll") - self.path("vivoxsdk.dll") - self.path("ortp.dll") - self.path("wrap_oal.dll") - self.end_prefix() - # pull in the crash logger and updater from other projects # tag:"crash-logger" here as a cue to the exporter self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], @@ -331,17 +344,6 @@ def construct(self): self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'], dst="updater.exe") - # For google-perftools tcmalloc allocator. - if self.prefix(src=self.args['configuration'], dst=""): - try: - if self.args['configuration'] == 'Debug': - self.path('libtcmalloc_minimal-debug.dll') - else: - self.path('libtcmalloc_minimal.dll') - except: - print "Skipping libtcmalloc_minimal.dll" - self.end_prefix() - def nsi_file_commands(self, install=True): def wpath(path): if path.endswith('/') or path.endswith(os.path.sep): diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt index 53b981cccdebf88cea6d1c09e5daa42c7e94dd30..0011daaec6e9b36f36e579690000cb5364d6bd05 100644 --- a/indra/test_apps/llplugintest/CMakeLists.txt +++ b/indra/test_apps/llplugintest/CMakeLists.txt @@ -7,6 +7,7 @@ include(FindOpenGL) include(LLCommon) include(LLPlugin) include(Linking) +include(LLSharedLibs) include(PluginAPI) include(LLImage) include(LLMath) @@ -324,27 +325,7 @@ if (DARWIN) make_directory ${PLUGINS_DESTINATION_DIR} COMMENT "Creating Resources directory in app bundle." - ) - - # copy the llcommon dylib and its dependencies to Contents/Resources. - get_target_property(BUILT_LLCOMMON llcommon LOCATION) - add_custom_command(TARGET llmediaplugintest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${PLUGINS_DESTINATION_DIR} - DEPENDS ${BUILT_LLCOMMON} - ) - # FIXME: these paths should come from somewhere reliable. The canonical list seems to be in indra/newview/viewer_manifest.py - add_custom_command(TARGET llmediaplugintest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.0.3.7.dylib ${PLUGINS_DESTINATION_DIR} - DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.0.3.7.dylib - ) - add_custom_command(TARGET llmediaplugintest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.0.3.8.dylib ${PLUGINS_DESTINATION_DIR} - DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.0.3.8.dylib - ) - add_custom_command(TARGET llmediaplugintest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.0.5.0.dylib ${PLUGINS_DESTINATION_DIR} - DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.0.5.0.dylib - ) + ) else (DARWIN) set(PLUGINS_DESTINATION_DIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/ @@ -497,22 +478,14 @@ if(WINDOWS) ${plugintest_release_files} ) set(plugin_test_targets ${plugin_test_targets} ${out_targets}) - - copy_if_different( - "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" - "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}" - out_targets - llcommon.dll libapr-1.dll libaprutil-1.dll libapriconv-1.dll - ) - set(plugin_test_targets ${plugin_test_targets} ${out_targets}) - - add_custom_target(copy_plugintest_libs ALL - DEPENDS - ${plugin_test_targets} - llcommon - ) + + add_custom_target(copy_plugintest_libs ALL + DEPENDS + ${plugin_test_targets} + ) add_dependencies(llmediaplugintest copy_plugintest_libs) endif(WINDOWS) +ll_deploy_sharedlibs_command(llmediaplugintest) diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index d987915bb8b0a7772a83591f6aeaa0ecd2e4fc49..27cb52a507fecef9d60a4a242f72381936a56547 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -197,7 +197,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind { LLError::initForApplication("."); LLError::setDefaultLevel(LLError::LEVEL_INFO); -// LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG); + //LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG); } // lots of randomness in this app @@ -223,7 +223,6 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind resetView(); // initial media panel - const int num_initial_panels = 1; for( int i = 0; i < num_initial_panels; ++i ) { @@ -1460,6 +1459,9 @@ std::string LLMediaPluginTest::mimeTypeFromUrl( std::string& url ) if ( url.find( ".txt" ) != std::string::npos ) // Apple Text descriptors mime_type = "video/quicktime"; else + if ( url.find( ".mp3" ) != std::string::npos ) // Apple Text descriptors + mime_type = "video/quicktime"; + else if ( url.find( "example://" ) != std::string::npos ) // Example plugin mime_type = "example/example"; diff --git a/indra/tools/vstool/README.txt b/indra/tools/vstool/README.txt index 6f64aa41df08c227e0ef421d53fc260b83bf8293..e4191800312f49e8906997534d3ed4ac603d2341 100644 --- a/indra/tools/vstool/README.txt +++ b/indra/tools/vstool/README.txt @@ -1,9 +1,9 @@ -VSTool is a command line utility to manipulate VisualStudio settings. - -The windows cmake project configuration uses VSTool.exe - -A handy upgrade: - figure out how to make cmake build this csharp app - - or write the app using script (jscript?!?) so it doesn't need to be built. - - +VSTool is a command line utility to manipulate VisualStudio settings. + +The windows cmake project configuration uses VSTool.exe + +A handy upgrade: + figure out how to make cmake build this csharp app + - or write the app using script (jscript?!?) so it doesn't need to be built. + + diff --git a/indra/tools/vstool/VSTool.csproj b/indra/tools/vstool/VSTool.csproj index 5d8764b6bffde9415aa5d0fb326ea949bc4d884c..24f1031f81b6151db8ea20628ee974ff35d18626 100644 --- a/indra/tools/vstool/VSTool.csproj +++ b/indra/tools/vstool/VSTool.csproj @@ -1,95 +1,95 @@ -<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <ProjectType>Local</ProjectType> - <ProductVersion>8.0.50727</ProductVersion> - <SchemaVersion>2.0</SchemaVersion> - <ProjectGuid>{96943E2D-1373-4617-A117-D0F997A94919}</ProjectGuid> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ApplicationIcon> - </ApplicationIcon> - <AssemblyKeyContainerName> - </AssemblyKeyContainerName> - <AssemblyName>VSTool</AssemblyName> - <AssemblyOriginatorKeyFile> - </AssemblyOriginatorKeyFile> - <DefaultClientScript>JScript</DefaultClientScript> - <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout> - <DefaultTargetSchema>IE50</DefaultTargetSchema> - <DelaySign>false</DelaySign> - <OutputType>Exe</OutputType> - <RootNamespace>VSTool</RootNamespace> - <RunPostBuildEvent>Always</RunPostBuildEvent> - <StartupObject>VSTool.VSToolMain</StartupObject> - <FileUpgradeFlags> - </FileUpgradeFlags> - <UpgradeBackupLocation> - </UpgradeBackupLocation> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> - <OutputPath>.\</OutputPath> - <AllowUnsafeBlocks>false</AllowUnsafeBlocks> - <BaseAddress>285212672</BaseAddress> - <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> - <ConfigurationOverrideFile> - </ConfigurationOverrideFile> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <DocumentationFile> - </DocumentationFile> - <DebugSymbols>true</DebugSymbols> - <FileAlignment>4096</FileAlignment> - <NoStdLib>false</NoStdLib> - <NoWarn> - </NoWarn> - <Optimize>false</Optimize> - <RegisterForComInterop>false</RegisterForComInterop> - <RemoveIntegerChecks>false</RemoveIntegerChecks> - <TreatWarningsAsErrors>false</TreatWarningsAsErrors> - <WarningLevel>4</WarningLevel> - <DebugType>full</DebugType> - <ErrorReport>prompt</ErrorReport> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> - <OutputPath>.\</OutputPath> - <AllowUnsafeBlocks>false</AllowUnsafeBlocks> - <BaseAddress>285212672</BaseAddress> - <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> - <ConfigurationOverrideFile> - </ConfigurationOverrideFile> - <DefineConstants>TRACE</DefineConstants> - <DocumentationFile> - </DocumentationFile> - <DebugSymbols>false</DebugSymbols> - <FileAlignment>4096</FileAlignment> - <NoStdLib>false</NoStdLib> - <NoWarn> - </NoWarn> - <Optimize>true</Optimize> - <RegisterForComInterop>false</RegisterForComInterop> - <RemoveIntegerChecks>false</RemoveIntegerChecks> - <TreatWarningsAsErrors>false</TreatWarningsAsErrors> - <WarningLevel>4</WarningLevel> - <DebugType>none</DebugType> - <ErrorReport>prompt</ErrorReport> - </PropertyGroup> - <ItemGroup> - <Reference Include="System"> - <Name>System</Name> - </Reference> - <Reference Include="System.Data"> - <Name>System.Data</Name> - </Reference> - </ItemGroup> - <ItemGroup> - <Compile Include="main.cs"> - <SubType>Code</SubType> - </Compile> - </ItemGroup> - <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> - <PropertyGroup> - <PreBuildEvent> - </PreBuildEvent> - <PostBuildEvent> - </PostBuildEvent> - </PropertyGroup> +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectType>Local</ProjectType> + <ProductVersion>8.0.50727</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{96943E2D-1373-4617-A117-D0F997A94919}</ProjectGuid> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ApplicationIcon> + </ApplicationIcon> + <AssemblyKeyContainerName> + </AssemblyKeyContainerName> + <AssemblyName>VSTool</AssemblyName> + <AssemblyOriginatorKeyFile> + </AssemblyOriginatorKeyFile> + <DefaultClientScript>JScript</DefaultClientScript> + <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout> + <DefaultTargetSchema>IE50</DefaultTargetSchema> + <DelaySign>false</DelaySign> + <OutputType>Exe</OutputType> + <RootNamespace>VSTool</RootNamespace> + <RunPostBuildEvent>Always</RunPostBuildEvent> + <StartupObject>VSTool.VSToolMain</StartupObject> + <FileUpgradeFlags> + </FileUpgradeFlags> + <UpgradeBackupLocation> + </UpgradeBackupLocation> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <OutputPath>.\</OutputPath> + <AllowUnsafeBlocks>false</AllowUnsafeBlocks> + <BaseAddress>285212672</BaseAddress> + <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> + <ConfigurationOverrideFile> + </ConfigurationOverrideFile> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <DocumentationFile> + </DocumentationFile> + <DebugSymbols>true</DebugSymbols> + <FileAlignment>4096</FileAlignment> + <NoStdLib>false</NoStdLib> + <NoWarn> + </NoWarn> + <Optimize>false</Optimize> + <RegisterForComInterop>false</RegisterForComInterop> + <RemoveIntegerChecks>false</RemoveIntegerChecks> + <TreatWarningsAsErrors>false</TreatWarningsAsErrors> + <WarningLevel>4</WarningLevel> + <DebugType>full</DebugType> + <ErrorReport>prompt</ErrorReport> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <OutputPath>.\</OutputPath> + <AllowUnsafeBlocks>false</AllowUnsafeBlocks> + <BaseAddress>285212672</BaseAddress> + <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> + <ConfigurationOverrideFile> + </ConfigurationOverrideFile> + <DefineConstants>TRACE</DefineConstants> + <DocumentationFile> + </DocumentationFile> + <DebugSymbols>false</DebugSymbols> + <FileAlignment>4096</FileAlignment> + <NoStdLib>false</NoStdLib> + <NoWarn> + </NoWarn> + <Optimize>true</Optimize> + <RegisterForComInterop>false</RegisterForComInterop> + <RemoveIntegerChecks>false</RemoveIntegerChecks> + <TreatWarningsAsErrors>false</TreatWarningsAsErrors> + <WarningLevel>4</WarningLevel> + <DebugType>none</DebugType> + <ErrorReport>prompt</ErrorReport> + </PropertyGroup> + <ItemGroup> + <Reference Include="System"> + <Name>System</Name> + </Reference> + <Reference Include="System.Data"> + <Name>System.Data</Name> + </Reference> + </ItemGroup> + <ItemGroup> + <Compile Include="main.cs"> + <SubType>Code</SubType> + </Compile> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> + <PropertyGroup> + <PreBuildEvent> + </PreBuildEvent> + <PostBuildEvent> + </PostBuildEvent> + </PropertyGroup> </Project> \ No newline at end of file diff --git a/indra/tools/vstool/VSTool.sln b/indra/tools/vstool/VSTool.sln index 543a0a2efcfaea9bc9fc14f8bc93ce0f07f8b56d..88596718028cca0ba134e2b2cf11ba6c5a81cbdf 100644 --- a/indra/tools/vstool/VSTool.sln +++ b/indra/tools/vstool/VSTool.sln @@ -1,19 +1,19 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/indra/tools/vstool/main.cs b/indra/tools/vstool/main.cs index 5c41c916e2e34bcab3859a37b25f5204cad71789..cc268d59d98f5b8a9b5be55d6dfa39bc3e0b0d73 100644 --- a/indra/tools/vstool/main.cs +++ b/indra/tools/vstool/main.cs @@ -1,711 +1,711 @@ -// Code about getting running instances visual studio -// was borrowed from -// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx - - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.ComTypes; -using Microsoft.CSharp; - -namespace VSTool -{ - // The MessageFilter class comes from: - // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx - // It allows vstool to get timing error messages from - // visualstudio and handle them. - public class MessageFilter : IOleMessageFilter - { - // - // Class containing the IOleMessageFilter - // thread error-handling functions. - - // Start the filter. - public static void Register() - { - IOleMessageFilter newFilter = new MessageFilter(); - IOleMessageFilter oldFilter = null; - CoRegisterMessageFilter(newFilter, out oldFilter); - } - - // Done with the filter, close it. - public static void Revoke() - { - IOleMessageFilter oldFilter = null; - CoRegisterMessageFilter(null, out oldFilter); - } - - // - // IOleMessageFilter functions. - // Handle incoming thread requests. - int IOleMessageFilter.HandleInComingCall(int dwCallType, - System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr - lpInterfaceInfo) - { - //Return the flag SERVERCALL_ISHANDLED. - return 0; - } - - // Thread call was rejected, so try again. - int IOleMessageFilter.RetryRejectedCall(System.IntPtr - hTaskCallee, int dwTickCount, int dwRejectType) - { - if (dwRejectType == 2) - // flag = SERVERCALL_RETRYLATER. - { - // Retry the thread call immediately if return >=0 & - // <100. - return 99; - } - // Too busy; cancel call. - return -1; - } - - int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, - int dwTickCount, int dwPendingType) - { - //Return the flag PENDINGMSG_WAITDEFPROCESS. - return 2; - } - - // Implement the IOleMessageFilter interface. - [DllImport("Ole32.dll")] - private static extern int - CoRegisterMessageFilter(IOleMessageFilter newFilter, out - IOleMessageFilter oldFilter); - } - - [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), - InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - interface IOleMessageFilter - { - [PreserveSig] - int HandleInComingCall( - int dwCallType, - IntPtr hTaskCaller, - int dwTickCount, - IntPtr lpInterfaceInfo); - - [PreserveSig] - int RetryRejectedCall( - IntPtr hTaskCallee, - int dwTickCount, - int dwRejectType); - - [PreserveSig] - int MessagePending( - IntPtr hTaskCallee, - int dwTickCount, - int dwPendingType); - } - - class ViaCOM - { - public static object GetProperty(object from_obj, string prop_name) - { - try - { - Type objType = from_obj.GetType(); - return objType.InvokeMember( - prop_name, - BindingFlags.GetProperty, null, - from_obj, - null); - } - catch (Exception e) - { - Console.WriteLine("Error getting property: \"{0}\"", prop_name); - Console.WriteLine(e.Message); - throw e; - } - } - - public static object SetProperty(object from_obj, string prop_name, object new_value) - { - try - { - object[] args = { new_value }; - Type objType = from_obj.GetType(); - return objType.InvokeMember( - prop_name, - BindingFlags.DeclaredOnly | - BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.Instance | - BindingFlags.SetProperty, - null, - from_obj, - args); - } - catch (Exception e) - { - Console.WriteLine("Error setting property: \"{0}\"", prop_name); - Console.WriteLine(e.Message); - throw e; - } - } - - public static object CallMethod(object from_obj, string method_name, params object[] args) - { - try - { - Type objType = from_obj.GetType(); - return objType.InvokeMember( - method_name, - BindingFlags.DeclaredOnly | - BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.Instance | - BindingFlags.InvokeMethod, - null, - from_obj, - args); - } - catch (Exception e) - { - Console.WriteLine("Error calling method \"{0}\"", method_name); - Console.WriteLine(e.Message); - throw e; - } - } - }; - - /// <summary> - /// The main entry point class for VSTool. - /// </summary> - class VSToolMain - { - #region Interop imports - [DllImport("ole32.dll")] - public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); - - [DllImport("ole32.dll")] - public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); - #endregion - - static System.Boolean ignore_case = true; - - static string solution_name = null; - static bool use_new_vs = false; - static Hashtable projectDict = new Hashtable(); - static string startup_project = null; - static string config = null; - - static object dte = null; - static object solution = null; - - /// <summary> - /// The main entry point for the application. - /// </summary> - [STAThread] - static int Main(string[] args) - { - int retVal = 0; - bool need_save = false; - - try - { - parse_command_line(args); - - Console.WriteLine("Editing solution: {0}", solution_name); - - bool found_open_solution = GetDTEAndSolution(); - - if (dte == null || solution == null) - { - retVal = 1; - } - else - { - MessageFilter.Register(); - - // Walk through all of the projects in the solution - // and list the type of each project. - foreach (DictionaryEntry p in projectDict) - { - string project_name = (string)p.Key; - string working_dir = (string)p.Value; - if (SetProjectWorkingDir(solution, project_name, working_dir)) - { - need_save = true; - } - } - - if (config != null) - { - need_save = SetActiveConfig(config); - } - - if (startup_project != null) - { - need_save = SetStartupProject(startup_project); - } - - if (need_save) - { - if (found_open_solution == false) - { - ViaCOM.CallMethod(solution, "Close", null); - } - } - } - } - catch (Exception e) - { - Console.WriteLine(e.Message); - retVal = 1; - } - finally - { - if (solution != null) - { - Marshal.ReleaseComObject(solution); - solution = null; - } - - if (dte != null) - { - Marshal.ReleaseComObject(dte); - dte = null; - } - - MessageFilter.Revoke(); - } - return retVal; - } - - public static bool parse_command_line(string[] args) - { - string options_desc = - "--solution <solution_name> : MSVC solution name. (required)\n" + - "--use_new_vs : Ignore running versions of visual studio.\n" + - "--workingdir <project> <dir> : Set working dir of a VC project.\n" + - "--config <config> : Set the active config for the solution.\n" + - "--startup <project> : Set the startup project for the solution.\n"; - - try - { - // Command line param parsing loop. - int i = 0; - for (; i < args.Length; ++i) - { - if ("--solution" == args[i]) - { - if (solution_name != null) - { - throw new ApplicationException("Found second --solution option"); - } - solution_name = args[++i]; - } - else if ("--use_new_vs" == args[i]) - { - use_new_vs = true; - } - - else if ("--workingdir" == args[i]) - { - string project_name = args[++i]; - string working_dir = args[++i]; - projectDict.Add(project_name, working_dir); - } - else if ("--config" == args[i]) - { - if (config != null) - { - throw new ApplicationException("Found second --config option"); - } - config = args[++i]; - } - else if ("--startup" == args[i]) - { - if (startup_project != null) - { - throw new ApplicationException("Found second --startup option"); - } - startup_project = args[++i]; - } - else - { - throw new ApplicationException("Found unrecognized token on command line: " + args[i]); - } - } - - if (solution_name == null) - { - throw new ApplicationException("The --solution option is required."); - } - } - catch(ApplicationException e) - { - - Console.WriteLine("Oops! " + e.Message); - Console.Write("Command line:"); - foreach (string arg in args) - { - Console.Write(" " + arg); - } - Console.Write("\n\n"); - Console.WriteLine("VSTool command line usage"); - Console.Write(options_desc); - throw e; - } - return true; - } - - public static bool GetDTEAndSolution() - { - bool found_open_solution = true; - - Console.WriteLine("Looking for existing VisualStudio instance..."); - - // Get an instance of the currently running Visual Studio .NET IDE. - // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1"); - string full_solution_name = System.IO.Path.GetFullPath(solution_name); - if (false == use_new_vs) - { - dte = GetIDEInstance(full_solution_name); - } - - if (dte == null) - { - try - { - Console.WriteLine(" Didn't find open solution, starting new background VisualStudio instance..."); - Console.WriteLine(" Reading .sln file version..."); - string version = GetSolutionVersion(full_solution_name); - - Console.WriteLine(" Using version: {0}...", version); - string progid = GetVSProgID(version); - - Type objType = Type.GetTypeFromProgID(progid); - dte = System.Activator.CreateInstance(objType); - Console.WriteLine(" Reading solution: \"{0}\"", full_solution_name); - - solution = ViaCOM.GetProperty(dte, "Solution"); - object[] openArgs = { full_solution_name }; - ViaCOM.CallMethod(solution, "Open", openArgs); - } - catch (Exception e) - { - Console.WriteLine(e.Message); - Console.WriteLine("Quitting do to error opening: {0}", full_solution_name); - solution = null; - dte = null; - return found_open_solution; - } - found_open_solution = false; - } - - if (solution == null) - { - solution = ViaCOM.GetProperty(dte, "Solution"); - } - - return found_open_solution; - } - - /// <summary> - /// Get the DTE object for the instance of Visual Studio IDE that has - /// the specified solution open. - /// </summary> - /// <param name="solutionFile">The absolute filename of the solution</param> - /// <returns>Corresponding DTE object or null if no such IDE is running</returns> - public static object GetIDEInstance( string solutionFile ) - { - Hashtable runningInstances = GetIDEInstances( true ); - IDictionaryEnumerator enumerator = runningInstances.GetEnumerator(); - - while ( enumerator.MoveNext() ) - { - try - { - object ide = enumerator.Value; - if (ide != null) - { - object sol = ViaCOM.GetProperty(ide, "Solution"); - if (0 == string.Compare((string)ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case)) - { - return ide; - } - } - } - catch{} - } - - return null; - } - - /// <summary> - /// Get a table of the currently running instances of the Visual Studio .NET IDE. - /// </summary> - /// <param name="openSolutionsOnly">Only return instances that have opened a solution</param> - /// <returns>A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object</returns> - public static Hashtable GetIDEInstances( bool openSolutionsOnly ) - { - Hashtable runningIDEInstances = new Hashtable(); - Hashtable runningObjects = GetRunningObjectTable(); - - IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator(); - while ( rotEnumerator.MoveNext() ) - { - string candidateName = (string) rotEnumerator.Key; - if (!candidateName.StartsWith("!VisualStudio.DTE")) - continue; - - object ide = rotEnumerator.Value; - if (ide == null) - continue; - - if (openSolutionsOnly) - { - try - { - object sol = ViaCOM.GetProperty(ide, "Solution"); - string solutionFile = (string)ViaCOM.GetProperty(sol, "FullName"); - if (solutionFile != String.Empty) - { - runningIDEInstances[ candidateName ] = ide; - } - } - catch {} - } - else - { - runningIDEInstances[ candidateName ] = ide; - } - } - return runningIDEInstances; - } - - /// <summary> - /// Get a snapshot of the running object table (ROT). - /// </summary> - /// <returns>A hashtable mapping the name of the object in the ROT to the corresponding object</returns> - [STAThread] - public static Hashtable GetRunningObjectTable() - { - Hashtable result = new Hashtable(); - - int numFetched = 0; - IRunningObjectTable runningObjectTable; - IEnumMoniker monikerEnumerator; - IMoniker[] monikers = new IMoniker[1]; - - GetRunningObjectTable(0, out runningObjectTable); - runningObjectTable.EnumRunning(out monikerEnumerator); - monikerEnumerator.Reset(); - - while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0) - { - IBindCtx ctx; - CreateBindCtx(0, out ctx); - - string runningObjectName; - monikers[0].GetDisplayName(ctx, null, out runningObjectName); - - object runningObjectVal; - runningObjectTable.GetObject( monikers[0], out runningObjectVal); - - result[ runningObjectName ] = runningObjectVal; - } - - return result; - } - - public static string GetSolutionVersion(string solutionFullFileName) - { - string version; - System.IO.StreamReader solutionStreamReader = null; - string firstLine; - string format; - - try - { - solutionStreamReader = new System.IO.StreamReader(solutionFullFileName); - do - { - firstLine = solutionStreamReader.ReadLine(); - } - while (firstLine == ""); - - format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim(); - - switch(format) - { - case "7.00": - version = "VC70"; - break; - - case "8.00": - version = "VC71"; - break; - - case "9.00": - version = "VC80"; - break; - - case "10.00": - version = "VC90"; - break; - default: - throw new ApplicationException("Unknown .sln version: " + format); - } - } - finally - { - if(solutionStreamReader != null) - { - solutionStreamReader.Close(); - } - } - - return version; - } - - public static string GetVSProgID(string version) - { - string progid = null; - switch(version) - { - case "VC70": - progid = "VisualStudio.DTE.7"; - break; - - case "VC71": - progid = "VisualStudio.DTE.7.1"; - break; - - case "VC80": - progid = "VisualStudio.DTE.8.0"; - break; - - case "VC90": - progid = "VisualStudio.DTE.9.0"; - break; - default: - throw new ApplicationException("Can't handle VS version: " + version); - } - - return progid; - } - - public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir) - { - bool made_change = false; - Console.WriteLine("Looking for project {0}...", project_name); - try - { - object prjs = ViaCOM.GetProperty(sol, "Projects"); - object count = ViaCOM.GetProperty(prjs, "Count"); - for(int i = 1; i <= (int)count; ++i) - { - object[] prjItemArgs = { (object)i }; - object prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs); - string name = (string)ViaCOM.GetProperty(prj, "Name"); - if (0 == string.Compare(name, project_name, ignore_case)) - { - Console.WriteLine("Found project: {0}", project_name); - Console.WriteLine("Setting working directory"); - - string full_project_name = (string)ViaCOM.GetProperty(prj, "FullName"); - Console.WriteLine(full_project_name); - - // *NOTE:Mani Thanks to incompatibilities between different versions of the - // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to - // the VCProjectEngine types from a different version than the one built - // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built - // in VS 8.0. To avoid this problem, we can use the com object interfaces directly, - // without the type casting. Its tedious code, but it seems to work. - - // oCfgs should be assigned to a 'Project.Configurations' collection. - object oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations"); - - // oCount will be assigned to the number of configs present in oCfgs. - object oCount = ViaCOM.GetProperty(oCfgs, "Count"); - - for (int cfgIndex = 1; cfgIndex <= (int)oCount; ++cfgIndex) - { - object[] itemArgs = {(object)cfgIndex}; - object oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs); - object oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings"); - ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", (object)working_dir); - } - - break; - } - } - made_change = true; - } - catch( Exception e ) - { - Console.WriteLine(e.Message); - Console.WriteLine("Failed to set working dir for project, {0}.", project_name); - } - - return made_change; - } - - public static bool SetStartupProject(string startup_project) - { - bool result = false; - try - { - // You need the 'unique name of the project to set StartupProjects. - // find the project by generic name. - Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project); - object prjs = ViaCOM.GetProperty(solution, "Projects"); - object count = ViaCOM.GetProperty(prjs, "Count"); - for (int i = 1; i <= (int)count; ++i) - { - object[] itemArgs = { (object)i }; - object prj = ViaCOM.CallMethod(prjs, "Item", itemArgs); - object prjName = ViaCOM.GetProperty(prj, "Name"); - if (0 == string.Compare((string)prjName, startup_project, ignore_case)) - { - object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); - ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName")); - Console.WriteLine(" Success!"); - result = true; - break; - } - } - - if (result == false) - { - Console.WriteLine(" Could not find project \"{0}\" in the solution.", startup_project); - } - } - catch (Exception e) - { - Console.WriteLine(" Failed to set the startup project!"); - Console.WriteLine(e.Message); - } - return result; - } - - public static bool SetActiveConfig(string config) - { - bool result = false; - try - { - Console.WriteLine("Trying to set active config to \"{0}\"", config); - object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); - object solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations"); - object[] itemArgs = { (object)config }; - object solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs); - ViaCOM.CallMethod(solCfg, "Activate", null); - Console.WriteLine(" Success!"); - result = true; - } - catch (Exception e) - { - Console.WriteLine(" Failed to set \"{0}\" as the active config.", config); - Console.WriteLine(e.Message); - } - return result; - } - } -} +// Code about getting running instances visual studio +// was borrowed from +// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using Microsoft.CSharp; + +namespace VSTool +{ + // The MessageFilter class comes from: + // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx + // It allows vstool to get timing error messages from + // visualstudio and handle them. + public class MessageFilter : IOleMessageFilter + { + // + // Class containing the IOleMessageFilter + // thread error-handling functions. + + // Start the filter. + public static void Register() + { + IOleMessageFilter newFilter = new MessageFilter(); + IOleMessageFilter oldFilter = null; + CoRegisterMessageFilter(newFilter, out oldFilter); + } + + // Done with the filter, close it. + public static void Revoke() + { + IOleMessageFilter oldFilter = null; + CoRegisterMessageFilter(null, out oldFilter); + } + + // + // IOleMessageFilter functions. + // Handle incoming thread requests. + int IOleMessageFilter.HandleInComingCall(int dwCallType, + System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr + lpInterfaceInfo) + { + //Return the flag SERVERCALL_ISHANDLED. + return 0; + } + + // Thread call was rejected, so try again. + int IOleMessageFilter.RetryRejectedCall(System.IntPtr + hTaskCallee, int dwTickCount, int dwRejectType) + { + if (dwRejectType == 2) + // flag = SERVERCALL_RETRYLATER. + { + // Retry the thread call immediately if return >=0 & + // <100. + return 99; + } + // Too busy; cancel call. + return -1; + } + + int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, + int dwTickCount, int dwPendingType) + { + //Return the flag PENDINGMSG_WAITDEFPROCESS. + return 2; + } + + // Implement the IOleMessageFilter interface. + [DllImport("Ole32.dll")] + private static extern int + CoRegisterMessageFilter(IOleMessageFilter newFilter, out + IOleMessageFilter oldFilter); + } + + [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + interface IOleMessageFilter + { + [PreserveSig] + int HandleInComingCall( + int dwCallType, + IntPtr hTaskCaller, + int dwTickCount, + IntPtr lpInterfaceInfo); + + [PreserveSig] + int RetryRejectedCall( + IntPtr hTaskCallee, + int dwTickCount, + int dwRejectType); + + [PreserveSig] + int MessagePending( + IntPtr hTaskCallee, + int dwTickCount, + int dwPendingType); + } + + class ViaCOM + { + public static object GetProperty(object from_obj, string prop_name) + { + try + { + Type objType = from_obj.GetType(); + return objType.InvokeMember( + prop_name, + BindingFlags.GetProperty, null, + from_obj, + null); + } + catch (Exception e) + { + Console.WriteLine("Error getting property: \"{0}\"", prop_name); + Console.WriteLine(e.Message); + throw e; + } + } + + public static object SetProperty(object from_obj, string prop_name, object new_value) + { + try + { + object[] args = { new_value }; + Type objType = from_obj.GetType(); + return objType.InvokeMember( + prop_name, + BindingFlags.DeclaredOnly | + BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.Instance | + BindingFlags.SetProperty, + null, + from_obj, + args); + } + catch (Exception e) + { + Console.WriteLine("Error setting property: \"{0}\"", prop_name); + Console.WriteLine(e.Message); + throw e; + } + } + + public static object CallMethod(object from_obj, string method_name, params object[] args) + { + try + { + Type objType = from_obj.GetType(); + return objType.InvokeMember( + method_name, + BindingFlags.DeclaredOnly | + BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.Instance | + BindingFlags.InvokeMethod, + null, + from_obj, + args); + } + catch (Exception e) + { + Console.WriteLine("Error calling method \"{0}\"", method_name); + Console.WriteLine(e.Message); + throw e; + } + } + }; + + /// <summary> + /// The main entry point class for VSTool. + /// </summary> + class VSToolMain + { + #region Interop imports + [DllImport("ole32.dll")] + public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); + + [DllImport("ole32.dll")] + public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); + #endregion + + static System.Boolean ignore_case = true; + + static string solution_name = null; + static bool use_new_vs = false; + static Hashtable projectDict = new Hashtable(); + static string startup_project = null; + static string config = null; + + static object dte = null; + static object solution = null; + + /// <summary> + /// The main entry point for the application. + /// </summary> + [STAThread] + static int Main(string[] args) + { + int retVal = 0; + bool need_save = false; + + try + { + parse_command_line(args); + + Console.WriteLine("Editing solution: {0}", solution_name); + + bool found_open_solution = GetDTEAndSolution(); + + if (dte == null || solution == null) + { + retVal = 1; + } + else + { + MessageFilter.Register(); + + // Walk through all of the projects in the solution + // and list the type of each project. + foreach (DictionaryEntry p in projectDict) + { + string project_name = (string)p.Key; + string working_dir = (string)p.Value; + if (SetProjectWorkingDir(solution, project_name, working_dir)) + { + need_save = true; + } + } + + if (config != null) + { + need_save = SetActiveConfig(config); + } + + if (startup_project != null) + { + need_save = SetStartupProject(startup_project); + } + + if (need_save) + { + if (found_open_solution == false) + { + ViaCOM.CallMethod(solution, "Close", null); + } + } + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + retVal = 1; + } + finally + { + if (solution != null) + { + Marshal.ReleaseComObject(solution); + solution = null; + } + + if (dte != null) + { + Marshal.ReleaseComObject(dte); + dte = null; + } + + MessageFilter.Revoke(); + } + return retVal; + } + + public static bool parse_command_line(string[] args) + { + string options_desc = + "--solution <solution_name> : MSVC solution name. (required)\n" + + "--use_new_vs : Ignore running versions of visual studio.\n" + + "--workingdir <project> <dir> : Set working dir of a VC project.\n" + + "--config <config> : Set the active config for the solution.\n" + + "--startup <project> : Set the startup project for the solution.\n"; + + try + { + // Command line param parsing loop. + int i = 0; + for (; i < args.Length; ++i) + { + if ("--solution" == args[i]) + { + if (solution_name != null) + { + throw new ApplicationException("Found second --solution option"); + } + solution_name = args[++i]; + } + else if ("--use_new_vs" == args[i]) + { + use_new_vs = true; + } + + else if ("--workingdir" == args[i]) + { + string project_name = args[++i]; + string working_dir = args[++i]; + projectDict.Add(project_name, working_dir); + } + else if ("--config" == args[i]) + { + if (config != null) + { + throw new ApplicationException("Found second --config option"); + } + config = args[++i]; + } + else if ("--startup" == args[i]) + { + if (startup_project != null) + { + throw new ApplicationException("Found second --startup option"); + } + startup_project = args[++i]; + } + else + { + throw new ApplicationException("Found unrecognized token on command line: " + args[i]); + } + } + + if (solution_name == null) + { + throw new ApplicationException("The --solution option is required."); + } + } + catch(ApplicationException e) + { + + Console.WriteLine("Oops! " + e.Message); + Console.Write("Command line:"); + foreach (string arg in args) + { + Console.Write(" " + arg); + } + Console.Write("\n\n"); + Console.WriteLine("VSTool command line usage"); + Console.Write(options_desc); + throw e; + } + return true; + } + + public static bool GetDTEAndSolution() + { + bool found_open_solution = true; + + Console.WriteLine("Looking for existing VisualStudio instance..."); + + // Get an instance of the currently running Visual Studio .NET IDE. + // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1"); + string full_solution_name = System.IO.Path.GetFullPath(solution_name); + if (false == use_new_vs) + { + dte = GetIDEInstance(full_solution_name); + } + + if (dte == null) + { + try + { + Console.WriteLine(" Didn't find open solution, starting new background VisualStudio instance..."); + Console.WriteLine(" Reading .sln file version..."); + string version = GetSolutionVersion(full_solution_name); + + Console.WriteLine(" Using version: {0}...", version); + string progid = GetVSProgID(version); + + Type objType = Type.GetTypeFromProgID(progid); + dte = System.Activator.CreateInstance(objType); + Console.WriteLine(" Reading solution: \"{0}\"", full_solution_name); + + solution = ViaCOM.GetProperty(dte, "Solution"); + object[] openArgs = { full_solution_name }; + ViaCOM.CallMethod(solution, "Open", openArgs); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + Console.WriteLine("Quitting do to error opening: {0}", full_solution_name); + solution = null; + dte = null; + return found_open_solution; + } + found_open_solution = false; + } + + if (solution == null) + { + solution = ViaCOM.GetProperty(dte, "Solution"); + } + + return found_open_solution; + } + + /// <summary> + /// Get the DTE object for the instance of Visual Studio IDE that has + /// the specified solution open. + /// </summary> + /// <param name="solutionFile">The absolute filename of the solution</param> + /// <returns>Corresponding DTE object or null if no such IDE is running</returns> + public static object GetIDEInstance( string solutionFile ) + { + Hashtable runningInstances = GetIDEInstances( true ); + IDictionaryEnumerator enumerator = runningInstances.GetEnumerator(); + + while ( enumerator.MoveNext() ) + { + try + { + object ide = enumerator.Value; + if (ide != null) + { + object sol = ViaCOM.GetProperty(ide, "Solution"); + if (0 == string.Compare((string)ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case)) + { + return ide; + } + } + } + catch{} + } + + return null; + } + + /// <summary> + /// Get a table of the currently running instances of the Visual Studio .NET IDE. + /// </summary> + /// <param name="openSolutionsOnly">Only return instances that have opened a solution</param> + /// <returns>A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object</returns> + public static Hashtable GetIDEInstances( bool openSolutionsOnly ) + { + Hashtable runningIDEInstances = new Hashtable(); + Hashtable runningObjects = GetRunningObjectTable(); + + IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator(); + while ( rotEnumerator.MoveNext() ) + { + string candidateName = (string) rotEnumerator.Key; + if (!candidateName.StartsWith("!VisualStudio.DTE")) + continue; + + object ide = rotEnumerator.Value; + if (ide == null) + continue; + + if (openSolutionsOnly) + { + try + { + object sol = ViaCOM.GetProperty(ide, "Solution"); + string solutionFile = (string)ViaCOM.GetProperty(sol, "FullName"); + if (solutionFile != String.Empty) + { + runningIDEInstances[ candidateName ] = ide; + } + } + catch {} + } + else + { + runningIDEInstances[ candidateName ] = ide; + } + } + return runningIDEInstances; + } + + /// <summary> + /// Get a snapshot of the running object table (ROT). + /// </summary> + /// <returns>A hashtable mapping the name of the object in the ROT to the corresponding object</returns> + [STAThread] + public static Hashtable GetRunningObjectTable() + { + Hashtable result = new Hashtable(); + + int numFetched = 0; + IRunningObjectTable runningObjectTable; + IEnumMoniker monikerEnumerator; + IMoniker[] monikers = new IMoniker[1]; + + GetRunningObjectTable(0, out runningObjectTable); + runningObjectTable.EnumRunning(out monikerEnumerator); + monikerEnumerator.Reset(); + + while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0) + { + IBindCtx ctx; + CreateBindCtx(0, out ctx); + + string runningObjectName; + monikers[0].GetDisplayName(ctx, null, out runningObjectName); + + object runningObjectVal; + runningObjectTable.GetObject( monikers[0], out runningObjectVal); + + result[ runningObjectName ] = runningObjectVal; + } + + return result; + } + + public static string GetSolutionVersion(string solutionFullFileName) + { + string version; + System.IO.StreamReader solutionStreamReader = null; + string firstLine; + string format; + + try + { + solutionStreamReader = new System.IO.StreamReader(solutionFullFileName); + do + { + firstLine = solutionStreamReader.ReadLine(); + } + while (firstLine == ""); + + format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim(); + + switch(format) + { + case "7.00": + version = "VC70"; + break; + + case "8.00": + version = "VC71"; + break; + + case "9.00": + version = "VC80"; + break; + + case "10.00": + version = "VC90"; + break; + default: + throw new ApplicationException("Unknown .sln version: " + format); + } + } + finally + { + if(solutionStreamReader != null) + { + solutionStreamReader.Close(); + } + } + + return version; + } + + public static string GetVSProgID(string version) + { + string progid = null; + switch(version) + { + case "VC70": + progid = "VisualStudio.DTE.7"; + break; + + case "VC71": + progid = "VisualStudio.DTE.7.1"; + break; + + case "VC80": + progid = "VisualStudio.DTE.8.0"; + break; + + case "VC90": + progid = "VisualStudio.DTE.9.0"; + break; + default: + throw new ApplicationException("Can't handle VS version: " + version); + } + + return progid; + } + + public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir) + { + bool made_change = false; + Console.WriteLine("Looking for project {0}...", project_name); + try + { + object prjs = ViaCOM.GetProperty(sol, "Projects"); + object count = ViaCOM.GetProperty(prjs, "Count"); + for(int i = 1; i <= (int)count; ++i) + { + object[] prjItemArgs = { (object)i }; + object prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs); + string name = (string)ViaCOM.GetProperty(prj, "Name"); + if (0 == string.Compare(name, project_name, ignore_case)) + { + Console.WriteLine("Found project: {0}", project_name); + Console.WriteLine("Setting working directory"); + + string full_project_name = (string)ViaCOM.GetProperty(prj, "FullName"); + Console.WriteLine(full_project_name); + + // *NOTE:Mani Thanks to incompatibilities between different versions of the + // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to + // the VCProjectEngine types from a different version than the one built + // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built + // in VS 8.0. To avoid this problem, we can use the com object interfaces directly, + // without the type casting. Its tedious code, but it seems to work. + + // oCfgs should be assigned to a 'Project.Configurations' collection. + object oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations"); + + // oCount will be assigned to the number of configs present in oCfgs. + object oCount = ViaCOM.GetProperty(oCfgs, "Count"); + + for (int cfgIndex = 1; cfgIndex <= (int)oCount; ++cfgIndex) + { + object[] itemArgs = {(object)cfgIndex}; + object oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs); + object oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings"); + ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", (object)working_dir); + } + + break; + } + } + made_change = true; + } + catch( Exception e ) + { + Console.WriteLine(e.Message); + Console.WriteLine("Failed to set working dir for project, {0}.", project_name); + } + + return made_change; + } + + public static bool SetStartupProject(string startup_project) + { + bool result = false; + try + { + // You need the 'unique name of the project to set StartupProjects. + // find the project by generic name. + Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project); + object prjs = ViaCOM.GetProperty(solution, "Projects"); + object count = ViaCOM.GetProperty(prjs, "Count"); + for (int i = 1; i <= (int)count; ++i) + { + object[] itemArgs = { (object)i }; + object prj = ViaCOM.CallMethod(prjs, "Item", itemArgs); + object prjName = ViaCOM.GetProperty(prj, "Name"); + if (0 == string.Compare((string)prjName, startup_project, ignore_case)) + { + object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); + ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName")); + Console.WriteLine(" Success!"); + result = true; + break; + } + } + + if (result == false) + { + Console.WriteLine(" Could not find project \"{0}\" in the solution.", startup_project); + } + } + catch (Exception e) + { + Console.WriteLine(" Failed to set the startup project!"); + Console.WriteLine(e.Message); + } + return result; + } + + public static bool SetActiveConfig(string config) + { + bool result = false; + try + { + Console.WriteLine("Trying to set active config to \"{0}\"", config); + object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); + object solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations"); + object[] itemArgs = { (object)config }; + object solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs); + ViaCOM.CallMethod(solCfg, "Activate", null); + Console.WriteLine(" Success!"); + result = true; + } + catch (Exception e) + { + Console.WriteLine(" Failed to set \"{0}\" as the active config.", config); + Console.WriteLine(e.Message); + } + return result; + } + } +} diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index 7a30315b9a8c7c30b110f4c3f78bf84c1fe942f8..b14c59ab9ac1d702501ae9a26b1a92fe4619f69e 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -70,7 +70,7 @@ class LLLogin::Impl LLEventPump& getEventPump() { return mPump; } private: - void sendProgressEvent(const std::string& state, const std::string& change, + LLSD getProgressEventLLSD(const std::string& state, const std::string& change, const LLSD& data = LLSD()) { LLSD status_data; @@ -87,7 +87,13 @@ class LLLogin::Impl { status_data["data"] = data; } + return status_data; + } + void sendProgressEvent(const std::string& state, const std::string& change, + const LLSD& data = LLSD()) + { + LLSD status_data = getProgressEventLLSD(state, change, data); mPump.post(status_data); } @@ -140,15 +146,28 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential // Request SRV record. LL_INFOS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL; - // *NOTE:Mani - Completely arbitrary timeout value for SRV request. - filter.errorAfter(5, "SRV Request timed out!"); + // *NOTE:Mani - Completely arbitrary default timeout value for SRV request. + F32 seconds_to_timeout = 5.0f; + if(credentials.has("cfg_srv_timeout")) + { + seconds_to_timeout = credentials["cfg_srv_timeout"].asReal(); + } + + filter.eventAfter(seconds_to_timeout, + getProgressEventLLSD("offline", "fail.login")); + + std::string srv_pump_name = "LLAres"; + if(credentials.has("cfg_srv_pump")) + { + srv_pump_name = credentials["cfg_srv_pump"].asString(); + } - // Make request + // Make request LLSD request; request["op"] = "rewriteURI"; request["uri"] = uri; request["reply"] = replyPump.getName(); - rewrittenURIs = postAndWait(self, request, "LLAres", filter); + rewrittenURIs = postAndWait(self, request, srv_pump_name, filter); } // we no longer need the filter LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction")); diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp index a8ae2883d54ddcd13899e2d4a7bdc6284c46f686..99ea796ad0103d74173fc40e11c120fbed5903e6 100644 --- a/indra/viewer_components/login/tests/lllogin_test.cpp +++ b/indra/viewer_components/login/tests/lllogin_test.cpp @@ -47,6 +47,7 @@ class LoginListener: public LLEventTrackable bool call(const LLSD& event) { mDebug(STRINGIZE("LoginListener called!: " << event)); + mLastEvent = event; return false; } @@ -414,4 +415,42 @@ namespace tut ensure_equals("Failed to offline", listener.lastEvent()["state"].asString(), "offline"); } + +/* + template<> template<> + void llviewerlogin_object::test<5>() + { + DEBUG; + // Test SRV request timeout. + set_test_name("LLLogin SRV timeout testing"); + + // Testing normal login procedure. + LLEventStream llaresPump("LLAres"); // Dummy LLAres pump. + + // LLAresListener dummyLLAres("dummy_llares"); + // dummyLLAres.listenTo(llaresPump); + + LLLogin login; + LoginListener listener("test_ear"); + listener.listenTo(login.getEventPump()); + + LLSD credentials; + credentials["first"] = "these"; + credentials["last"] = "don't"; + credentials["passwd"] = "matter"; + credentials["cfg_srv_timeout"] = 0.0f; + + login.connect("login.bar.com", credentials); + + ensure_equals("SRV State", listener.lastEvent()["change"].asString(), "srvrequest"); + + // Get the mainloop eventpump, which needs a pinging in order to drive the + // SRV timeout. + LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop")); + LLSD frame_event; + mainloop.post(frame_event); + + ensure_equals("SRV Failure", listener.lastEvent()["change"].asString(), "fail.login"); + } +*/ } diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt index 0bd59f09908e981e6e12195e17a9cdf546e096a1..990dc6783ee1d8663d0a522fc03934d9ac661ddd 100644 --- a/indra/win_crash_logger/CMakeLists.txt +++ b/indra/win_crash_logger/CMakeLists.txt @@ -11,6 +11,7 @@ include(LLVFS) include(LLWindow) include(LLXML) include(Linking) +include(LLSharedLibs) include_directories( ${LLCOMMON_INCLUDE_DIRS} @@ -87,3 +88,5 @@ if (WINDOWS) LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" ) endif (WINDOWS) + +ll_deploy_sharedlibs_command(windows-crash-logger) \ No newline at end of file diff --git a/indra/win_updater/CMakeLists.txt b/indra/win_updater/CMakeLists.txt index dedb7cfcc72ef1dd10cbf264657a0158fe214ba1..82347adf201bf786ad30ec8c399bb60a2732c430 100644 --- a/indra/win_updater/CMakeLists.txt +++ b/indra/win_updater/CMakeLists.txt @@ -33,3 +33,6 @@ set_target_properties(windows-updater LINK_FLAGS "/NODEFAULTLIB:LIBCMT" LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" ) + +# The windows-updater doesn't link against anything non-system, apparently +#ll_deploy_sharedlibs_command(windows-updater) \ No newline at end of file diff --git a/install.xml b/install.xml index 6d40d6fe4e303fcff21f19c1a9fc5673795c180e..1df8fd09f4b73ec65fc3ecfe33d5bf6008e5a5ba 100644 --- a/install.xml +++ b/install.xml @@ -132,9 +132,9 @@ <key>windows</key> <map> <key>md5sum</key> - <string>70b51d0cc93c305026e4e2778cde6d19</string> + <string>f5cf8d121b26f2e7944f7e63cdbff04d</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20090722.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20091105.tar.bz2</uri> </map> </map> </map> @@ -254,9 +254,9 @@ <key>windows</key> <map> <key>md5sum</key> - <string>8dc4e818c2d6fbde76e9a5e34f4ffa72</string> + <string>53e5ab7affff7121a5af2f82b4d58b54</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20090917b.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20091016.tar.bz2</uri> </map> </map> </map> @@ -955,9 +955,9 @@ anguage Infrstructure (CLI) international standard</string> <key>linux</key> <map> <key>md5sum</key> - <string>0d8aab394b4dc00aae44b4ada50c2d9f</string> + <string>ffede2775355676096b1085cbb9d0da7</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20091027.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20091117.tar.bz2</uri> </map> <key>windows</key> <map> @@ -1269,7 +1269,7 @@ anguage Infrstructure (CLI) international standard</string> <key>quicktime</key> <map> <key>copyright</key> - <string>Copyright (C) 1990-2006 by Apple Computer, Inc., all rights reserved.</string> + <string>Copyright (C) 1990-2007 by Apple Computer, Inc., all rights reserved.</string> <key>description</key> <string>Separate download. Used to play in-world video clips on a prim. </string> <key>license</key> @@ -1279,9 +1279,9 @@ anguage Infrstructure (CLI) international standard</string> <key>windows</key> <map> <key>md5sum</key> - <string>7a2e6fc89b1ef027f3a36ebb46fb0c8a</string> + <string>be45825cc14ede53790ac93c58307dcb</string> <key>url</key> - <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-windows-20080611.tar.bz2</uri> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-sdk-windows-7.3-20091110.tar.bz2</uri> </map> </map> </map>