merge changes for storm-1019

master
Oz Linden 2011-03-29 19:22:26 -04:00
commit b595bbcf2a
111 changed files with 5082 additions and 3625 deletions

View File

@ -81,3 +81,11 @@ f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1

View File

@ -156,7 +156,8 @@ media.build_viewer_update_version_manager = false
# oz
# ================
oz_viewer-devreview.build_debug_release_separately = true
oz-viewer-devreview.build_debug_release_separately = true
oz_viewer-poreview.build_debug_release_separately = true
oz-project-1.build_debug_release_separately = true
oz-project-2.build_debug_release_separately = true
oz-project-3.build_debug_release_separately = true

View File

@ -413,6 +413,7 @@ Jonathan Yap
STORM-1019
STORM-1020
STORM-1064
STORM-1077
Kage Pixel
VWR-11
Ken March

View File

@ -1,3 +1,4 @@
# -*- cmake -*-
add_subdirectory(llui_libtest)
add_subdirectory(llimage_libtest)

View File

@ -0,0 +1,131 @@
# -*- cmake -*-
# Integration tests of the llimage library (JPEG2000, PNG, jpeg, etc... images reading and writing)
project (llimage_libtest)
include(00-Common)
include(LLCommon)
include(Linking)
include(LLSharedLibs)
include(LLImage)
include(LLImageJ2COJ)
include(LLKDU)
include(LLMath)
include(LLVFS)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${LLIMAGE_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
)
set(llimage_libtest_SOURCE_FILES
llimage_libtest.cpp
)
set(llimage_libtest_HEADER_FILES
CMakeLists.txt
llimage_libtest.h
)
set_source_files_properties(${llimage_libtest_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
list(APPEND llimage_libtest_SOURCE_FILES ${llimage_libtest_HEADER_FILES})
add_executable(llimage_libtest
WIN32
MACOSX_BUNDLE
${llimage_libtest_SOURCE_FILES}
)
set_target_properties(llimage_libtest
PROPERTIES
WIN32_EXECUTABLE
FALSE
)
# OS-specific libraries
if (DARWIN)
include(CMakeFindFrameworks)
find_library(COREFOUNDATION_LIBRARY CoreFoundation)
set(OS_LIBRARIES ${COREFOUNDATION_LIBRARY})
elseif (WINDOWS)
# set(OS_LIBRARIES)
elseif (LINUX)
# set(OS_LIBRARIES)
else (DARWIN)
message(FATAL_ERROR "Unknown platform")
endif (DARWIN)
# Libraries on which this application depends on
# Sort by high-level to low-level
target_link_libraries(llimage_libtest
${LLCOMMON_LIBRARIES}
${LLVFS_LIBRARIES}
${LLIMAGE_LIBRARIES}
${LLKDU_LIBRARIES}
${KDU_LIBRARY}
${LLIMAGEJ2COJ_LIBRARIES}
${OS_LIBRARIES}
)
if (DARWIN)
# Path inside the app bundle where we'll need to copy libraries
set(LLIMAGE_LIBTEST_DESTINATION_DIR
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llimage_libtest.app/Contents/Resources
)
# Create the Contents/Resources directory
add_custom_command(
TARGET llimage_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS
-E
make_directory
${LLIMAGE_LIBTEST_DESTINATION_DIR}
COMMENT "Creating Resources directory in app bundle."
)
else (DARWIN)
set(LLIMAGE_LIBTEST_DESTINATION_DIR
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
)
endif (DARWIN)
get_target_property(BUILT_LLCOMMON llcommon LOCATION)
add_custom_command(TARGET llimage_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${LLIMAGE_LIBTEST_DESTINATION_DIR}
DEPENDS ${BUILT_LLCOMMON}
)
if (DARWIN)
# Copy the required libraries to the package app
add_custom_command(TARGET llimage_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libapr-1.0.3.7.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libapr-1.0.3.7.dylib
)
add_custom_command(TARGET llimage_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libaprutil-1.0.3.8.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libaprutil-1.0.3.8.dylib
)
add_custom_command(TARGET llimage_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexception_handler.dylib
)
add_custom_command(TARGET llimage_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexpat.0.5.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexpat.0.5.0.dylib
)
endif (DARWIN)
if (WINDOWS)
# Check indra/test_apps/llplugintest/CMakeLists.txt for an example of what to copy over for Windows and how
endif (WINDOWS)
# Ensure people working on the viewer don't break this library
# *NOTE: This could be removed, or only built by TeamCity, if the build
# and link times become too long.
add_dependencies(viewer llimage_libtest)
ll_deploy_sharedlibs_command(llimage_libtest)

View File

@ -0,0 +1,437 @@
/**
* @file llimage_libtest.cpp
* @author Merov Linden
* @brief Integration test for the llimage library
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "linden_common.h"
#include "llpointer.h"
#include "lltimer.h"
#include "llimage_libtest.h"
// Linden library includes
#include "llimage.h"
#include "llimagejpeg.h"
#include "llimagepng.h"
#include "llimagebmp.h"
#include "llimagetga.h"
#include "llimagej2c.h"
#include "lldir.h"
// system libraries
#include <iostream>
// doc string provided when invoking the program with --help
static const char USAGE[] = "\n"
"usage:\tllimage_libtest [options]\n"
"\n"
" -h, --help\n"
" Print this help\n"
" -i, --input <file1 .. file2>\n"
" List of image files to load and convert. Patterns with wild cards can be used.\n"
" -o, --output <file1 .. file2> OR <type>\n"
" List of image files to create (assumes same order as for input files)\n"
" OR 3 letters file type extension to convert each input file into.\n"
" -log, --logmetrics <metric>\n"
" Log performance data for <metric>. Results in <metric>.slp\n"
" Note: so far, only ImageCompressionTester has been tested.\n"
" -r, --analyzeperformance\n"
" Create a report comparing <metric>_baseline.slp with current <metric>.slp\n"
" Results in <metric>_report.csv"
" -s, --image-stats\n"
" Output stats for each input and output image.\n"
"\n";
// true when all image loading is done. Used by metric logging thread to know when to stop the thread.
static bool sAllDone = false;
// Create an empty formatted image instance of the correct type from the filename
LLPointer<LLImageFormatted> create_image(const std::string &filename)
{
std::string exten = gDirUtilp->getExtension(filename);
U32 codec = LLImageBase::getCodecFromExtension(exten);
LLPointer<LLImageFormatted> image;
switch (codec)
{
case IMG_CODEC_BMP:
image = new LLImageBMP();
break;
case IMG_CODEC_TGA:
image = new LLImageTGA();
break;
case IMG_CODEC_JPEG:
image = new LLImageJPEG();
break;
case IMG_CODEC_J2C:
image = new LLImageJ2C();
break;
case IMG_CODEC_PNG:
image = new LLImagePNG();
break;
default:
return NULL;
}
return image;
}
void output_image_stats(LLPointer<LLImageFormatted> image, const std::string &filename)
{
// Print out some statistical data on the image
std::cout << "Image stats for : " << filename << ", extension : " << image->getExtension() << std::endl;
std::cout << " with : " << (int)(image->getWidth()) << ", height : " << (int)(image->getHeight()) << std::endl;
std::cout << " comp : " << (int)(image->getComponents()) << ", levels : " << (int)(image->getDiscardLevel()) << std::endl;
std::cout << " head : " << (int)(image->calcHeaderSize()) << ", data : " << (int)(image->getDataSize()) << std::endl;
return;
}
// Load an image from file and return a raw (decompressed) instance of its data
LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_stats)
{
LLPointer<LLImageFormatted> image = create_image(src_filename);
if (!image->load(src_filename))
{
return NULL;
}
if( (image->getComponents() != 3) && (image->getComponents() != 4) )
{
std::cout << "Image files with less than 3 or more than 4 components are not supported\n";
return NULL;
}
if (output_stats)
{
output_image_stats(image, src_filename);
}
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
if (!image->decode(raw_image, 0.0f))
{
return NULL;
}
return raw_image;
}
// Save a raw image instance into a file
bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, bool output_stats)
{
LLPointer<LLImageFormatted> image = create_image(dest_filename);
if (!image->encode(raw_image, 0.0f))
{
return false;
}
if (output_stats)
{
output_image_stats(image, dest_filename);
}
return image->save(dest_filename);
}
void store_input_file(std::list<std::string> &input_filenames, const std::string &path)
{
// Break the incoming path in its components
std::string dir = gDirUtilp->getDirName(path);
std::string name = gDirUtilp->getBaseFileName(path);
std::string exten = gDirUtilp->getExtension(path);
// std::cout << "store_input_file : " << path << ", dir : " << dir << ", name : " << name << ", exten : " << exten << std::endl;
// If extension is not an image type or "*", exit
// Note: we don't support complex patterns for the extension like "j??"
// Note: on most shells, the pattern expansion is done by the shell so that pattern matching limitation is actually not a problem
if ((exten.compare("*") != 0) && (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID))
{
return;
}
if ((name.find('*') != -1) || ((name.find('?') != -1)))
{
// If file name is a pattern, iterate to get each file name and store
std::string next_name;
while (gDirUtilp->getNextFileInDir(dir,name,next_name))
{
std::string file_name = dir + gDirUtilp->getDirDelimiter() + next_name;
input_filenames.push_back(file_name);
}
}
else
{
// Verify that the file does exist before storing
if (gDirUtilp->fileExists(path))
{
input_filenames.push_back(path);
}
else
{
std::cout << "store_input_file : the file " << path << " could not be found" << std::endl;
}
}
}
void store_output_file(std::list<std::string> &output_filenames, std::list<std::string> &input_filenames, const std::string &path)
{
// Break the incoming path in its components
std::string dir = gDirUtilp->getDirName(path);
std::string name = gDirUtilp->getBaseFileName(path);
std::string exten = gDirUtilp->getExtension(path);
// std::cout << "store_output_file : " << path << ", dir : " << dir << ", name : " << name << ", exten : " << exten << std::endl;
if (dir.empty() && exten.empty())
{
// If dir and exten are empty, we interpret the name as a file extension type name and will iterate through input list to populate the output list
exten = name;
// Make sure the extension is an image type
if (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID)
{
return;
}
std::string delim = gDirUtilp->getDirDelimiter();
std::list<std::string>::iterator in_file = input_filenames.begin();
std::list<std::string>::iterator end = input_filenames.end();
for (; in_file != end; ++in_file)
{
dir = gDirUtilp->getDirName(*in_file);
name = gDirUtilp->getBaseFileName(*in_file,true);
std::string file_name;
if (!dir.empty())
{
file_name = dir + delim + name + "." + exten;
}
else
{
file_name = name + "." + exten;
}
output_filenames.push_back(file_name);
}
}
else
{
// Make sure the extension is an image type
if (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID)
{
return;
}
// Store the path
output_filenames.push_back(path);
}
}
// Holds the metric gathering output in a thread safe way
class LogThread : public LLThread
{
public:
std::string mFile;
LogThread(std::string& test_name) : LLThread("llimage_libtest log")
{
std::string file_name = test_name + std::string(".slp");
mFile = file_name;
}
void run()
{
std::ofstream os(mFile.c_str());
while (!sAllDone)
{
LLFastTimer::writeLog(os);
os.flush();
ms_sleep(32);
}
LLFastTimer::writeLog(os);
os.flush();
os.close();
}
};
int main(int argc, char** argv)
{
// List of input and output files
std::list<std::string> input_filenames;
std::list<std::string> output_filenames;
bool analyze_performance = false;
bool image_stats = false;
// Init whatever is necessary
ll_init_apr();
LLImage::initClass();
LogThread* fast_timer_log_thread = NULL; // For performance and metric gathering
// Analyze command line arguments
for (int arg = 1; arg < argc; ++arg)
{
if (!strcmp(argv[arg], "--help") || !strcmp(argv[arg], "-h"))
{
// Send the usage to standard out
std::cout << USAGE << std::endl;
return 0;
}
else if ((!strcmp(argv[arg], "--input") || !strcmp(argv[arg], "-i")) && arg < argc-1)
{
std::string file_name = argv[arg+1];
while (file_name[0] != '-') // if arg starts with '-', we consider it's not a file name but some other argument
{
// std::cout << "input file name : " << file_name << std::endl;
store_input_file(input_filenames, file_name);
arg += 1; // Skip that arg now we know it's a file name
if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
break;
file_name = argv[arg+1]; // Next argument and loop over
}
}
else if ((!strcmp(argv[arg], "--output") || !strcmp(argv[arg], "-o")) && arg < argc-1)
{
std::string file_name = argv[arg+1];
while (file_name[0] != '-') // if arg starts with '-', we consider it's not a file name but some other argument
{
// std::cout << "output file name : " << file_name << std::endl;
store_output_file(output_filenames, input_filenames, file_name);
arg += 1; // Skip that arg now we know it's a file name
if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
break;
file_name = argv[arg+1]; // Next argument and loop over
}
}
else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log"))
{
// '--logmetrics' needs to be specified with a named test metric argument
// Note: for the moment, only ImageCompressionTester has been tested
std::string test_name;
if ((arg + 1) < argc)
{
test_name = argv[arg+1];
}
if (((arg + 1) >= argc) || (test_name[0] == '-'))
{
// We don't have an argument left in the arg list or the next argument is another option
std::cout << "No --logmetrics argument given, no perf data will be gathered" << std::endl;
}
else
{
LLFastTimer::sMetricLog = TRUE;
LLFastTimer::sLogName = test_name;
arg += 1; // Skip that arg now we know it's a valid test name
if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
break;
}
}
else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-r"))
{
analyze_performance = true;
}
else if (!strcmp(argv[arg], "--image-stats") || !strcmp(argv[arg], "-s"))
{
image_stats = true;
}
}
// Check arguments consistency. Exit with proper message if inconsistent.
if (input_filenames.size() == 0)
{
std::cout << "No input file, nothing to do -> exit" << std::endl;
return 0;
}
if (analyze_performance && !LLFastTimer::sMetricLog)
{
std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -r) -> exit" << std::endl;
return 0;
}
// Create the logging thread if required
if (LLFastTimer::sMetricLog)
{
LLFastTimer::sLogLock = new LLMutex(NULL);
fast_timer_log_thread = new LogThread(LLFastTimer::sLogName);
fast_timer_log_thread->start();
}
// Perform action on each input file
std::list<std::string>::iterator in_file = input_filenames.begin();
std::list<std::string>::iterator out_file = output_filenames.begin();
std::list<std::string>::iterator in_end = input_filenames.end();
std::list<std::string>::iterator out_end = output_filenames.end();
for (; in_file != in_end; ++in_file)
{
// Load file
LLPointer<LLImageRaw> raw_image = load_image(*in_file, image_stats);
if (!raw_image)
{
std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl;
continue;
}
// Save file
if (out_file != out_end)
{
if (!save_image(*out_file, raw_image, image_stats))
{
std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl;
}
else
{
std::cout << *in_file << " -> " << *out_file << std::endl;
}
++out_file;
}
}
// Stop the perf gathering system if needed
if (LLFastTimer::sMetricLog)
{
LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName);
sAllDone = true;
}
// Output perf data if requested by user
if (analyze_performance)
{
std::cout << "Analyzing performance" << std::endl;
std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp";
std::string current_name = LLFastTimer::sLogName + ".slp";
std::string report_name = LLFastTimer::sLogName + "_report.csv";
LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline_name, current_name, report_name);
}
// Cleanup and exit
LLImage::cleanupClass();
if (fast_timer_log_thread)
{
fast_timer_log_thread->shutdown();
}
return 0;
}

View File

@ -0,0 +1,29 @@
/**
* @file llimage_libtest.h
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LLIMAGE_LIBTEST_H
#define LLIMAGE_LIBTEST_H
#endif

View File

@ -63,7 +63,18 @@ BOOL LLMetricPerformanceTesterBasic::addTester(LLMetricPerformanceTesterBasic* t
sTesterMap.insert(std::make_pair(name, tester));
return TRUE;
}
/*static*/
void LLMetricPerformanceTesterBasic::deleteTester(std::string name)
{
name_tester_map_t::iterator tester = sTesterMap.find(name);
if (tester != sTesterMap.end())
{
delete tester->second;
sTesterMap.erase(tester);
}
}
/*static*/
LLMetricPerformanceTesterBasic* LLMetricPerformanceTesterBasic::getTester(std::string name)
{
@ -83,7 +94,78 @@ BOOL LLMetricPerformanceTesterBasic::isMetricLogRequested(std::string name)
return (LLFastTimer::sMetricLog && ((LLFastTimer::sLogName == name) || (LLFastTimer::sLogName == DEFAULT_METRIC_NAME)));
}
/*static*/
LLSD LLMetricPerformanceTesterBasic::analyzeMetricPerformanceLog(std::istream& is)
{
LLSD ret;
LLSD cur;
while (!is.eof() && LLSDSerialize::fromXML(cur, is))
{
for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
{
std::string label = iter->first;
LLMetricPerformanceTesterBasic* tester = LLMetricPerformanceTesterBasic::getTester(iter->second["Name"].asString()) ;
if(tester)
{
ret[label]["Name"] = iter->second["Name"] ;
S32 num_of_metrics = tester->getNumberOfMetrics() ;
for(S32 index = 0 ; index < num_of_metrics ; index++)
{
ret[label][ tester->getMetricName(index) ] = iter->second[ tester->getMetricName(index) ] ;
}
}
}
}
return ret;
}
/*static*/
void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std::string target, std::string output)
{
if(!LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters())
{
return ;
}
// Open baseline and current target, exit if one is inexistent
std::ifstream base_is(baseline.c_str());
std::ifstream target_is(target.c_str());
if (!base_is.is_open() || !target_is.is_open())
{
llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl;
base_is.close();
target_is.close();
return;
}
//analyze baseline
LLSD base = analyzeMetricPerformanceLog(base_is);
base_is.close();
//analyze current
LLSD current = analyzeMetricPerformanceLog(target_is);
target_is.close();
//output comparision
std::ofstream os(output.c_str());
os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n";
for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ;
iter != LLMetricPerformanceTesterBasic::sTesterMap.end() ; ++iter)
{
LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second) ;
tester->analyzePerformance(&os, &base, &current) ;
}
os.flush();
os.close();
}
//----------------------------------------------------------------------------------------------
// LLMetricPerformanceTesterBasic : Tester instance methods
//----------------------------------------------------------------------------------------------

View File

@ -62,6 +62,8 @@ public:
*/
virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
/**
* @return Returns the number of the test metrics in this tester instance.
*/
@ -116,6 +118,7 @@ protected:
private:
void preOutputTestResults(LLSD* sd) ;
void postOutputTestResults(LLSD* sd) ;
static LLSD analyzeMetricPerformanceLog(std::istream& is) ;
std::string mName ; // Name of this tester instance
S32 mCount ; // Current record count
@ -134,6 +137,12 @@ public:
*/
static LLMetricPerformanceTesterBasic* getTester(std::string name) ;
/**
* @return Delete the named tester from the list
* @param[in] name - Name of the tester instance to delete.
*/
static void deleteTester(std::string name);
/**
* @return Returns TRUE if that metric *or* the default catch all metric has been requested to be logged
* @param[in] name - Name of the tester queried.

View File

@ -29,7 +29,7 @@
const S32 LL_VERSION_MAJOR = 2;
const S32 LL_VERSION_MINOR = 6;
const S32 LL_VERSION_PATCH = 1;
const S32 LL_VERSION_PATCH = 3;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";

View File

@ -266,13 +266,13 @@ public:
// subclasses must return a prefered file extension (lowercase without a leading dot)
virtual std::string getExtension() = 0;
// calcHeaderSize() returns the maximum size of header;
// 0 indicates we don't know have a header and have to lead the entire file
// 0 indicates we don't have a header and have to read the entire file
virtual S32 calcHeaderSize() { return 0; };
// calcDataSize() returns how many bytes to read to load discard_level (including header)
virtual S32 calcDataSize(S32 discard_level);
// calcDiscardLevelBytes() returns the smallest valid discard level based on the number of input bytes
virtual S32 calcDiscardLevelBytes(S32 bytes);
// getRawDiscardLevel()by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
// getRawDiscardLevel() by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
virtual S8 getRawDiscardLevel() { return mDiscardLevel; }
BOOL load(const std::string& filename);

View File

@ -474,6 +474,7 @@ LLImageCompressionTester::LLImageCompressionTester() : LLMetricPerformanceTester
LLImageCompressionTester::~LLImageCompressionTester()
{
outputTestResults();
LLImageJ2C::sTesterp = NULL;
}

View File

@ -1936,9 +1936,15 @@ bool LLMenuGL::scrollItems(EScrollingDirection direction)
{
item_list_t::reverse_iterator first_visible_item_iter = mItems.rend();
// Need to scroll through number of actual existing items in menu.
// Otherwise viewer will hang for a time needed to scroll U32_MAX
// times in std::advance(). STORM-659.
size_t nitems = mItems.size();
U32 scrollable_items = nitems < mMaxScrollableItems ? nitems : mMaxScrollableItems;
// Advance by mMaxScrollableItems back from the end of the list
// to make the last item visible.
std::advance(first_visible_item_iter, mMaxScrollableItems);
std::advance(first_visible_item_iter, scrollable_items);
mFirstVisibleItem = *first_visible_item_iter;
break;
}

View File

@ -122,7 +122,17 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>FirstSpeak</key>
<map>
<key>Comment</key>
<string>Shows hint for Speak button</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FirstSit</key>
<map>
<key>Comment</key>

View File

@ -3198,7 +3198,7 @@
<key>FirstRunThisInstall</key>
<map>
<key>Comment</key>
<string>Specifies that you have not run the viewer since you installed the latest update</string>
<string>Specifies that you have not run the viewer since you performed a clean install</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -3206,7 +3206,18 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>FirstSelectedDisabledPopups</key>
<key>FirstLoginThisInstall</key>
<map>
<key>Comment</key>
<string>Specifies that you have not logged in with the viewer since you performed a clean install</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FirstSelectedDisabledPopups</key>
<map>
<key>Comment</key>
<string>Return false if there is not disabled popup selected in the list of floater preferences popups</string>

View File

@ -2171,6 +2171,7 @@ bool LLAppViewer::initConfiguration()
if (gSavedSettings.getBOOL("FirstRunThisInstall"))
{
gSavedSettings.setString("SessionSettingsFile", "settings_minimal.xml");
gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
}
if (clp.hasOption("sessionsettings"))

View File

@ -55,6 +55,7 @@
#include "llviewerwindow.h"
#include "llsdserialize.h"
#include "llfirstuse.h"
// Distance from mouse down on which drag'n'drop should be started.
#define DRAG_START_DISTANCE 3
@ -381,7 +382,12 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
// skipped to avoid button blinking
if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
{
mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
mSpeakBtn->setFlyoutBtnEnabled(voice_status);
if (voice_status)
{
LLFirstUse::speak(true);
}
}
}
@ -561,6 +567,7 @@ BOOL LLBottomTray::postBuild()
mSpeakPanel = getChild<LLPanel>("speak_panel");
mSpeakBtn = getChild<LLSpeakButton>("talk");
LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
// Both parts of speak button should be initially disabled because
// it takes some time between logging in to world and connecting to voice channel.

View File

@ -50,6 +50,7 @@
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "llviewerparcelmgr.h"
#include "llfirstuse.h"
static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids);
void reshape_floater(LLCallFloater* floater, S32 delta_height);
@ -170,13 +171,13 @@ BOOL LLCallFloater::postBuild()
updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
updateSession();
return TRUE;
}
// virtual
void LLCallFloater::onOpen(const LLSD& /*key*/)
{
LLFirstUse::speak(false);
}
// virtual

View File

@ -793,21 +793,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if ( chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mFromID.notNull())
{
// for object IMs, create a secondlife:///app/objectim SLapp
std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
url += "?name=" + chat.mFromName;
url += "&owner=" + chat.mOwnerID.asString();
std::string slurl = args["slurl"].asString();
if (slurl.empty())
{
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
if(region)
{
LLSLURL region_slurl(region->getName(), chat.mPosAgent);
slurl = region_slurl.getLocationString();
}
}
url += "&slurl=" + LLURI::escape(slurl);
std::string url = LLViewerChat::getSenderSLURL(chat, args);
// set the link for the object name to be the objectim SLapp
// (don't let object names with hyperlinks override our objectim Url)

View File

@ -213,17 +213,6 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
{
LLStyle::Params style_params_name;
std::string href;
if (mSourceType == CHAT_SOURCE_AGENT)
{
href = LLSLURL("agent", mFromID, "about").getSLURLString();
}
else
{
href = LLSLURL("object", mFromID, "inspect").getSLURLString();
}
LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
style_params_name.color(user_name_color);
@ -232,7 +221,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
style_params_name.font.name(font_name);
style_params_name.font.size(font_style_size);
style_params_name.link_href = href;
style_params_name.link_href = notification["sender_slurl"].asString();
style_params_name.is_link = true;
msg_text->appendText(str_sender, FALSE, style_params_name);

View File

@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "llexternaleditor.h"
#include "lltrans.h"
#include "llui.h"
// static
@ -35,13 +36,13 @@ const std::string LLExternalEditor::sFilenameMarker = "%s";
// static
const std::string LLExternalEditor::sSetting = "ExternalEditor";
bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& override)
LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env_var, const std::string& override)
{
std::string cmd = findCommand(env_var, override);
if (cmd.empty())
{
llwarns << "Empty editor command" << llendl;
return false;
llwarns << "Editor command is empty or not set" << llendl;
return EC_NOT_SPECIFIED;
}
// Add the filename marker if missing.
@ -55,7 +56,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s)
{
llwarns << "Error parsing editor command" << llendl;
return false;
return EC_PARSE_ERROR;
}
// Check executable for existence.
@ -63,7 +64,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
if (!LLFile::isfile(bin_path))
{
llwarns << "Editor binary [" << bin_path << "] not found" << llendl;
return false;
return EC_BINARY_NOT_FOUND;
}
// Save command.
@ -76,16 +77,16 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
}
llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl;
return true;
return EC_SUCCESS;
}
bool LLExternalEditor::run(const std::string& file_path)
LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path)
{
std::string args = mArgs;
if (mProcess.getExecutable().empty() || args.empty())
{
llwarns << "Editor command not set" << llendl;
return false;
return EC_NOT_SPECIFIED;
}
// Substitute the filename marker in the command with the actual passed file name.
@ -111,7 +112,22 @@ bool LLExternalEditor::run(const std::string& file_path)
mProcess.orphan();
}
return result == 0;
return result == 0 ? EC_SUCCESS : EC_FAILED_TO_RUN;
}
// static
std::string LLExternalEditor::getErrorMessage(EErrorCode code)
{
switch (code)
{
case EC_SUCCESS: return LLTrans::getString("ok");
case EC_NOT_SPECIFIED: return LLTrans::getString("ExternalEditorNotSet");
case EC_PARSE_ERROR: return LLTrans::getString("ExternalEditorCommandParseError");
case EC_BINARY_NOT_FOUND: return LLTrans::getString("ExternalEditorNotFound");
case EC_FAILED_TO_RUN: return LLTrans::getString("ExternalEditorFailedToRun");
}
return LLTrans::getString("Unknown");
}
// static

View File

@ -42,6 +42,14 @@ class LLExternalEditor
public:
typedef enum e_error_code {
EC_SUCCESS, /// No error.
EC_NOT_SPECIFIED, /// Editor path not specified.
EC_PARSE_ERROR, /// Editor command parsing error.
EC_BINARY_NOT_FOUND, /// Could find the editor binary (missing or not quoted).
EC_FAILED_TO_RUN, /// Could not execute the editor binary.
} EErrorCode;
/**
* Set editor command.
*
@ -51,19 +59,25 @@ public:
* First tries the override, then a predefined setting (sSetting),
* then the environment variable.
*
* @return Command if found, empty string otherwise.
* @return EC_SUCCESS if command is valid and refers to an existing executable,
* EC_NOT_SPECIFIED or EC_FAILED_TO_RUNan on error.
*
* @see sSetting
*/
bool setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null);
EErrorCode setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null);
/**
* Run the editor with the given file.
*
* @param file_path File to edit.
* @return true on success, false on error.
* @return EC_SUCCESS on success, error code on error.
*/
bool run(const std::string& file_path);
EErrorCode run(const std::string& file_path);
/**
* Get a meaningful error message for the given status code.
*/
static std::string getErrorMessage(EErrorCode code);
private:

View File

@ -1149,36 +1149,6 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
os.close();
}
//-------------------------
//static
LLSD LLFastTimerView::analyzeMetricPerformanceLog(std::istream& is)
{
LLSD ret;
LLSD cur;
while (!is.eof() && LLSDSerialize::fromXML(cur, is))
{
for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
{
std::string label = iter->first;
LLMetricPerformanceTesterBasic* tester = LLMetricPerformanceTesterBasic::getTester(iter->second["Name"].asString()) ;
if(tester)
{
ret[label]["Name"] = iter->second["Name"] ;
S32 num_of_metrics = tester->getNumberOfMetrics() ;
for(S32 index = 0 ; index < num_of_metrics ; index++)
{
ret[label][ tester->getMetricName(index) ] = iter->second[ tester->getMetricName(index) ] ;
}
}
}
}
return ret;
}
//static
void LLFastTimerView::outputAllMetrics()
{
@ -1193,48 +1163,6 @@ void LLFastTimerView::outputAllMetrics()
}
}
//static
void LLFastTimerView::doAnalysisMetrics(std::string baseline, std::string target, std::string output)
{
if(!LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters())
{
return ;
}
// Open baseline and current target, exit if one is inexistent
std::ifstream base_is(baseline.c_str());
std::ifstream target_is(target.c_str());
if (!base_is.is_open() || !target_is.is_open())
{
llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl;
base_is.close();
target_is.close();
return;
}
//analyze baseline
LLSD base = analyzeMetricPerformanceLog(base_is);
base_is.close();
//analyze current
LLSD current = analyzeMetricPerformanceLog(target_is);
target_is.close();
//output comparision
std::ofstream os(output.c_str());
os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n";
for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ;
iter != LLMetricPerformanceTesterBasic::sTesterMap.end() ; ++iter)
{
LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second) ;
tester->analyzePerformance(&os, &base, &current) ;
}
os.flush();
os.close();
}
//static
void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::string output)
{
@ -1246,7 +1174,7 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::
if(LLFastTimer::sMetricLog)
{
doAnalysisMetrics(baseline, target, output) ;
LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline, target, output) ;
return ;
}
}

View File

@ -42,8 +42,6 @@ public:
private:
static void doAnalysisDefault(std::string baseline, std::string target, std::string output) ;
static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
static LLSD analyzeMetricPerformanceLog(std::istream& is) ;
static LLSD analyzePerformanceLogDefault(std::istream& is) ;
public:

View File

@ -77,6 +77,12 @@ void LLFirstUse::otherAvatarChatFirst(bool enable)
firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "chat_bar").with("direction", "top_right").with("distance", 24));
}
// static
void LLFirstUse::speak(bool enable)
{
firstUseNotification("FirstSpeak", enable, "HintSpeak", LLSD(), LLSD().with("target", "speak_btn").with("direction", "top"));
}
// static
void LLFirstUse::sit(bool enable)
{

View File

@ -68,6 +68,8 @@ object or from inventory.
13. First time you open the debug menus (ctrl-alt-shift D)
14. First time you create/edit a sculpted prim.
15. Explanation of Speak&flyout buttons.
*/
class LLNotification;
@ -85,6 +87,7 @@ public:
static void resetFirstUse();
static void otherAvatarChatFirst(bool enable = true);
static void speak(bool enable = true);
static void sit(bool enable = true);
static void notUsingDestinationGuide(bool enable = true);
static void notUsingSidePanel(bool enable = true);

View File

@ -42,7 +42,6 @@
#include "llviewercamera.h"
#include "lldraghandle.h"
#include "lltextbox.h"
#include "llviewermenu.h"
#include "llfloaterworldmap.h"
#include "llagent.h"
@ -63,7 +62,6 @@ const S32 MAP_PADDING_BOTTOM = 0;
LLFloaterMap::LLFloaterMap(const LLSD& key)
: LLFloater(key),
mPopupMenu(NULL),
mTextBoxEast(NULL),
mTextBoxNorth(NULL),
mTextBoxWest(NULL),
@ -102,17 +100,6 @@ BOOL LLFloaterMap::postBuild()
mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");
mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2));
registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2));
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (mPopupMenu && !LLTracker::isTracking(0))
{
mPopupMenu->setItemEnabled ("Stop Tracking", false);
}
stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
@ -163,17 +150,6 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
return TRUE;
}
BOOL LLFloaterMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
if (mPopupMenu)
{
mPopupMenu->buildDrawLabels();
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
LLMenuGL::showPopup(this, mPopupMenu, x, y);
}
return TRUE;
}
void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
{
// Rotation is in radians.
@ -244,11 +220,6 @@ void LLFloaterMap::draw()
getDragHandle()->setMouseOpaque(TRUE);
}
if (LLTracker::isTracking(0))
{
mPopupMenu->setItemEnabled ("Stop Tracking", true);
}
LLFloater::draw();
}
@ -315,14 +286,6 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
}
}
void LLFloaterMap::handleStopTracking (const LLSD& userdata)
{
if (mPopupMenu)
{
mPopupMenu->setItemEnabled ("Stop Tracking", false);
LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
}
}
void LLFloaterMap::setMinimized(BOOL b)
{
LLFloater::setMinimized(b);

View File

@ -29,7 +29,6 @@
#include "llfloater.h"
class LLMenuGL;
class LLNetMap;
class LLTextBox;
@ -44,7 +43,6 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void draw();
/*virtual*/ void onFocusLost();
@ -54,14 +52,11 @@ public:
private:
void handleZoom(const LLSD& userdata);
void handleStopTracking (const LLSD& userdata);
void setDirectionPos( LLTextBox* text_box, F32 rotation );
void updateMinorDirections();
void stretchMiniMap(S32 width,S32 height);
LLMenuGL* mPopupMenu;
LLTextBox* mTextBoxEast;
LLTextBox* mTextBoxNorth;
LLTextBox* mTextBoxWest;

View File

@ -185,7 +185,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
have_extended_data = true;
msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
msg->getF32("DataExtended", "MonoScore", mono_score, block);
msg->getS32(_PREHASH_ReportData,"PublicURLs",public_urls,block);
msg->getS32("DataExtended", "PublicURLs", public_urls, block);
}
LLSD element;

View File

@ -1037,18 +1037,29 @@ void LLFloaterUIPreview::onClickEditFloater()
cmd_override = bin + " " + args;
}
}
if (!mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override))
LLExternalEditor::EErrorCode status = mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override);
if (status != LLExternalEditor::EC_SUCCESS)
{
std::string warning = "Select an editor by setting the environment variable LL_XUI_EDITOR "
"or the ExternalEditor setting or specifying its path in the \"Editor Path\" field.";
std::string warning;
if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error.
{
warning = getString("ExternalEditorNotSet");
}
else
{
warning = LLExternalEditor::getErrorMessage(status);
}
popupAndPrintWarning(warning);
return;
}
// Run the editor.
if (!mExternalEditor.run(file_path))
if (mExternalEditor.run(file_path) != LLExternalEditor::EC_SUCCESS)
{
popupAndPrintWarning("Failed to run editor");
popupAndPrintWarning(LLExternalEditor::getErrorMessage(status));
return;
}
}

View File

@ -95,6 +95,36 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
return (cats_count >= 1) ? cats.get(0)->getUUID() : LLUUID::null;
}
/**
* Class LLFindAgentCallingCard
*
* An inventory collector functor for checking that agent's own calling card
* exists within the Calling Cards category and its sub-folders.
*/
class LLFindAgentCallingCard : public LLInventoryCollectFunctor
{
public:
LLFindAgentCallingCard() : mIsAgentCallingCardFound(false) {}
virtual ~LLFindAgentCallingCard() {}
virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
bool isAgentCallingCardFound() { return mIsAgentCallingCardFound; }
private:
bool mIsAgentCallingCardFound;
};
bool LLFindAgentCallingCard::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
if (mIsAgentCallingCardFound) return true;
if (item && item->getType() == LLAssetType::AT_CALLINGCARD && item->getCreatorUUID() == gAgentID)
{
mIsAgentCallingCardFound = true;
}
return mIsAgentCallingCardFound;
}
/**
* Class for fetching initial friend cards data
*
@ -449,32 +479,22 @@ void LLFriendCardsManager::syncFriendsFolder()
LLAvatarTracker::instance().copyBuddyList(all_buddies);
// 1. Check if own calling card exists
const LLUUID calling_cards_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
LLUUID friends_all_folder_id = findFriendAllSubfolderUUIDImpl();
gInventory.collectDescendents(friends_all_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
bool own_callingcard_found = false;
LLInventoryModel::item_array_t::const_iterator it;
for (it = items.begin(); it != items.end(); ++it)
{
if ((*it)->getCreatorUUID() == gAgentID)
{
own_callingcard_found = true;
break;
}
}
LLFindAgentCallingCard collector;
gInventory.collectDescendentsIf(calling_cards_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, collector);
// Create own calling card if it was not found in Friends/All folder
if (!own_callingcard_found)
if (!collector.isAgentCallingCardFound())
{
LLAvatarName av_name;
LLAvatarNameCache::get( gAgentID, &av_name );
create_inventory_item(gAgentID,
gAgent.getSessionID(),
friends_all_folder_id,
calling_cards_folder_id,
LLTransactionID::tnull,
av_name.getCompleteName(),
gAgentID.asString(),

View File

@ -30,13 +30,14 @@
#include "llagent.h"
#include "llviewercamera.h"
#include "llrendersphere.h"
#include "llui.h"
LLHUDEffectBlob::LLHUDEffectBlob(const U8 type)
: LLHUDEffect(type),
mPixelSize(10)
{
mTimer.start();
mImage = LLUI::getUIImage("Camera_Drag_Dot");
}
LLHUDEffectBlob::~LLHUDEffectBlob()
@ -58,18 +59,29 @@ void LLHUDEffectBlob::render()
LLViewerCamera::instance().getPixelVectors(pos_agent, pixel_up, pixel_right);
LLGLSPipelineAlpha gls_pipeline_alpha;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->bind(mImage->getImage());
LLColor4U color = mColor;
color.mV[VALPHA] = (U8)clamp_rescale(time, 0.f, mDuration, 255.f, 0.f);
glColor4ubv(color.mV);
gGL.color4ubv(color.mV);
glPushMatrix();
glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
F32 scale = pixel_up.magVec() * (F32)mPixelSize;
glScalef(scale, scale, scale);
gSphere.render(0);
glPopMatrix();
{ gGL.pushMatrix();
gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
LLVector3 u_scale = pixel_right * (F32)mPixelSize;
LLVector3 v_scale = pixel_up * (F32)mPixelSize;
{ gGL.begin(LLRender::QUADS);
gGL.texCoord2f(0.f, 1.f);
gGL.vertex3fv((v_scale - u_scale).mV);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex3fv((-v_scale - u_scale).mV);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex3fv((-v_scale + u_scale).mV);
gGL.texCoord2f(1.f, 1.f);
gGL.vertex3fv((v_scale + u_scale).mV);
} gGL.end();
} gGL.popMatrix();
}
void LLHUDEffectBlob::renderForTimer()

View File

@ -28,6 +28,7 @@
#define LL_LLHUDEFFECTBLOB_H
#include "llhudeffect.h"
#include "lluiimage.h"
class LLHUDEffectBlob : public LLHUDEffect
{
@ -45,6 +46,7 @@ protected:
private:
S32 mPixelSize;
LLFrameTimer mTimer;
LLPointer<LLUIImage> mImage;
};
#endif // LL_LLHUDEFFECTBLOB_H

View File

@ -558,6 +558,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
}
*/
// Add a nearby chat toast.
LLUUID id;
id.generate();
@ -583,6 +584,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
notification["text_color"] = r_color_name;
notification["color_alpha"] = r_color_alpha;
notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
// Pass sender info so that it can be rendered properly (STORM-1021).
notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
channel->addNotification(notification);
}

View File

@ -112,10 +112,6 @@ BOOL LLNetMap::postBuild()
registrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (mPopupMenu && !LLTracker::isTracking(0))
{
mPopupMenu->setItemEnabled ("Stop Tracking", false);
}
return TRUE;
}
@ -510,13 +506,6 @@ void LLNetMap::draw()
gGL.popUIMatrix();
LLUICtrl::draw();
if (LLTracker::isTracking(0))
{
mPopupMenu->setItemEnabled ("Stop Tracking", true);
}
}
void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
@ -886,6 +875,7 @@ BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
mPopupMenu->buildDrawLabels();
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
mPopupMenu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0));
LLMenuGL::showPopup(this, mPopupMenu, x, y);
}
return TRUE;

View File

@ -956,16 +956,31 @@ void LLScriptEdCore::openInExternalEditor()
// Open it in external editor.
{
LLExternalEditor ed;
LLExternalEditor::EErrorCode status;
std::string msg;
if (!ed.setCommand("LL_SCRIPT_EDITOR"))
status = ed.setCommand("LL_SCRIPT_EDITOR");
if (status != LLExternalEditor::EC_SUCCESS)
{
std::string msg = "Select an editor by setting the environment variable LL_SCRIPT_EDITOR "
"or the ExternalEditor setting"; // *TODO: localize
if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error.
{
msg = getString("external_editor_not_set");
}
else
{
msg = LLExternalEditor::getErrorMessage(status);
}
LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
return;
}
ed.run(filename);
status = ed.run(filename);
if (status != LLExternalEditor::EC_SUCCESS)
{
msg = LLExternalEditor::getErrorMessage(status);
LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
}
}
}

View File

@ -686,7 +686,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
if (!floater_tab) return NULL;
floater_tab->openFloater(panel_name);
floater_tab->openFloater(tab_name);
}
LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());

View File

@ -38,6 +38,7 @@
#include "llspeakbutton.h"
#include "llbottomtray.h"
#include "llfirstuse.h"
static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button");
@ -176,6 +177,7 @@ void LLSpeakButton::onMouseDown_SpeakBtn()
{
bool down = true;
LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
LLFirstUse::speak(false);
}
void LLSpeakButton::onMouseUp_SpeakBtn()
{

File diff suppressed because it is too large Load Diff

View File

@ -83,7 +83,7 @@ LLToolPie::LLToolPie()
mMouseOutsideSlop( false ),
mMouseSteerX(-1),
mMouseSteerY(-1),
mAbortClickToWalk(false),
mBlockClickToWalk(false),
mClickAction(0),
mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") )
@ -303,7 +303,7 @@ BOOL LLToolPie::handleLeftClickPick()
if (gFocusMgr.getKeyboardFocus())
{
// don't click to walk on attempt to give focus to world
mAbortClickToWalk = true;
mBlockClickToWalk = true;
gFocusMgr.setKeyboardFocus(NULL);
}
@ -625,7 +625,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
// let media have first pass at click
if (handleMediaMouseUp() || LLViewerMediaFocus::getInstance()->getFocus())
{
mAbortClickToWalk = true;
mBlockClickToWalk = true;
}
stopCameraSteering();
mMouseButtonDown = false;
@ -633,7 +633,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
if (click_action == CLICK_ACTION_NONE // not doing 1-click action
&& gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled
&& !gAgent.getFlying() // don't auto-navigate while flying until that works
&& !mAbortClickToWalk // another behavior hasn't cancelled click to walk
&& !mBlockClickToWalk // another behavior hasn't cancelled click to walk
&& !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
&& (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
|| mPick.mObjectID.notNull())) // or on an object
@ -658,11 +658,11 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
mAutoPilotDestination->setPixelSize(5);
mAutoPilotDestination->setColor(LLColor4U(50, 50, 200));
mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
mAutoPilotDestination->setDuration(3.f);
handle_go_to();
mAbortClickToWalk = false;
mBlockClickToWalk = false;
return TRUE;
}
@ -675,7 +675,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
LLToolMgr::getInstance()->clearTransientTool();
gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
mAbortClickToWalk = false;
mBlockClickToWalk = false;
return LLTool::handleMouseUp(x, y, mask);
}
@ -1298,7 +1298,8 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
void LLToolPie::handleSelect()
{
mAbortClickToWalk = true;
// tool is reselected when app gets focus, etc.
mBlockClickToWalk = true;
}
void LLToolPie::handleDeselect()
@ -1738,7 +1739,7 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di
void LLToolPie::startCameraSteering()
{
mMouseOutsideSlop = true;
mAbortClickToWalk = true;
mBlockClickToWalk = true;
if (gAgentCamera.getFocusOnAvatar())
{
@ -1777,7 +1778,7 @@ void LLToolPie::startCameraSteering()
if (mMouseSteerGrabPoint) { mMouseSteerGrabPoint->markDead(); }
mMouseSteerGrabPoint = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
mMouseSteerGrabPoint->setPositionGlobal(mSteerPick.mPosGlobal);
mMouseSteerGrabPoint->setColor(LLColor4U(50, 50, 200));
mMouseSteerGrabPoint->setColor(LLColor4U(170, 210, 190));
mMouseSteerGrabPoint->setPixelSize(5);
mMouseSteerGrabPoint->setDuration(2.f);
}

View File

@ -66,6 +66,7 @@ public:
LLViewerObject* getClickActionObject() { return mClickActionObject; }
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
void resetSelection();
void blockClickToWalk() { mBlockClickToWalk = true; }
static void selectionPropertiesReceived();
@ -105,7 +106,7 @@ private:
LLPointer<LLHUDEffectBlob> mAutoPilotDestination;
LLPointer<LLHUDEffectBlob> mMouseSteerGrabPoint;
bool mClockwise;
bool mAbortClickToWalk;
bool mBlockClickToWalk;
LLUUID mMediaMouseCaptureID;
LLPickInfo mPick;
LLPickInfo mHoverPick;

View File

@ -75,7 +75,7 @@ public:
// these are static so that they can be used a callbacks
static ETrackingStatus getTrackingStatus() { return instance()->mTrackingStatus; }
static ETrackingLocationType getTrackedLocationType() { return instance()->mTrackingLocationType; }
static BOOL isTracking(void*) { return (BOOL) instance()->mTrackingStatus; }
static BOOL isTracking(void*) { return instance()->mTrackingStatus != TRACKING_NOTHING; }
static void stopTracking(void*);
static void clearFocus();

View File

@ -31,6 +31,8 @@
#include "llagent.h" // gAgent
#include "lluicolortable.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewerregion.h"
#include "llworld.h"
#include "llinstantmessage.h" //SYSTEM_FROM
// LLViewerChat
@ -214,3 +216,43 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg)
}
//static
std::string LLViewerChat::getSenderSLURL(const LLChat& chat, const LLSD& args)
{
switch (chat.mSourceType)
{
case CHAT_SOURCE_AGENT:
return LLSLURL("agent", chat.mFromID, "about").getSLURLString();
case CHAT_SOURCE_OBJECT:
return getObjectImSLURL(chat, args);
default:
llwarns << "Getting SLURL for an unsupported sender type: " << chat.mSourceType << llendl;
}
return LLStringUtil::null;
}
//static
std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args)
{
std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
url += "?name=" + chat.mFromName;
url += "&owner=" + chat.mOwnerID.asString();
std::string slurl = args["slurl"].asString();
if (slurl.empty())
{
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
if(region)
{
LLSLURL region_slurl(region->getName(), chat.mPosAgent);
slurl = region_slurl.getLocationString();
}
}
url += "&slurl=" + LLURI::escape(slurl);
return url;
}

View File

@ -40,6 +40,10 @@ public:
static LLFontGL* getChatFont();
static S32 getChatFontSize();
static void formatChatMsg(const LLChat& chat, std::string& formated_msg);
static std::string getSenderSLURL(const LLChat& chat, const LLSD& args);
private:
static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args);
};

View File

@ -846,9 +846,13 @@ class LLAdvancedCheckFeature : public view_listener_t
void toggle_destination_and_avatar_picker(const LLSD& show)
{
S32 panel_idx = show.isDefined() ? show.asInteger() : -1;
LLView* container = gViewerWindow->getRootView()->getChildView("avatar_picker_and_destination_guide_container");
LLView* container = gViewerWindow->getRootView()->findChildView("avatar_picker_and_destination_guide_container");
if (!container) return;
LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents");
LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents");
if (!destinations || !avatar_picker) return;
LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn");
LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn");
@ -7158,7 +7162,13 @@ LLViewerMenuHolderGL::LLViewerMenuHolderGL(const LLViewerMenuHolderGL::Params& p
BOOL LLViewerMenuHolderGL::hideMenus()
{
BOOL handled = LLMenuHolderGL::hideMenus();
BOOL handled = FALSE;
if (LLMenuHolderGL::hideMenus())
{
LLToolPie::instance().blockClickToWalk();
handled = TRUE;
}
// drop pie menu selection
mParcelSelection = NULL;

View File

@ -1809,6 +1809,11 @@ void LLViewerWindow::initWorldUI()
avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html");
}
if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
{
toggle_destination_and_avatar_picker(0);
gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
}
}
// Destroy the UI

View File

@ -673,4 +673,5 @@ with the same filename but different name
<texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
<texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
<texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
</textures>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -12,6 +12,10 @@
title="XUI PREVIEW TOOL"
translate="false"
width="750">
<string name="ExternalEditorNotSet">
Select an editor by setting the environment variable LL_XUI_EDITOR
or the ExternalEditor setting
or specifying its path in the "Editor Path" field.</string>
<panel
bottom="640"
follows="left|top|right|bottom"

View File

@ -68,7 +68,7 @@ name="Stand Up">
function="Self.EnableStandUp" />
</menu_item_call>
<menu_item_call
label="Change Outfit"
label="My Appearance"
name="Change Outfit">
<menu_item_call.on_click
function="CustomizeAvatar" />

View File

@ -193,7 +193,7 @@
</menu_item_call>
</context_menu>
<menu_item_call
label="Change Outfit"
label="My Appearance"
layout="topleft"
name="Chenge Outfit">
<menu_item_call.on_click

View File

@ -9,7 +9,7 @@
visible="false"
width="128">
<menu_item_check
label="Voice Enabled"
label="Speak Button"
layout="topleft"
name="EnableVoiceChat">
<menu_item_check.on_click
@ -19,7 +19,6 @@
function="CheckControl"
parameter="EnableVoiceChat" />
</menu_item_check>
<menu_item_separator/>
<menu_item_check
label="Gesture button"
layout="topleft"

View File

@ -41,7 +41,7 @@
parameter="agent" />
</menu_item_call>
<menu_item_call
label="Change Outfit"
label="My Appearance"
name="ChangeOutfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
@ -261,6 +261,17 @@
function="Floater.Toggle"
parameter="world_map" />
</menu_item_check>
<menu_item_check
label="Search"
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
label="Snapshot"
name="Take Snapshot"

View File

@ -819,22 +819,6 @@ You need to enter either the Username or both the First and Last name of your av
</notification>
<notification
icon="alertmodal.tga"
name="AddClassified"
type="alertmodal">
Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
You&apos;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.
<tag>confirm</tag>
<usetemplate
ignoretext="How to create a new Classified ad"
name="okcancelignore"
notext="Cancel"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="DeleteClassified"
@ -7001,6 +6985,18 @@ Mute everyone?
To stand up and exit the sitting position, click the Stand button.
</notification>
<notification
name="HintSpeak"
label="Speak"
type="hint"
unique="true">
Click the Speak button to turn your microphone on and off.
Click on the up arrow to see the voice control panel.
Hiding the Speak button will disable the voice feature.
</notification>
<notification
name="HintDestinationGuide"
label="Explore the World"

View File

@ -28,6 +28,10 @@
name="Title">
Script: [NAME]
</panel.string>
<panel.string
name="external_editor_not_set">
Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
</panel.string>
<menu_bar
bg_visible="false"
follows="left|top"

View File

@ -3310,6 +3310,14 @@ Abuse Report</string>
<string name="DeleteItem">Delete selected item?</string>
<string name="EmptyOutfitText">There are no items in this outfit</string>
<!-- External editor status codes -->
<string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string>
<string name="ExternalEditorNotFound">Cannot find the external editor you specified.
Try enclosing path to the editor with double quotes.
(e.g. "/path to my/editor" "%s")</string>
<string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string>
<string name="ExternalEditorFailedToRun">External editor failed to run.</string>
<!-- Key names begin -->
<string name="Esc">Esc</string>

View File

@ -27,9 +27,9 @@
</text>
<check_box label="Chats de grupo" name="EnableGroupChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje de un grupo de chat"/>
<check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/>
<spinner label="Duración de los interlocutores favoritos en los chats:" name="nearby_toasts_lifetime"/>
<spinner label="Tiempo restante de los interlocutores favoritos en los chats:" name="nearby_toasts_fadingtime"/>
<check_box label="Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)" name="translate_chat_checkbox"/>
<spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/>
<spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/>
<check_box label="Usar la traducción automática (con Google) en el chat" name="translate_chat_checkbox"/>
<text name="translate_language_text">
Traducir el chat al:
</text>

View File

@ -55,7 +55,7 @@
</text>
<radio_group name="inworld_typing_preference">
<radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
<radio_item label="Se verá afectado el movimiento (por ejemplo, mediante las teclas WASD)" name="radio_move" value="0"/>
<radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
</radio_group>
<text name="title_afk_text">
Ausente tras:

View File

@ -11,7 +11,7 @@
<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
<check_box label="Mostrar mis Hitos favoritos en Inicio de sesión (mediante el menú desplegable &quot;Empezar en&quot;)" name="favorites_on_login_check"/>
<check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable &quot;Empezar en&quot;)" name="favorites_on_login_check"/>
<text name="Logs:">
Registros de chat:
</text>

View File

@ -32,7 +32,7 @@
<check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
<check_box initial_value="true" label="Activar Javascript" name="browser_javascript_enabled"/>
<check_box initial_value="falso" label="Permitir ventanas emergentes de navegadores de medios" name="media_popup_enabled"/>
<check_box initial_value="falso" label="Permitir las ventanas emergentes en el navegador" name="media_popup_enabled"/>
<check_box initial_value="false" label="Activar web proxy" name="web_proxy_enabled"/>
<text name="Proxy location">
Localización del proxy:

View File

@ -248,7 +248,7 @@ ou divisé.
<text name="group_objects_text">
[COUNT]
</text>
<button label="Afficher" label_selected="Afficher" name="ShowGroup" />
<button label="Afficher" label_selected="Afficher" name="ShowGroup"/>
<button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Owned by others:">
Appartenant à d&apos;autres :
@ -336,7 +336,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
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&apos;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 label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
<check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
<check_box label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
<combo_box name="land category with adult">
<combo_box.item label="Toutes catégories" name="item0"/>
@ -351,6 +351,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<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="Location" name="item13"/>
<combo_box.item label="Autre" name="item12"/>
</combo_box>
<combo_box name="land category">
@ -365,6 +366,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<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="Location" name="item13"/>
<combo_box.item label="Autre" name="item12"/>
</combo_box>
<check_box label="Contenu Modéré" name="MatureCheck" tool_tip=""/>
@ -444,7 +446,7 @@ musique :
(défini par le domaine
</panel.string>
<panel.string name="allow_public_access">
Autoriser l&apos;accès public ([MATURITY])
Autoriser l&apos;accès public ([MATURITY]) (Remarque : des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)
</panel.string>
<panel.string name="estate_override">
Au moins une de ces options est définie au niveau du domaine.

View File

@ -1,32 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Map" title="">
<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">
[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)
</floater.string>
<floater.string name="AltToolTipMsg">
[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)
</floater.string>
<floater.string name="mini_map_caption">
MINI-CARTE
</floater.string>

View File

@ -64,6 +64,8 @@
<radio_item label="Choisir une face" name="radio select face"/>
</radio_group>
<check_box label="Modification liée" name="checkbox edit linked parts"/>
<button label="Lien" name="link_btn"/>
<button label="Annuler le lien" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="Affiche le coût du rendu calculé pour cet objet">
þ : [COUNT]
</text>

View File

@ -5,7 +5,7 @@
<menu_item_call label="Détacher" name="Detach"/>
<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
<menu_item_call label="Me lever" name="Stand Up"/>
<menu_item_call label="Changer de tenue" name="Change Outfit"/>
<menu_item_call label="Mon apparence" name="Change Outfit"/>
<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Mes amis" name="Friends..."/>

View File

@ -21,7 +21,7 @@
<context_menu label="Détacher" name="Object Detach"/>
<menu_item_call label="Tout détacher" name="Detach All"/>
</context_menu>
<menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
<menu_item_call label="Mon apparence" name="Chenge Outfit"/>
<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Mes amis" name="Friends..."/>

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
<menu_item_check label="Voix activée" name="EnableVoiceChat"/>
<menu_item_check label="Bouton Geste" name="ShowGestureButton"/>
<menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
<menu_item_check label="Bouton Affichage" name="ShowCameraButton"/>
<menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/>
<menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/>
<menu_item_check label="Bouton Construire" name="ShowBuildButton"/>
<menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/>
<menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<toggleable_menu name="Gear Menu">
<menu_item_call label="Voir le profil" name="view_profile"/>
<menu_item_call label="Devenir amis" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
@ -11,9 +11,11 @@
<menu_item_call label="Signaler" name="report"/>
<menu_item_call label="Figer" name="freeze"/>
<menu_item_call label="Expulser" name="eject"/>
<menu_item_call label="Éjecter" name="kick"/>
<menu_item_call label="Représentant de l&apos;Assistance client" name="csr"/>
<menu_item_call label="Déboguer les textures" name="debug"/>
<menu_item_call label="Situer sur la carte" name="find_on_map"/>
<menu_item_call label="Zoomer en avant" name="zoom_in"/>
<menu_item_call label="Payer" name="pay"/>
<menu_item_call label="Partager" name="share"/>
</menu>
</toggleable_menu>

View File

@ -1,10 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="M&apos;asseoir" name="sit_down_here"/>
<menu_item_call label="Me lever" name="stand_up"/>
<menu_item_call label="Changer de tenue" name="change_outfit"/>
<menu_item_call label="Mon profil" name="my_profile"/>
<menu_item_call label="Mes amis" name="my_friends"/>
<menu_item_call label="Mes groupes" name="my_groups"/>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Gear Menu">
<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
<menu_item_call label="Me lever" name="Stand Up"/>
<context_menu label="Enlever" name="Take Off &gt;">
<context_menu label="Habits" name="Clothes &gt;">
<menu_item_call label="Chemise" name="Shirt"/>
<menu_item_call label="Pantalon" name="Pants"/>
<menu_item_call label="Jupe" name="Skirt"/>
<menu_item_call label="Chaussures" name="Shoes"/>
<menu_item_call label="Chaussettes" name="Socks"/>
<menu_item_call label="Veste" name="Jacket"/>
<menu_item_call label="Gants" name="Gloves"/>
<menu_item_call label="Débardeur" name="Self Undershirt"/>
<menu_item_call label="Caleçon" name="Self Underpants"/>
<menu_item_call label="Tatouage" name="Self Tattoo"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Tous les habits" name="All Clothes"/>
</context_menu>
<context_menu label="HUD" name="Object Detach HUD"/>
<context_menu label="Détacher" name="Object Detach"/>
<menu_item_call label="Tout détacher" name="Detach All"/>
</context_menu>
<menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mes groupes" name="Groups..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
<menu_item_call label="Déboguer les textures" name="Debug..."/>
</menu>
</toggleable_menu>

View File

@ -3,6 +3,7 @@
<menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="new_window"/>
<menu_item_check label="Trier par nom" name="sort_by_name"/>
<menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/>
<menu_item_check label="Toujours trier les dossiers par nom" name="sort_folders_by_name"/>
<menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/>
<menu_item_call label="Afficher les filtres" name="show_filters"/>
<menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>

View File

@ -16,14 +16,14 @@
<context_menu label="Attacher" name="Object Attach"/>
<context_menu label="Attacher HUD" name="Object Attach HUD"/>
</context_menu>
<context_menu label="Supprimer" name="Remove">
<context_menu label="Gérer" name="Remove">
<menu_item_call label="Signaler une infraction" name="Report Abuse..."/>
<menu_item_call label="Ignorer" name="Object Mute"/>
<menu_item_call label="Retour" name="Return..."/>
<menu_item_call label="Supprimer" name="Delete"/>
</context_menu>
<menu_item_call label="Prendre" name="Pie Object Take"/>
<menu_item_call label="Prendre une copie" name="Take Copy"/>
<menu_item_call label="Payer" name="Pay..."/>
<menu_item_call label="Acheter" name="Buy..."/>
<menu_item_call label="Supprimer" name="Delete"/>
</context_menu>

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_folder_gear">
<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Ajouter un repère" name="add_landmark"/>
<menu_item_call label="Ajouter un dossier" name="add_folder"/>
<menu_item_call label="Restaurer l&apos;article" name="restore_item"/>
<menu_item_call label="Couper" name="cut"/>
<menu_item_call label="Copier" name="copy_folder"/>
<menu_item_call label="Coller" name="paste"/>
@ -12,4 +13,4 @@
<menu_item_call label="Développer tous les dossiers" name="expand_all"/>
<menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
<menu_item_check label="Trier par date" name="sort_by_date"/>
</menu>
</toggleable_menu>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_ladmark_gear">
<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Téléporter" name="teleport"/>
<menu_item_call label="Plus d&apos;informations" name="more_info"/>
<menu_item_call label="Voir sur la carte" name="show_on_map"/>
<menu_item_call label="Ajouter un repère" name="add_landmark"/>
<menu_item_call label="Ajouter un dossier" name="add_folder"/>
<menu_item_call label="Restaurer l&apos;article" name="restore_item"/>
<menu_item_call label="Couper" name="cut"/>
<menu_item_call label="Copier le repère" name="copy_landmark"/>
<menu_item_call label="Copier la SLurl" name="copy_slurl"/>
@ -15,4 +16,4 @@
<menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
<menu_item_check label="Trier par date" name="sort_by_date"/>
<menu_item_call label="Créer un favori" name="create_pick"/>
</menu>
</toggleable_menu>

View File

@ -7,7 +7,7 @@
</menu_item_call>
<menu_item_call label="Acheter des L$" name="Buy and Sell L$"/>
<menu_item_call label="Mon profil" name="Profile"/>
<menu_item_call label="Changer de tenue" name="ChangeOutfit"/>
<menu_item_call label="Mon apparence" name="ChangeOutfit"/>
<menu_item_check label="Mon inventaire" name="Inventory"/>
<menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/>
<menu_item_check label="Mes gestes" name="Gestures"/>
@ -35,6 +35,7 @@
<menu label="Monde" name="World">
<menu_item_check label="Mini-carte" name="Mini-Map"/>
<menu_item_check label="Carte du monde" name="World Map"/>
<menu_item_check label="Rechercher" name="Search"/>
<menu_item_call label="Photo" name="Take Snapshot"/>
<menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
<menu label="Profil du lieu" name="Land">
@ -227,8 +228,10 @@
<menu label="Afficher les infos" name="Display Info">
<menu_item_check label="Afficher l&apos;heure" name="Show Time"/>
<menu_item_check label="Afficher les infos de rendu" name="Show Render Info"/>
<menu_item_check label="Afficher les infos de texture" name="Show Texture Info"/>
<menu_item_check label="Afficher les matrices" name="Show Matrices"/>
<menu_item_check label="Afficher la couleur sous le curseur" name="Show Color Under Cursor"/>
<menu_item_check label="Afficher la mémoire" name="Show Memory"/>
<menu_item_check label="Afficher les mises à jour des objets" name="Show Updates"/>
</menu>
<menu label="Forcer une erreur" name="Force Errors">
@ -253,6 +256,7 @@
<menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
<menu_item_check label="Occlusion" name="Occlusion"/>
<menu_item_check label="Lots de rendu" name="Render Batches"/>
<menu_item_check label="Type de mise à jour" name="Update Type"/>
<menu_item_check label="Texture Anim" name="Texture Anim"/>
<menu_item_check label="Priorité de la texture" name="Texture Priority"/>
<menu_item_check label="Zone de texture" name="Texture Area"/>

View File

@ -73,7 +73,7 @@ Détails de l&apos;erreur : La notification, appelée &apos;[_NAME]&apos;, est i
</notification>
<notification name="LoginFailedNoNetwork">
Connexion à [SECOND_LIFE_GRID] impossible.
&apos;[DIAGNOSTIC]&apos;
&apos;[DIAGNOSTIC]&apos;
Veuillez vérifier votre connexion Internet.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@ -332,13 +332,6 @@ Pour entrer dans [SECOND_LIFE], vous devez disposer d&apos;un compte. Voulez-vou
<notification name="InvalidCredentialFormat">
Saisissez soit le nom d&apos;utilisateur soit à la fois le prénom et le nom de votre avatar dans le champ Nom d&apos;utilisateur, puis connectez-vous.
</notification>
<notification name="AddClassified">
Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant une semaine.
Rédigez votre annonce, puis cliquez sur Publier pour l&apos;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&apos;annonce [NAME] ?
Une fois payés, les frais ne sont pas remboursables.
@ -2848,9 +2841,6 @@ Ignorer les autres ?
<notification label="Explorer le monde" name="HintDestinationGuide">
Le Guide des destinations comprend des milliers d&apos;endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l&apos;explorer.
</notification>
<notification label="Changer d&apos;apparence" name="HintAvatarPicker">
Vous souhaitez changer de look ? Cliquez sur le bouton ci-dessous pour voir plus d&apos;avatars.
</notification>
<notification label="Panneau latéral" name="HintSidePanel">
Obtenir un accès rapide à votre inventaire, à vos habits, à vos profils et bien plus encore dans le panneau latéral.
</notification>
@ -2888,6 +2878,38 @@ Ignorer les autres ?
<button name="cancel" text="Annuler"/>
</form>
</notification>
<notification label="" name="ModeChange">
Vous devez quitter et redémarrer l&apos;application afin de changer de mode.
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification label="" name="NoClassifieds">
Pour créer et modifier des petites annonces, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification label="" name="NoGroupInfo">
Pour créer et modifier des groupes, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification label="" name="NoPicks">
Pour créer et modifier des favoris, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification label="" name="NoWorldMap">
Pour afficher la carte du monde, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification label="" name="NoVoiceCall">
Les appels vocaux sont uniquement disponibles en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification label="" name="NoAvatarShare">
Le partage est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification label="" name="NoAvatarPay">
Pour pouvoir payer d&apos;autres résidents, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<global name="UnsupportedCPU">
- Votre processeur ne remplit pas les conditions minimum requises.
</global>

View File

@ -17,6 +17,13 @@
</text>
<check_box label="Enregistrer" name="remember_check"/>
<button label="Connexion" name="connect_btn"/>
<text name="mode_selection_text">
Mode :
</text>
<combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
<combo_box.item label="Basique" name="Basic"/>
<combo_box.item label="Avancé" name="Advanced"/>
</combo_box>
<text name="start_location_text">
Lieu de départ :
</text>

View File

@ -19,7 +19,7 @@
<button label="Arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/>
<button label="Lire" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/>
<button name="open_prefs_btn" tool_tip="Ouvrir les préférences de média"/>
<button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="more_btn" tool_tip="Options avancées"/>
<button label="Plus &gt;&gt;" label_selected="&lt;&lt; Moins" name="more_btn" tool_tip="Options avancées"/>
<button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="less_btn" tool_tip="Options avancées"/>
</panel>
<panel name="nearby_media_panel">

View File

@ -18,6 +18,8 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
<string name="groups_filter_label" value="Filtrer les groupes"/>
<string name="no_filtered_groups_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/>
<string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/>
<string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/>
<string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/>
<filter_editor label="Filtre" name="filter_input"/>
<tab_container name="tabs">
<panel label="PRÈS DE VOUS" name="nearby_panel">

View File

@ -16,6 +16,12 @@
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
<string name="name_text_args">
[NAME]
</string>
<string name="display_name_text_args">
[DISPLAY_NAME]
</string>
<layout_stack name="layout">
<layout_panel name="profile_stack">
<scroll_container name="profile_scroll">
@ -34,7 +40,7 @@
</text_editor>
<text name="title_partner_text" value="Partenaire :"/>
<panel name="partner_data_panel">
<name_box initial_value="(récupération en cours)" name="partner_text"/>
<text initial_value="(récupération en cours)" name="partner_text"/>
</panel>
<text name="title_groups_text" value="Groupes :"/>
</panel>

View File

@ -15,6 +15,9 @@
<panel.string name="Title">
Script : [NAME]
</panel.string>
<panel.string name="external_editor_not_set">
Sélectionnez un éditeur en définissant la variable d&apos;environnement LL_SCRIPT_EDITOR ou le paramètre ExternalEditor.
</panel.string>
<menu_bar name="script_menu">
<menu label="Fichier" name="File">
<menu_item_call label="Enregistrer" name="Save"/>

View File

@ -1067,7 +1067,7 @@
<string name="PermNo">
Non
</string>
<string name="Chat" value=" Chat :"/>
<string name="Chat Message" value="Chat :"/>
<string name="Sound" value=" Son :"/>
<string name="Wait" value=" --- Attendre :"/>
<string name="AnimFlagStop" value=" Arrêter l&apos;animation :"/>
@ -1864,12 +1864,6 @@
<string name="accel-win-shift">
Maj+
</string>
<string name="Esc">
Échap
</string>
<string name="Home">
Début
</string>
<string name="FileSaved">
Fichier enregistré
</string>
@ -1889,7 +1883,7 @@
PDT
</string>
<string name="Direction_Forward">
Vers l&apos;avant
Avant
</string>
<string name="Direction_Left">
Gauche
@ -1987,6 +1981,9 @@
<string name="Other">
Autre
</string>
<string name="Rental">
Location
</string>
<string name="Any">
Aucun
</string>
@ -3966,7 +3963,7 @@ de l&apos;infraction signalée
<string name="Notices">
Notices
</string>
<string name="Chat">
<string name="Chat" value=" Chat :">
Chat
</string>
<string name="DeleteItems">
@ -3978,4 +3975,348 @@ de l&apos;infraction signalée
<string name="EmptyOutfitText">
Cette tenue ne contient aucun article.
</string>
<string name="ExternalEditorNotSet">
Sélectionnez un éditeur à l&apos;aide du paramètre ExternalEditor.
</string>
<string name="ExternalEditorNotFound">
Éditeur externe spécifié introuvable.
Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
(par ex. : &quot;/chemin_accès/editor&quot; &quot;%s&quot;).
</string>
<string name="ExternalEditorCommandParseError">
Erreur lors de l&apos;analyse de la commande d&apos;éditeur externe.
</string>
<string name="ExternalEditorFailedToRun">
Échec d&apos;exécution de l&apos;éditeur externe.
</string>
<string name="Esc">
Échap
</string>
<string name="Space">
Space
</string>
<string name="Enter">
Enter
</string>
<string name="Tab">
Tab
</string>
<string name="Ins">
Ins
</string>
<string name="Del">
Del
</string>
<string name="Backsp">
Backsp
</string>
<string name="Shift">
Shift
</string>
<string name="Ctrl">
Ctrl
</string>
<string name="Alt">
Alt
</string>
<string name="CapsLock">
CapsLock
</string>
<string name="Home">
Début
</string>
<string name="End">
End
</string>
<string name="PgUp">
PgUp
</string>
<string name="PgDn">
PgDn
</string>
<string name="F1">
F1
</string>
<string name="F2">
F2
</string>
<string name="F3">
F3
</string>
<string name="F4">
F4
</string>
<string name="F5">
F5
</string>
<string name="F6">
F6
</string>
<string name="F7">
F7
</string>
<string name="F8">
F8
</string>
<string name="F9">
F9
</string>
<string name="F10">
F10
</string>
<string name="F11">
F11
</string>
<string name="F12">
F12
</string>
<string name="Add">
Ajouter
</string>
<string name="Subtract">
Soustraire
</string>
<string name="Multiply">
Multiplier
</string>
<string name="Divide">
Diviser
</string>
<string name="PAD_DIVIDE">
PAD_DIVIDE
</string>
<string name="PAD_LEFT">
PAD_LEFT
</string>
<string name="PAD_RIGHT">
PAD_RIGHT
</string>
<string name="PAD_DOWN">
PAD_DOWN
</string>
<string name="PAD_UP">
PAD_UP
</string>
<string name="PAD_HOME">
PAD_HOME
</string>
<string name="PAD_END">
PAD_END
</string>
<string name="PAD_PGUP">
PAD_PGUP
</string>
<string name="PAD_PGDN">
PAD_PGDN
</string>
<string name="PAD_CENTER">
PAD_CENTER
</string>
<string name="PAD_INS">
PAD_INS
</string>
<string name="PAD_DEL">
PAD_DEL
</string>
<string name="PAD_Enter">
PAD_Enter
</string>
<string name="PAD_BUTTON0">
PAD_BUTTON0
</string>
<string name="PAD_BUTTON1">
PAD_BUTTON1
</string>
<string name="PAD_BUTTON2">
PAD_BUTTON2
</string>
<string name="PAD_BUTTON3">
PAD_BUTTON3
</string>
<string name="PAD_BUTTON4">
PAD_BUTTON4
</string>
<string name="PAD_BUTTON5">
PAD_BUTTON5
</string>
<string name="PAD_BUTTON6">
PAD_BUTTON6
</string>
<string name="PAD_BUTTON7">
PAD_BUTTON7
</string>
<string name="PAD_BUTTON8">
PAD_BUTTON8
</string>
<string name="PAD_BUTTON9">
PAD_BUTTON9
</string>
<string name="PAD_BUTTON10">
PAD_BUTTON10
</string>
<string name="PAD_BUTTON11">
PAD_BUTTON11
</string>
<string name="PAD_BUTTON12">
PAD_BUTTON12
</string>
<string name="PAD_BUTTON13">
PAD_BUTTON13
</string>
<string name="PAD_BUTTON14">
PAD_BUTTON14
</string>
<string name="PAD_BUTTON15">
PAD_BUTTON15
</string>
<string name="-">
-
</string>
<string name="=">
=
</string>
<string name="`">
`
</string>
<string name=";">
;
</string>
<string name="[">
[
</string>
<string name="]">
]
</string>
<string name="\">
\
</string>
<string name="0">
0
</string>
<string name="1">
1
</string>
<string name="2">
2
</string>
<string name="3">
3
</string>
<string name="4">
4
</string>
<string name="5">
5
</string>
<string name="6">
6
</string>
<string name="7">
7
</string>
<string name="8">
8
</string>
<string name="9">
9
</string>
<string name="A">
A
</string>
<string name="B">
B
</string>
<string name="C">
C
</string>
<string name="D">
D
</string>
<string name="E">
E
</string>
<string name="F">
F
</string>
<string name="G">
G
</string>
<string name="H">
H
</string>
<string name="I">
I
</string>
<string name="J">
J
</string>
<string name="K">
K
</string>
<string name="L">
L
</string>
<string name="M">
M
</string>
<string name="N">
N
</string>
<string name="O">
O
</string>
<string name="P">
P
</string>
<string name="Q">
Q
</string>
<string name="R">
R
</string>
<string name="S">
S
</string>
<string name="T">
T
</string>
<string name="U">
U
</string>
<string name="V">
V
</string>
<string name="W">
W
</string>
<string name="X">
X
</string>
<string name="Y">
Y
</string>
<string name="Z">
Z
</string>
<string name="BeaconParticle">
Affichage des balises de particule (bleu)
</string>
<string name="BeaconPhysical">
Affichage des balises d&apos;objet physique (vert)
</string>
<string name="BeaconScripted">
Affichage des balises d&apos;objet scripté (rouge)
</string>
<string name="BeaconScriptedTouch">
Affichage des balises d&apos;objet scripté avec fonction de toucher (rouge)
</string>
<string name="BeaconSound">
Affichage des balises de son (jaune)
</string>
<string name="BeaconMedia">
Affichage des balises de média (blanc)
</string>
<string name="ParticleHiding">
Masquage des particules
</string>
</strings>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="MEDIEN-BROWSER">
<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="Vorwärts" name="forward"/>
<button label="Neu laden" name="reload"/>
<button label="Los" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
<button label="zurück" name="rewind"/>
<button label="anhalten" name="stop"/>
<button label="vorwärts" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
<button label="Aktuelle Seite 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>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_web_content" title="">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button name="back" tool_tip="Rückwärts"/>
<button name="forward" tool_tip="Vorwärts"/>
<button name="stop" tool_tip="Navigation stoppen"/>
<button name="reload" tool_tip="Seite neu laden"/>
<combo_box name="address" tool_tip="URL hier eingeben"/>
<icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/>
<button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/>
</layout_panel>
</layout_stack>
</floater>

View File

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="Hinsetzen" name="sit_down_here"/>
<menu_item_call label="Aufstehen" name="stand_up"/>
<menu_item_call label="Outfit ändern" name="change_outfit"/>
<menu_item_call label="Mein Profil" name="my_profile"/>
<menu_item_call label="Meine Freunde" name="my_friends"/>
<menu_item_call label="Meine Gruppen" name="my_groups"/>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Self Pie">
<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
<menu_item_call label="Aufstehen" name="Stand Up"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>
<menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
</menu>
</toggleable_menu>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<notifications>
<notification name="UserGiveItem">
[NAME_SLURL] bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm.
<form name="form">
<button name="Show" text="Artikel behalten"/>
<button name="Discard" text="Artikel ablehnen"/>
<button name="Mute" text="Benutzer blockieren"/>
</form>
</notification>
<notification name="ObjectGiveItem">
Ein Objekt namens &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, das [NAME_SLURL] gehört, bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm.
<form name="form">
<button name="Keep" text="Artikel behalten"/>
<button name="Discard" text="Artikel ablehnen"/>
<button name="Mute" text="Objekt blockieren"/>
</form>
</notification>
</notifications>

View File

@ -11,10 +11,10 @@
<bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerasteuerung anzeigen/ausblenden"/>
</layout_panel>
<layout_panel name="avatar_and_destinations_panel">
<radio_group name="avatar_and_destination_btns">
<radio_item name="destination_btn" value="0"/>
<radio_item name="avatar_btn" value="1"/>
</radio_group>
<bottomtray_button label="Ziele" name="destination_btn" tool_tip="Zeigt Leutefenster an"/>
</layout_panel>
<layout_panel name="avatar_and_destinations_panel">
<bottomtray_button label="Mein Avatar" name="avatar_btn"/>
</layout_panel>
<layout_panel name="people_panel">
<bottomtray_button label="Leute" name="show_people_button" tool_tip="Zeigt Leutefenster an"/>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
<layout_stack name="vertical_stack">
<layout_panel name="end_call_btn_panel">
<button label="Anruf beenden" name="end_call_btn"/>
</layout_panel>
<layout_panel name="voice_ctrls_btn_panel">
<button label="Voice-Steuerung öffnen" name="voice_ctrls_btn"/>
</layout_panel>
</layout_stack>
</panel>

View File

@ -20,8 +20,8 @@
<text name="mode_selection_text">
Modus:
</text>
<combo_box name="mode_combo">
<combo_box.item label="Einfach (Standard)" name="Basic"/>
<combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: schnelles, einfaches Erkunden und Chatten. Erweitert: Zugriff auf zusätzliche Funktionen.">
<combo_box.item label="Basis" name="Basic"/>
<combo_box.item label="Erweitert" name="Advanced"/>
</combo_box>
</layout_panel>

View File

@ -8,12 +8,12 @@
min_height="360"
left="645"
top="10"
min_width="300"
min_width="345"
name="floater_help_browser"
save_rect="true"
single_instance="true"
title="HOW TO"
width="300">
width="335">
<floater.string
name="loading_text">
Loading...
@ -29,14 +29,14 @@
orientation="vertical"
name="stack1"
top="20"
width="290">
width="325">
<layout_panel
layout="topleft"
left_delta="0"
top_delta="0"
name="external_controls"
user_resize="false"
width="280">
width="325">
<web_browser
trusted_content="true"
bottom="-5"
@ -46,7 +46,7 @@
name="browser"
top="0"
height="300"
width="280" />
width="325" />
</layout_panel>
</layout_stack>
</floater>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="EXPLORADOR DE MEDIA">
<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="Atrás" name="back"/>
<button label="Adelante" name="forward"/>
<button label="Recargar" name="reload"/>
<button label="Ir" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
<button label="rebobinar" name="rewind"/>
<button label="parar" name="stop"/>
<button label="avanzar" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
<button label="Enviar a la parcela la página actual" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Abrir en mi propio navegador" name="open_browser"/>
<check_box label="Abrir siempre en mi propio navegador" name="open_always"/>
<button label="Cerrar" name="close"/>
</layout_panel>
</layout_stack>
</floater>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_web_content" title="">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button name="back" tool_tip="Navegar hacia atrás"/>
<button name="forward" tool_tip="Navegar hacia adelante"/>
<button name="stop" tool_tip="Parar navegación"/>
<button name="reload" tool_tip="Recargar página"/>
<combo_box name="address" tool_tip="Escribe la URL aquí"/>
<icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
<button name="popexternal" tool_tip="Abrir la URL actual en tu explorador de escritorio"/>
</layout_panel>
</layout_stack>
</floater>

View File

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="Sentarte" name="sit_down_here"/>
<menu_item_call label="Levantarme" name="stand_up"/>
<menu_item_call label="Cambiar vestuario" name="change_outfit"/>
<menu_item_call label="Mi perfil" name="my_profile"/>
<menu_item_call label="Mis amigos" name="my_friends"/>
<menu_item_call label="Mis grupos" name="my_groups"/>
<menu_item_call label="Depurar las texturas" name="Debug..."/>
</menu>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Self Pie">
<menu_item_call label="Sentarme" name="Sit Down Here"/>
<menu_item_call label="Levantarme" name="Stand Up"/>
<menu_item_call label="Mis amigos" name="Friends..."/>
<menu_item_call label="Mi perfil" name="Profile..."/>
<menu_item_call label="Depurar texturas" name="Debug..."/>
</toggleable_menu>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<notifications>
<notification name="UserGiveItem">
[NAME_SLURL] te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión.
<form name="form">
<button name="Show" text="Conservar ítem"/>
<button name="Discard" text="Rechazar ítem"/>
<button name="Mute" text="Bloquear usuario"/>
</form>
</notification>
<notification name="ObjectGiveItem">
Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión.
<form name="form">
<button name="Keep" text="Conservar ítem"/>
<button name="Discard" text="Rechazar ítem"/>
<button name="Mute" text="Bloquear objeto"/>
</form>
</notification>
</notifications>

View File

@ -11,10 +11,10 @@
<bottomtray_button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/>
</layout_panel>
<layout_panel name="avatar_and_destinations_panel">
<radio_group name="avatar_and_destination_btns">
<radio_item name="destination_btn" value="0"/>
<radio_item name="avatar_btn" value="1"/>
</radio_group>
<bottomtray_button label="Destinos" name="destination_btn" tool_tip="Muestra la ventana de gente"/>
</layout_panel>
<layout_panel name="avatar_and_destinations_panel">
<bottomtray_button label="Mi avatar" name="avatar_btn"/>
</layout_panel>
<layout_panel name="people_panel">
<bottomtray_button label="Gente" name="show_people_button" tool_tip="Muestra la ventana de gente"/>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
<layout_stack name="vertical_stack">
<layout_panel name="end_call_btn_panel">
<button label="Colgar" name="end_call_btn"/>
</layout_panel>
<layout_panel name="voice_ctrls_btn_panel">
<button label="Abrir los controles de la voz" name="voice_ctrls_btn"/>
</layout_panel>
</layout_stack>
</panel>

View File

@ -20,8 +20,8 @@
<text name="mode_selection_text">
Modo:
</text>
<combo_box name="mode_combo">
<combo_box.item label="Básico (Predeterminado)" name="Basic"/>
<combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
<combo_box.item label="Básico" name="Basic"/>
<combo_box.item label="Avanzado" name="Advanced"/>
</combo_box>
</layout_panel>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="NAVIGATEUR DE MÉDIAS">
<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." name="back"/>
<button label="Suiv." name="forward"/>
<button label="Recharger" name="reload"/>
<button label="OK" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
<button label="retour" name="rewind"/>
<button label="stop" name="stop"/>
<button label="avance" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
<button label="Envoyer la page actuelle à la parcelle" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Ouvrir dans mon navigateur Web" name="open_browser"/>
<check_box label="Toujours ouvrir dans mon navigateur Web" name="open_always"/>
<button label="Fermer" name="close"/>
</layout_panel>
</layout_stack>
</floater>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_web_content" title="">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button name="back" tool_tip="Précédente"/>
<button name="forward" tool_tip="Suivante"/>
<button name="stop" tool_tip="Arrêter"/>
<button name="reload" tool_tip="Recharger la page"/>
<combo_box name="address" tool_tip="Saisir une URL ici"/>
<icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/>
<button name="popexternal" tool_tip="Ouvrir l&apos;URL actuelle dans votre navigateur de bureau"/>
</layout_panel>
</layout_stack>
</floater>

View File

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="M&apos;asseoir" name="sit_down_here"/>
<menu_item_call label="Me lever" name="stand_up"/>
<menu_item_call label="Changer de tenue" name="change_outfit"/>
<menu_item_call label="Mon profil" name="my_profile"/>
<menu_item_call label="Mes amis" name="my_friends"/>
<menu_item_call label="Mes groupes" name="my_groups"/>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Self Pie">
<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
<menu_item_call label="Me lever" name="Stand Up"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
<menu_item_call label="Déboguer les textures" name="Debug..."/>
</menu>
</toggleable_menu>

View File

@ -9,5 +9,5 @@
<menu_item_call label="Partager" name="Share"/>
<menu_item_call label="Payer" name="Pay"/>
<menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/>
<menu_item_call label="Proposer une téléportation" name="teleport"/>
<menu_item_call label="Téléporter" name="teleport"/>
</context_menu>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<notifications>
<notification name="UserGiveItem">
[NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L&apos;article se trouve dans votre inventaire. Pour changer de mode, quittez l&apos;application, redémarrez-la, puis sélectionnez un autre mode sur l&apos;écran de connexion.
<form name="form">
<button name="Show" text="Garder l&apos;article"/>
<button name="Discard" text="Refuser l&apos;article"/>
<button name="Mute" text="Ignorer l&apos;utilisateur"/>
</form>
</notification>
<notification name="ObjectGiveItem">
Un objet nommé &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; appartenant à [NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L&apos;article se trouve dans votre inventaire. Pour changer de mode, quittez l&apos;application, redémarrez-la, puis sélectionnez un autre mode sur l&apos;écran de connexion.
<form name="form">
<button name="Keep" text="Garder l&apos;article"/>
<button name="Discard" text="Refuser l&apos;article"/>
<button name="Mute" text="Ignorer l&apos;objet"/>
</form>
</notification>
</notifications>

Some files were not shown because too many files have changed in this diff Show More