master
Brad Payne (Vir Linden) 2011-07-21 16:26:52 -04:00
commit ca5bd96bb0
181 changed files with 5198 additions and 1163 deletions

View File

@ -129,6 +129,8 @@ dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1
a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
@ -136,6 +138,8 @@ e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release
be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
@ -144,3 +148,8 @@ a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release
09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1
09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1
e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1

View File

@ -14,8 +14,8 @@ public_build = true
# skip windows debug build until we can get a fix in.
build_CYGWIN_Debug = false
# Update Public Inworld Build Status Indicators
email_status_this_is_os = false
# Update Public Inworld Build Status Indicators (setting should mirror "public_build")
email_status_this_is_os = true
# Limit extent of codeticket updates to revisions after...
codeticket_since = 2.2.0-release
@ -183,6 +183,7 @@ viewer-asset-delivery-metrics.build_server_tests = false
# Simon says
# ========================================
simon_viewer-dev-private.public_build = false
simon_viewer-dev-private.email_status_this_is_os = false
# eof

View File

@ -209,7 +209,7 @@ do
end_section BuildParallel
else
begin_section "Build$variant"
build "$variant" "$build_dir" 2>&1 | tee -a "$build_log" | grep --line-buffered "^##teamcity"
build "$variant" "$build_dir" 2>&1 | tee -a "$build_log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
if `cat "$build_dir/build_ok"`
then
echo so far so good.
@ -238,7 +238,7 @@ then
begin_section "Build$variant"
build_dir=`build_dir_$arch $variant`
build_dir_stubs="$build_dir/win_setup/$variant"
tee -a $build_log < "$build_dir/build.log" | grep --line-buffered "^##teamcity"
tee -a $build_log < "$build_dir/build.log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
if `cat "$build_dir/build_ok"`
then
echo so far so good.

View File

@ -203,6 +203,7 @@ Boroondas Gupte
OPEN-29
OPEN-39
OPEN-39
OPEN-99
SNOW-278
SNOW-503
SNOW-510

View File

@ -171,7 +171,10 @@ if (LINUX)
add_definitions(-fvisibility=hidden)
# don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The viewer doesn't need to catch SIGCHLD anyway.
add_definitions(-DLL_IGNORE_SIGCHLD)
add_definitions(-march=pentium4 -mfpmath=sse)
if (WORD_SIZE EQUAL 32)
add_definitions(-march=pentium4)
endif (WORD_SIZE EQUAL 32)
add_definitions(-mfpmath=sse)
#add_definitions(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
if (NOT STANDALONE)
# this stops us requiring a really recent glibc at runtime

View File

@ -24,16 +24,24 @@
* $/LicenseInfo$
*/
#include "linden_common.h"
#include "llcrashloggerlinux.h"
int main(int argc, char **argv)
{
llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerLinux app;
app.parseCommandOptions(argc, argv);
app.init();
if (! app.init())
{
llwarns << "Unable to initialize application." << llendl;
return 1;
}
app.mainLoop();
app.cleanup();
llinfos << "Crash reporter finished normally." << llendl;
return 0;
}

View File

@ -30,8 +30,6 @@
#include "linden_common.h"
#include "boost/tokenizer.hpp"
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
#include "llfile.h"

View File

@ -387,8 +387,6 @@ const S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000;
const S32 MAP_SIM_PRELUDE = 0x00020000;
// Crash reporter behavior
const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
const char* const CRASH_BEHAVIOR_SETTING = "CrashSubmitBehavior";
const S32 CRASH_BEHAVIOR_ASK = 0;
const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1;
const S32 CRASH_BEHAVIOR_NEVER_SEND = 2;

View File

@ -1,6 +1,6 @@
/**
* @file llsys.cpp
* @brief Impelementation of the basic system query functions.
* @brief Implementation of the basic system query functions.
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
#if LL_WINDOWS
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
#endif
#include "linden_common.h"
#include "llsys.h"
@ -36,22 +40,43 @@
#endif
#include "llprocessor.h"
#include "llerrorcontrol.h"
#include "llevents.h"
#include "lltimer.h"
#include "llsdserialize.h"
#include "llsdutil.h"
#include <boost/bind.hpp>
#include <boost/circular_buffer.hpp>
#include <boost/regex.hpp>
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/range.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/is_float.hpp>
using namespace llsd;
#if LL_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <winsock2.h>
# include <windows.h>
# include <psapi.h> // GetPerformanceInfo() et al.
#elif LL_DARWIN
# include <errno.h>
# include <sys/sysctl.h>
# include <sys/utsname.h>
# include <stdint.h>
# include <Carbon/Carbon.h>
# include <sys/wait.h>
# include <string.h>
# include <stdexcept>
#elif LL_LINUX
# include <errno.h>
# include <sys/utsname.h>
# include <unistd.h>
# include <sys/sysinfo.h>
# include <stdexcept>
const char MEMINFO_FILE[] = "/proc/meminfo";
#elif LL_SOLARIS
# include <stdio.h>
@ -70,6 +95,15 @@ extern int errno;
static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
// Don't log memory info any more often than this. It also serves as our
// framerate sample size.
static const F32 MEM_INFO_THROTTLE = 20;
// Sliding window of samples. We intentionally limit the length of time we
// remember "the slowest" framerate because framerate is very slow at login.
// If we only triggered FrameWatcher logging when the session framerate
// dropped below the login framerate, we'd have very little additional data.
static const F32 MEM_INFO_WINDOW = 10*60;
#if LL_WINDOWS
#ifndef DLLVERSIONINFO
typedef struct _DllVersionInfo
@ -613,8 +647,78 @@ void LLCPUInfo::stream(std::ostream& s) const
s << "->mCPUString: " << mCPUString << std::endl;
}
// Helper class for LLMemoryInfo: accumulate stats in the form we store for
// LLMemoryInfo::getStatsMap().
class Stats
{
public:
Stats():
mStats(LLSD::emptyMap())
{}
// Store every integer type as LLSD::Integer.
template <class T>
void add(const LLSD::String& name, const T& value,
typename boost::enable_if<boost::is_integral<T> >::type* = 0)
{
mStats[name] = LLSD::Integer(value);
}
// Store every floating-point type as LLSD::Real.
template <class T>
void add(const LLSD::String& name, const T& value,
typename boost::enable_if<boost::is_float<T> >::type* = 0)
{
mStats[name] = LLSD::Real(value);
}
// Hope that LLSD::Date values are sufficiently unambiguous.
void add(const LLSD::String& name, const LLSD::Date& value)
{
mStats[name] = value;
}
LLSD get() const { return mStats; }
private:
LLSD mStats;
};
// Wrap boost::regex_match() with a function that doesn't throw.
template <typename S, typename M, typename R>
static bool regex_match_no_exc(const S& string, M& match, const R& regex)
{
try
{
return boost::regex_match(string, match, regex);
}
catch (const std::runtime_error& e)
{
LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': "
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
return false;
}
}
// Wrap boost::regex_search() with a function that doesn't throw.
template <typename S, typename M, typename R>
static bool regex_search_no_exc(const S& string, M& match, const R& regex)
{
try
{
return boost::regex_search(string, match, regex);
}
catch (const std::runtime_error& e)
{
LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': "
<< e.what() << ":\n'" << string << "'" << LL_ENDL;
return false;
}
}
LLMemoryInfo::LLMemoryInfo()
{
refresh();
}
#if LL_WINDOWS
@ -638,11 +742,7 @@ static U32 LLMemoryAdjustKBResult(U32 inKB)
U32 LLMemoryInfo::getPhysicalMemoryKB() const
{
#if LL_WINDOWS
MEMORYSTATUSEX state;
state.dwLength = sizeof(state);
GlobalMemoryStatusEx(&state);
return LLMemoryAdjustKBResult((U32)(state.ullTotalPhys >> 10));
return LLMemoryAdjustKBResult(mStatsMap["Total Physical KB"].asInteger());
#elif LL_DARWIN
// This might work on Linux as well. Someone check...
@ -690,12 +790,82 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const
void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb)
{
#if LL_WINDOWS
MEMORYSTATUSEX state;
state.dwLength = sizeof(state);
GlobalMemoryStatusEx(&state);
// Sigh, this shouldn't be a static method, then we wouldn't have to
// reload this data separately from refresh()
LLSD statsMap(loadStatsMap());
avail_physical_mem_kb = (U32)(state.ullAvailPhys/1024) ;
avail_virtual_mem_kb = (U32)(state.ullAvailVirtual/1024) ;
avail_physical_mem_kb = statsMap["Avail Physical KB"].asInteger();
avail_virtual_mem_kb = statsMap["Avail Virtual KB"].asInteger();
#elif LL_DARWIN
// mStatsMap is derived from vm_stat, look for (e.g.) "kb free":
// $ vm_stat
// Mach Virtual Memory Statistics: (page size of 4096 bytes)
// Pages free: 462078.
// Pages active: 142010.
// Pages inactive: 220007.
// Pages wired down: 159552.
// "Translation faults": 220825184.
// Pages copy-on-write: 2104153.
// Pages zero filled: 167034876.
// Pages reactivated: 65153.
// Pageins: 2097212.
// Pageouts: 41759.
// Object cache: 841598 hits of 7629869 lookups (11% hit rate)
avail_physical_mem_kb = -1 ;
avail_virtual_mem_kb = -1 ;
#elif LL_LINUX
// mStatsMap is derived from MEMINFO_FILE:
// $ cat /proc/meminfo
// MemTotal: 4108424 kB
// MemFree: 1244064 kB
// Buffers: 85164 kB
// Cached: 1990264 kB
// SwapCached: 0 kB
// Active: 1176648 kB
// Inactive: 1427532 kB
// Active(anon): 529152 kB
// Inactive(anon): 15924 kB
// Active(file): 647496 kB
// Inactive(file): 1411608 kB
// Unevictable: 16 kB
// Mlocked: 16 kB
// HighTotal: 3266316 kB
// HighFree: 721308 kB
// LowTotal: 842108 kB
// LowFree: 522756 kB
// SwapTotal: 6384632 kB
// SwapFree: 6384632 kB
// Dirty: 28 kB
// Writeback: 0 kB
// AnonPages: 528820 kB
// Mapped: 89472 kB
// Shmem: 16324 kB
// Slab: 159624 kB
// SReclaimable: 145168 kB
// SUnreclaim: 14456 kB
// KernelStack: 2560 kB
// PageTables: 5560 kB
// NFS_Unstable: 0 kB
// Bounce: 0 kB
// WritebackTmp: 0 kB
// CommitLimit: 8438844 kB
// Committed_AS: 1271596 kB
// VmallocTotal: 122880 kB
// VmallocUsed: 65252 kB
// VmallocChunk: 52356 kB
// HardwareCorrupted: 0 kB
// HugePages_Total: 0
// HugePages_Free: 0
// HugePages_Rsvd: 0
// HugePages_Surp: 0
// Hugepagesize: 2048 kB
// DirectMap4k: 434168 kB
// DirectMap2M: 477184 kB
// (could also run 'free', but easier to read a file than run a program)
avail_physical_mem_kb = -1 ;
avail_virtual_mem_kb = -1 ;
#else
//do not know how to collect available memory info for other systems.
@ -708,56 +878,389 @@ void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_v
void LLMemoryInfo::stream(std::ostream& s) const
{
// We want these memory stats to be easy to grep from the log, along with
// the timestamp. So preface each line with the timestamp and a
// distinctive marker. Without that, we'd have to search the log for the
// introducer line, then read subsequent lines, etc...
std::string pfx(LLError::utcTime() + " <mem> ");
// Max key length
size_t key_width(0);
BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
{
size_t len(pair.first.length());
if (len > key_width)
{
key_width = len;
}
}
// Now stream stats
BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
{
s << pfx << std::setw(key_width+1) << (pair.first + ':') << ' ';
LLSD value(pair.second);
if (value.isInteger())
s << std::setw(12) << value.asInteger();
else if (value.isReal())
s << std::fixed << std::setprecision(1) << value.asReal();
else if (value.isDate())
value.asDate().toStream(s);
else
s << value; // just use default LLSD formatting
s << std::endl;
}
}
LLSD LLMemoryInfo::getStatsMap() const
{
return mStatsMap;
}
LLMemoryInfo& LLMemoryInfo::refresh()
{
mStatsMap = loadStatsMap();
LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n";
LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT);
LL_ENDL;
return *this;
}
LLSD LLMemoryInfo::loadStatsMap()
{
// This implementation is derived from stream() code (as of 2011-06-29).
Stats stats;
// associate timestamp for analysis over time
stats.add("timestamp", LLDate::now());
#if LL_WINDOWS
MEMORYSTATUSEX state;
state.dwLength = sizeof(state);
GlobalMemoryStatusEx(&state);
s << "Percent Memory use: " << (U32)state.dwMemoryLoad << '%' << std::endl;
s << "Total Physical KB: " << (U32)(state.ullTotalPhys/1024) << std::endl;
s << "Avail Physical KB: " << (U32)(state.ullAvailPhys/1024) << std::endl;
s << "Total page KB: " << (U32)(state.ullTotalPageFile/1024) << std::endl;
s << "Avail page KB: " << (U32)(state.ullAvailPageFile/1024) << std::endl;
s << "Total Virtual KB: " << (U32)(state.ullTotalVirtual/1024) << std::endl;
s << "Avail Virtual KB: " << (U32)(state.ullAvailVirtual/1024) << std::endl;
stats.add("Percent Memory use", state.dwMemoryLoad);
stats.add("Total Physical KB", state.ullTotalPhys/1024);
stats.add("Avail Physical KB", state.ullAvailPhys/1024);
stats.add("Total page KB", state.ullTotalPageFile/1024);
stats.add("Avail page KB", state.ullAvailPageFile/1024);
stats.add("Total Virtual KB", state.ullTotalVirtual/1024);
stats.add("Avail Virtual KB", state.ullAvailVirtual/1024);
PERFORMANCE_INFORMATION perf;
perf.cb = sizeof(perf);
GetPerformanceInfo(&perf, sizeof(perf));
SIZE_T pagekb(perf.PageSize/1024);
stats.add("CommitTotal KB", perf.CommitTotal * pagekb);
stats.add("CommitLimit KB", perf.CommitLimit * pagekb);
stats.add("CommitPeak KB", perf.CommitPeak * pagekb);
stats.add("PhysicalTotal KB", perf.PhysicalTotal * pagekb);
stats.add("PhysicalAvail KB", perf.PhysicalAvailable * pagekb);
stats.add("SystemCache KB", perf.SystemCache * pagekb);
stats.add("KernelTotal KB", perf.KernelTotal * pagekb);
stats.add("KernelPaged KB", perf.KernelPaged * pagekb);
stats.add("KernelNonpaged KB", perf.KernelNonpaged * pagekb);
stats.add("PageSize KB", pagekb);
stats.add("HandleCount", perf.HandleCount);
stats.add("ProcessCount", perf.ProcessCount);
stats.add("ThreadCount", perf.ThreadCount);
PROCESS_MEMORY_COUNTERS_EX pmem;
pmem.cb = sizeof(pmem);
// GetProcessMemoryInfo() is documented to accept either
// PROCESS_MEMORY_COUNTERS* or PROCESS_MEMORY_COUNTERS_EX*, presumably
// using the redundant size info to distinguish. But its prototype
// specifically accepts PROCESS_MEMORY_COUNTERS*, and since this is a
// classic-C API, PROCESS_MEMORY_COUNTERS_EX isn't a subclass. Cast the
// pointer.
GetProcessMemoryInfo(GetCurrentProcess(), PPROCESS_MEMORY_COUNTERS(&pmem), sizeof(pmem));
stats.add("Page Fault Count", pmem.PageFaultCount);
stats.add("PeakWorkingSetSize KB", pmem.PeakWorkingSetSize/1024);
stats.add("WorkingSetSize KB", pmem.WorkingSetSize/1024);
stats.add("QutaPeakPagedPoolUsage KB", pmem.QuotaPeakPagedPoolUsage/1024);
stats.add("QuotaPagedPoolUsage KB", pmem.QuotaPagedPoolUsage/1024);
stats.add("QuotaPeakNonPagedPoolUsage KB", pmem.QuotaPeakNonPagedPoolUsage/1024);
stats.add("QuotaNonPagedPoolUsage KB", pmem.QuotaNonPagedPoolUsage/1024);
stats.add("PagefileUsage KB", pmem.PagefileUsage/1024);
stats.add("PeakPagefileUsage KB", pmem.PeakPagefileUsage/1024);
stats.add("PrivateUsage KB", pmem.PrivateUsage/1024);
#elif LL_DARWIN
uint64_t phys = 0;
size_t len = sizeof(phys);
if(sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
if (sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
{
s << "Total Physical KB: " << phys/1024 << std::endl;
stats.add("Total Physical KB", phys/1024);
}
else
{
s << "Unable to collect memory information";
LL_WARNS("LLMemoryInfo") << "Unable to collect hw.memsize memory information" << LL_ENDL;
}
#elif LL_SOLARIS
U64 phys = 0;
phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
s << "Total Physical KB: " << phys << std::endl;
#else
// *NOTE: This works on linux. What will it do on other systems?
LLFILE* meminfo = LLFile::fopen(MEMINFO_FILE,"rb");
if(meminfo)
FILE* pout = popen("vm_stat 2>&1", "r");
if (! pout) // popen() couldn't run vm_stat
{
char line[MAX_STRING]; /* Flawfinder: ignore */
memset(line, 0, MAX_STRING);
while(fgets(line, MAX_STRING, meminfo))
// Save errno right away.
int popen_errno(errno);
LL_WARNS("LLMemoryInfo") << "Unable to collect vm_stat memory information: ";
char buffer[256];
if (0 == strerror_r(popen_errno, buffer, sizeof(buffer)))
{
line[strlen(line)-1] = ' '; /*Flawfinder: ignore*/
s << line;
LL_CONT << buffer;
}
else
{
LL_CONT << "errno " << popen_errno;
}
LL_CONT << LL_ENDL;
}
else // popen() launched vm_stat
{
// Mach Virtual Memory Statistics: (page size of 4096 bytes)
// Pages free: 462078.
// Pages active: 142010.
// Pages inactive: 220007.
// Pages wired down: 159552.
// "Translation faults": 220825184.
// Pages copy-on-write: 2104153.
// Pages zero filled: 167034876.
// Pages reactivated: 65153.
// Pageins: 2097212.
// Pageouts: 41759.
// Object cache: 841598 hits of 7629869 lookups (11% hit rate)
// Intentionally don't pass the boost::no_except flag. These
// boost::regex objects are constructed with string literals, so they
// should be valid every time. If they become invalid, we WANT an
// exception, hopefully even before the dev checks in.
boost::regex pagesize_rx("\\(page size of ([0-9]+) bytes\\)");
boost::regex stat_rx("(.+): +([0-9]+)\\.");
boost::regex cache_rx("Object cache: ([0-9]+) hits of ([0-9]+) lookups "
"\\(([0-9]+)% hit rate\\)");
boost::cmatch matched;
LLSD::Integer pagesizekb(4096/1024);
// Here 'pout' is vm_stat's stdout. Search it for relevant data.
char line[100];
line[sizeof(line)-1] = '\0';
while (fgets(line, sizeof(line)-1, pout))
{
size_t linelen(strlen(line));
// Truncate any trailing newline
if (line[linelen - 1] == '\n')
{
line[--linelen] = '\0';
}
LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
if (regex_search_no_exc(line, matched, pagesize_rx))
{
// "Mach Virtual Memory Statistics: (page size of 4096 bytes)"
std::string pagesize_str(matched[1].first, matched[1].second);
try
{
// Reasonable to assume that pagesize will always be a
// multiple of 1Kb?
pagesizekb = boost::lexical_cast<LLSD::Integer>(pagesize_str)/1024;
}
catch (const boost::bad_lexical_cast&)
{
LL_WARNS("LLMemoryInfo") << "couldn't parse '" << pagesize_str
<< "' in vm_stat line: " << line << LL_ENDL;
continue;
}
stats.add("page size", pagesizekb);
}
else if (regex_match_no_exc(line, matched, stat_rx))
{
// e.g. "Pages free: 462078."
// Strip double-quotes off certain statistic names
const char *key_begin(matched[1].first), *key_end(matched[1].second);
if (key_begin[0] == '"' && key_end[-1] == '"')
{
++key_begin;
--key_end;
}
LLSD::String key(key_begin, key_end);
LLSD::String value_str(matched[2].first, matched[2].second);
LLSD::Integer value(0);
try
{
value = boost::lexical_cast<LLSD::Integer>(value_str);
}
catch (const boost::bad_lexical_cast&)
{
LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
<< "' in vm_stat line: " << line << LL_ENDL;
continue;
}
// Store this statistic.
stats.add(key, value);
// Is this in units of pages? If so, convert to Kb.
static const LLSD::String pages("Pages ");
if (key.substr(0, pages.length()) == pages)
{
// Synthesize a new key with kb in place of Pages
LLSD::String kbkey("kb ");
kbkey.append(key.substr(pages.length()));
stats.add(kbkey, value * pagesizekb);
}
}
else if (regex_match_no_exc(line, matched, cache_rx))
{
// e.g. "Object cache: 841598 hits of 7629869 lookups (11% hit rate)"
static const char* cache_keys[] = { "cache hits", "cache lookups", "cache hit%" };
std::vector<LLSD::Integer> cache_values;
for (size_t i = 0; i < (sizeof(cache_keys)/sizeof(cache_keys[0])); ++i)
{
LLSD::String value_str(matched[i+1].first, matched[i+1].second);
LLSD::Integer value(0);
try
{
value = boost::lexical_cast<LLSD::Integer>(value_str);
}
catch (boost::bad_lexical_cast&)
{
LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
<< "' in vm_stat line: " << line << LL_ENDL;
continue;
}
stats.add(cache_keys[i], value);
}
}
else
{
LL_WARNS("LLMemoryInfo") << "unrecognized vm_stat line: " << line << LL_ENDL;
}
}
int status(pclose(pout));
if (status == -1) // pclose() couldn't retrieve rc
{
// Save errno right away.
int pclose_errno(errno);
// The ECHILD error happens so frequently that unless filtered,
// the warning below spams the log file. This is too bad, because
// sometimes the logic above fails to produce any output derived
// from vm_stat, but we've been unable to observe any specific
// error indicating the problem.
if (pclose_errno != ECHILD)
{
LL_WARNS("LLMemoryInfo") << "Unable to obtain vm_stat termination code: ";
char buffer[256];
if (0 == strerror_r(pclose_errno, buffer, sizeof(buffer)))
{
LL_CONT << buffer;
}
else
{
LL_CONT << "errno " << pclose_errno;
}
LL_CONT << LL_ENDL;
}
}
else // pclose() retrieved rc; analyze
{
if (WIFEXITED(status))
{
int rc(WEXITSTATUS(status));
if (rc != 0)
{
LL_WARNS("LLMemoryInfo") << "vm_stat terminated with rc " << rc << LL_ENDL;
}
}
else if (WIFSIGNALED(status))
{
LL_WARNS("LLMemoryInfo") << "vm_stat terminated by signal " << WTERMSIG(status)
<< LL_ENDL;
}
}
}
#elif LL_SOLARIS
U64 phys = 0;
phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
stats.add("Total Physical KB", phys);
#elif LL_LINUX
std::ifstream meminfo(MEMINFO_FILE);
if (meminfo.is_open())
{
// MemTotal: 4108424 kB
// MemFree: 1244064 kB
// Buffers: 85164 kB
// Cached: 1990264 kB
// SwapCached: 0 kB
// Active: 1176648 kB
// Inactive: 1427532 kB
// ...
// VmallocTotal: 122880 kB
// VmallocUsed: 65252 kB
// VmallocChunk: 52356 kB
// HardwareCorrupted: 0 kB
// HugePages_Total: 0
// HugePages_Free: 0
// HugePages_Rsvd: 0
// HugePages_Surp: 0
// Hugepagesize: 2048 kB
// DirectMap4k: 434168 kB
// DirectMap2M: 477184 kB
// Intentionally don't pass the boost::no_except flag. This
// boost::regex object is constructed with a string literal, so it
// should be valid every time. If it becomes invalid, we WANT an
// exception, hopefully even before the dev checks in.
boost::regex stat_rx("(.+): +([0-9]+)( kB)?");
boost::smatch matched;
std::string line;
while (std::getline(meminfo, line))
{
LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
if (regex_match_no_exc(line, matched, stat_rx))
{
// e.g. "MemTotal: 4108424 kB"
LLSD::String key(matched[1].first, matched[1].second);
LLSD::String value_str(matched[2].first, matched[2].second);
LLSD::Integer value(0);
try
{
value = boost::lexical_cast<LLSD::Integer>(value_str);
}
catch (const boost::bad_lexical_cast&)
{
LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
<< "' in " << MEMINFO_FILE << " line: "
<< line << LL_ENDL;
continue;
}
// Store this statistic.
stats.add(key, value);
}
else
{
LL_WARNS("LLMemoryInfo") << "unrecognized " << MEMINFO_FILE << " line: "
<< line << LL_ENDL;
}
}
fclose(meminfo);
}
else
{
s << "Unable to collect memory information";
LL_WARNS("LLMemoryInfo") << "Unable to collect memory information" << LL_ENDL;
}
#else
LL_WARNS("LLMemoryInfo") << "Unknown system; unable to collect memory information" << LL_ENDL;
#endif
return stats.get();
}
std::ostream& operator<<(std::ostream& s, const LLOSInfo& info)
@ -778,6 +1281,143 @@ std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info)
return s;
}
class FrameWatcher
{
public:
FrameWatcher():
// Hooking onto the "mainloop" event pump gets us one call per frame.
mConnection(LLEventPumps::instance()
.obtain("mainloop")
.listen("FrameWatcher", boost::bind(&FrameWatcher::tick, this, _1))),
// Initializing mSampleStart to an invalid timestamp alerts us to skip
// trying to compute framerate on the first call.
mSampleStart(-1),
// Initializing mSampleEnd to 0 ensures that we treat the first call
// as the completion of a sample window.
mSampleEnd(0),
mFrames(0),
// Both MEM_INFO_WINDOW and MEM_INFO_THROTTLE are in seconds. We need
// the number of integer MEM_INFO_THROTTLE sample slots that will fit
// in MEM_INFO_WINDOW. Round up.
mSamples(int((MEM_INFO_WINDOW / MEM_INFO_THROTTLE) + 0.7)),
// Initializing to F32_MAX means that the first real frame will become
// the slowest ever, which sounds like a good idea.
mSlowest(F32_MAX)
{}
bool tick(const LLSD&)
{
F32 timestamp(mTimer.getElapsedTimeF32());
// Count this frame in the interval just completed.
++mFrames;
// Have we finished a sample window yet?
if (timestamp < mSampleEnd)
{
// no, just keep waiting
return false;
}
// Set up for next sample window. Capture values for previous frame in
// local variables and reset data members.
U32 frames(mFrames);
F32 sampleStart(mSampleStart);
// No frames yet in next window
mFrames = 0;
// which starts right now
mSampleStart = timestamp;
// and ends MEM_INFO_THROTTLE seconds in the future
mSampleEnd = mSampleStart + MEM_INFO_THROTTLE;
// On the very first call, that's all we can do, no framerate
// computation is possible.
if (sampleStart < 0)
{
return false;
}
// How long did this actually take? As framerate slows, the duration
// of the frame we just finished could push us WELL beyond our desired
// sample window size.
F32 elapsed(timestamp - sampleStart);
F32 framerate(frames/elapsed);
// Remember previous slowest framerate because we're just about to
// update it.
F32 slowest(mSlowest);
// Remember previous number of samples.
boost::circular_buffer<F32>::size_type prevSize(mSamples.size());
// Capture new framerate in our samples buffer. Once the buffer is
// full (after MEM_INFO_WINDOW seconds), this will displace the oldest
// sample. ("So they all rolled over, and one fell out...")
mSamples.push_back(framerate);
// Calculate the new minimum framerate. I know of no way to update a
// rolling minimum without ever rescanning the buffer. But since there
// are only a few tens of items in this buffer, rescanning it is
// probably cheaper (and certainly easier to reason about) than
// attempting to optimize away some of the scans.
mSlowest = framerate; // pick an arbitrary entry to start
for (boost::circular_buffer<F32>::const_iterator si(mSamples.begin()), send(mSamples.end());
si != send; ++si)
{
if (*si < mSlowest)
{
mSlowest = *si;
}
}
// We're especially interested in memory as framerate drops. Only log
// when framerate drops below the slowest framerate we remember.
// (Should always be true for the end of the very first sample
// window.)
if (framerate >= slowest)
{
return false;
}
// Congratulations, we've hit a new low. :-P
LL_INFOS("FrameWatcher") << ' ';
if (! prevSize)
{
LL_CONT << "initial framerate ";
}
else
{
LL_CONT << "slowest framerate for last " << int(prevSize * MEM_INFO_THROTTLE)
<< " seconds ";
}
LL_CONT << std::fixed << std::setprecision(1) << framerate << '\n'
<< LLMemoryInfo() << LL_ENDL;
return false;
}
private:
// Storing the connection in an LLTempBoundListener ensures it will be
// disconnected when we're destroyed.
LLTempBoundListener mConnection;
// Track elapsed time
LLTimer mTimer;
// Some of what you see here is in fact redundant with functionality you
// can get from LLTimer. Unfortunately the LLTimer API is missing the
// feature we need: has at least the stated interval elapsed, and if so,
// exactly how long has passed? So we have to do it by hand, sigh.
// Time at start, end of sample window
F32 mSampleStart, mSampleEnd;
// Frames this sample window
U32 mFrames;
// Sliding window of framerate samples
boost::circular_buffer<F32> mSamples;
// Slowest framerate in mSamples
F32 mSlowest;
};
// Need an instance of FrameWatcher before it does any good
static FrameWatcher sFrameWatcher;
BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile)
{
std::string tmpfile;

View File

@ -36,6 +36,7 @@
// llinfos << info << llendl;
//
#include "llsd.h"
#include <iosfwd>
#include <string>
@ -117,6 +118,27 @@ public:
//get the available memory infomation in KiloBytes.
static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb);
// Retrieve a map of memory statistics. The keys of the map are platform-
// dependent. The values are in kilobytes to try to avoid integer overflow.
LLSD getStatsMap() const;
// Re-fetch memory data (as reported by stream() and getStatsMap()) from the
// system. Normally this is fetched at construction time. Return (*this)
// to permit usage of the form:
// @code
// LLMemoryInfo info;
// ...
// info.refresh().getStatsMap();
// @endcode
LLMemoryInfo& refresh();
private:
// set mStatsMap
static LLSD loadStatsMap();
// Memory stats for getStatsMap().
LLSD mStatsMap;
};

View File

@ -29,7 +29,7 @@
const S32 LL_VERSION_MAJOR = 2;
const S32 LL_VERSION_MINOR = 8;
const S32 LL_VERSION_PATCH = 1;
const S32 LL_VERSION_PATCH = 2;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Project Viewer - Mesh";

View File

@ -31,10 +31,12 @@
#include "llcrashlogger.h"
#include "linden_common.h"
#include "llstring.h"
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "indra_constants.h" // CRASH_BEHAVIOR_...
#include "llerror.h"
#include "llerrorcontrol.h"
#include "lltimer.h"
#include "lldir.h"
#include "llfile.h"
#include "llsdserialize.h"
#include "lliopipe.h"
#include "llpumpio.h"
@ -54,7 +56,7 @@ public:
virtual void error(U32 status, const std::string& reason)
{
gBreak = true;
gBreak = true;
}
virtual void result(const LLSD& content)
@ -64,21 +66,8 @@ public:
}
};
bool LLCrashLoggerText::mainLoop()
{
std::cout << "Entering main loop" << std::endl;
sendCrashLogs();
return true;
}
void LLCrashLoggerText::updateApplication(const std::string& message)
{
LLCrashLogger::updateApplication(message);
std::cout << message << std::endl;
}
LLCrashLogger::LLCrashLogger() :
mCrashBehavior(CRASH_BEHAVIOR_ASK),
mCrashBehavior(CRASH_BEHAVIOR_ALWAYS_SEND),
mCrashInPreviousExec(false),
mCrashSettings("CrashSettings"),
mSentCrashLogs(false),
@ -281,26 +270,48 @@ LLSD LLCrashLogger::constructPostData()
return mCrashInfo;
}
const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
S32 LLCrashLogger::loadCrashBehaviorSetting()
{
// First check user_settings (in the user's home dir)
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
if (! mCrashSettings.loadFromFile(filename))
{
// Next check app_settings (in the SL program dir)
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, CRASH_SETTINGS_FILE);
mCrashSettings.loadFromFile(filename);
}
mCrashSettings.loadFromFile(filename);
S32 value = mCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK;
// If we didn't load any files above, this will return the default
S32 value = mCrashSettings.getS32("CrashSubmitBehavior");
return value;
// Whatever value we got, make sure it's valid
switch (value)
{
case CRASH_BEHAVIOR_NEVER_SEND:
return CRASH_BEHAVIOR_NEVER_SEND;
case CRASH_BEHAVIOR_ALWAYS_SEND:
return CRASH_BEHAVIOR_ALWAYS_SEND;
}
return CRASH_BEHAVIOR_ASK;
}
bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
{
if (crash_behavior != CRASH_BEHAVIOR_ASK && crash_behavior != CRASH_BEHAVIOR_ALWAYS_SEND) return false;
switch (crash_behavior)
{
case CRASH_BEHAVIOR_ASK:
case CRASH_BEHAVIOR_NEVER_SEND:
case CRASH_BEHAVIOR_ALWAYS_SEND:
break;
default:
return false;
}
mCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior);
mCrashSettings.setS32("CrashSubmitBehavior", crash_behavior);
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
mCrashSettings.saveToFile(filename, FALSE);
return true;
@ -309,14 +320,13 @@ bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout)
{
gBreak = false;
std::string status_message;
for(int i = 0; i < retries; ++i)
{
status_message = llformat("%s, try %d...", msg.c_str(), i+1);
updateApplication(llformat("%s, try %d...", msg.c_str(), i+1));
LLHTTPClient::post(host, data, new LLCrashLoggerResponder(), timeout);
while(!gBreak)
{
updateApplication(status_message);
updateApplication(); // No new message, just pump the IO
}
if(gSent)
{
@ -336,7 +346,7 @@ bool LLCrashLogger::sendCrashLogs()
updateApplication("Sending reports...");
std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
"SecondLifeCrashReport");
"SecondLifeCrashReport");
std::string report_file = dump_path + ".log";
std::ofstream out_file(report_file.c_str());
@ -365,6 +375,7 @@ void LLCrashLogger::updateApplication(const std::string& message)
{
gServicePump->pump();
gServicePump->callback();
if (!message.empty()) llinfos << message << llendl;
}
bool LLCrashLogger::init()
@ -374,14 +385,27 @@ bool LLCrashLogger::init()
// We assume that all the logs we're looking for reside on the current drive
gDirUtilp->initAppDirs("SecondLife");
LLError::initForApplication(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
// Default to the product name "Second Life" (this is overridden by the -name argument)
mProductName = "Second Life";
mCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes "
"(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)");
llinfos << "Loading crash behavior setting" << llendl;
mCrashBehavior = loadCrashBehaviorSetting();
// Rename current log file to ".old"
std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old");
std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log");
LLFile::rename(log_file.c_str(), old_log_file.c_str());
// Set the log file to crashreport.log
LLError::logToFile(log_file);
mCrashSettings.declareS32("CrashSubmitBehavior", CRASH_BEHAVIOR_ALWAYS_SEND,
"Controls behavior when viewer crashes "
"(0 = ask before sending crash report, "
"1 = always send crash report, "
"2 = never send crash report)");
// llinfos << "Loading crash behavior setting" << llendl;
// mCrashBehavior = loadCrashBehaviorSetting();
// If user doesn't want to send, bail out
if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
@ -394,10 +418,11 @@ bool LLCrashLogger::init()
gServicePump->prime(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
//If we've opened the crash logger, assume we can delete the marker file if it exists
//If we've opened the crash logger, assume we can delete the marker file if it exists
if( gDirUtilp )
{
std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
"SecondLife.exec_marker");
LLAPRFile::remove( marker_file );
}

View File

@ -66,15 +66,4 @@ protected:
bool mSentCrashLogs;
};
class LLCrashLoggerText : public LLCrashLogger
{
public:
LLCrashLoggerText(void) {}
~LLCrashLoggerText(void) {}
virtual bool mainLoop();
virtual void updateApplication(const std::string& message = LLStringUtil::null);
};
#endif //LLCRASHLOGGER_H

View File

@ -15,7 +15,7 @@
<string name="bounds">414 390 434 487 </string>
</object>
<object class="IBCarbonStaticText" id="181">
<string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string>
<string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Don&apos;t Send.&#10;</string>
<string name="bounds">20 20 231 487 </string>
</object>
<object class="IBCarbonWindow" id="166">

View File

@ -29,9 +29,6 @@
#include <Carbon/Carbon.h>
#include <iostream>
#include <sstream>
#include "boost/tokenizer.hpp"
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
@ -247,7 +244,7 @@ bool LLCrashLoggerMac::mainLoop()
void LLCrashLoggerMac::updateApplication(const std::string& message)
{
LLCrashLogger::updateApplication();
LLCrashLogger::updateApplication(message);
}
bool LLCrashLoggerMac::cleanup()

View File

@ -25,22 +25,23 @@
*/
#include "linden_common.h"
#include "llcrashloggermac.h"
int main(int argc, char **argv)
{
//time(&gLaunchTime);
llinfos << "Starting Second Life Viewer Crash Reporter" << llendl;
llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerMac app;
app.parseCommandOptions(argc, argv);
if(!app.init())
if (! app.init())
{
return 0;
llwarns << "Unable to initialize application." << llendl;
return 1;
}
app.mainLoop();
app.cleanup();
llinfos << "Crash reporter finished normally." << llendl;
return 0;
}

View File

@ -150,8 +150,9 @@ set(viewer_SOURCE_FILES
lldrawpoolwlsky.cpp
lldriverparam.cpp
lldynamictexture.cpp
llenvmanager.cpp
llemote.cpp
llenvmanager.cpp
llestateinfomodel.cpp
lleventnotifier.cpp
lleventpoll.cpp
llexpandabletextbox.cpp
@ -713,6 +714,7 @@ set(viewer_HEADER_FILES
lldynamictexture.h
llemote.h
llenvmanager.h
llestateinfomodel.h
lleventnotifier.h
lleventpoll.h
llexpandabletextbox.h

View File

@ -220,8 +220,7 @@
<map>
<key>desc</key>
<string>Set the detail level.
0 - low, 1 - medium, 2 - high, 3 - ultra
</string>
0 - low, 1 - medium, 2 - high, 3 - ultra</string>
<key>count</key>
<integer>1</integer>
</map>
@ -229,10 +228,7 @@
<key>setdefault</key>
<map>
<key>desc</key>
<string> specify the value of a particular
configuration variable which can be
overridden by settings.xml
</string>
<string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>
<key>count</key>
<integer>2</integer>
<!-- Special case. Mapped to settings procedurally. -->
@ -241,10 +237,7 @@
<key>set</key>
<map>
<key>desc</key>
<string> specify the value of a particular
configuration variable that
overrides all other settings
</string>
<string>specify the value of a particular configuration variable that overrides all other settings.</string>
<key>count</key>
<integer>2</integer>
<key>compose</key>

View File

@ -4872,7 +4872,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
<string />
<string>http://viewer-login.agni.lindenlab.com/</string>
</map>
<key>LosslessJ2CUpload</key>
<map>
@ -4894,7 +4894,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>20.0</real>
<real>60.0</real>
</map>
<key>MapOverlayIndex</key>
<map>
@ -12623,13 +12623,13 @@
<key>WatchdogEnabled</key>
<map>
<key>Comment</key>
<string>Controls whether the thread watchdog timer is activated.</string>
<string>Controls whether the thread watchdog timer is activated. Value is boolean. Set to -1 to defer to built-in default.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>20</integer>
<integer>1</integer>
</map>
<key>WaterGLFogDensityScale</key>
<map>

View File

@ -20,7 +20,8 @@
file_name="settings.xml"
file_name_setting="ClientSettingsFile"/>
<file name="CrashSettings"
file_name="settings_crash_behavior"/>
file_name="settings_crash_behavior.xml"
file_name_setting="CrashSettingsFile"/>
<file name="Warnings"
file_name="ignorable_dialogs.xml"
file_name_setting="WarningSettingsFile"/>
@ -61,4 +62,4 @@
file_name="colors.xml"
file_name_setting="SkinningSettingsFile"/>
</group>
</settings_files>
</settings_files>

View File

@ -469,18 +469,6 @@ void request_initial_instant_messages()
}
}
// A settings system callback for CrashSubmitBehavior
bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue)
{
S32 cb = newvalue.asInteger();
const S32 NEVER_SUBMIT_REPORT = 2;
if(cb == NEVER_SUBMIT_REPORT)
{
LLAppViewer::instance()->destroyMainloopTimeout();
}
return true;
}
// Use these strictly for things that are constructed at startup,
// or for things that are performance critical. JC
static void settings_to_globals()
@ -612,9 +600,6 @@ bool LLAppViewer::sendURLToOtherInstance(const std::string& url)
// Static members.
// The single viewer app.
LLAppViewer* LLAppViewer::sInstance = NULL;
const std::string LLAppViewer::sGlobalSettingsName = "Global";
LLTextureCache* LLAppViewer::sTextureCache = NULL;
LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
@ -772,16 +757,6 @@ bool LLAppViewer::init()
LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;
LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL;
// Get the single value from the crash settings file, if it exists
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
gCrashSettings.loadFromFile(crash_settings_filename);
if(gSavedSettings.getBOOL("IgnoreAllNotifications"))
{
gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND);
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
}
LL_INFOS("InitInfo") << "Crash settings done." << LL_ENDL ;
/////////////////////////////////////////////////
// OS-specific login dialogs
/////////////////////////////////////////////////
@ -1056,7 +1031,7 @@ bool LLAppViewer::init()
//EXT-7013 - On windows for some locale (Japanese) standard
//datetime formatting functions didn't support some parameters such as "weekday".
//Names for days and months localized in xml are also useful for Polish locale(STORM-107).
std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language");
std::string language = gSavedSettings.getString("Language");
if(language == "ja" || language == "pl")
{
LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
@ -1709,10 +1684,6 @@ bool LLAppViewer::cleanup()
llinfos << "Saved settings" << llendflush;
}
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
// save all settings, even if equals defaults
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
std::string warnings_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Warnings"));
gWarningSettings.saveToFile(warnings_settings_filename, TRUE);
@ -1842,7 +1813,6 @@ bool LLAppViewer::cleanup()
gSavedSettings.cleanup();
LLUIColorTable::instance().clear();
gCrashSettings.cleanup();
LLWatchdog::getInstance()->cleanup();
@ -1985,7 +1955,6 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
llerrs << "Invalid settings location list" << llendl;
}
LLControlGroup* global_settings = LLControlGroup::getInstance(sGlobalSettingsName);
for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
it != end_it;
++it)
@ -2018,11 +1987,15 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string full_settings_path;
if (file_it->file_name_setting.isProvided()
&& global_settings->controlExists(file_it->file_name_setting))
&& gSavedSettings.controlExists(file_it->file_name_setting))
{
// try to find filename stored in file_name_setting control
full_settings_path = global_settings->getString(file_it->file_name_setting);
if (!gDirUtilp->fileExists(full_settings_path))
full_settings_path = gSavedSettings.getString(file_it->file_name_setting);
if (full_settings_path.empty())
{
continue;
}
else if (!gDirUtilp->fileExists(full_settings_path))
{
// search in default path
full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path);
@ -2168,8 +2141,6 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setS32("WatchdogEnabled", 0);
#endif
gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _2));
// These are warnings that appear on the first experience of that condition.
// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse
// for disable/reset ability
@ -2300,15 +2271,33 @@ bool LLAppViewer::initConfiguration()
{
const std::string& name = *itr;
const std::string& value = *(++itr);
LLControlVariable* c = LLControlGroup::getInstance(sGlobalSettingsName)->getControl(name);
if(c)
std::string name_part;
std::string group_part;
LLControlVariable* control = NULL;
// Name can be further split into ControlGroup.Name, with the default control group being Global
size_t pos = name.find('.');
if (pos != std::string::npos)
{
group_part = name.substr(0, pos);
name_part = name.substr(pos+1);
llinfos << "Setting " << group_part << "." << name_part << " to " << value << llendl;
LLControlGroup* g = LLControlGroup::getInstance(group_part);
if (g) control = g->getControl(name_part);
}
else
{
llinfos << "Setting Global." << name << " to " << value << llendl;
control = gSavedSettings.getControl(name);
}
if (control)
{
c->setValue(value, false);
control->setValue(value, false);
}
else
{
llwarns << "'--set' specified with unknown setting: '"
<< name << "'." << llendl;
llwarns << "Failed --set " << name << ": setting name unknown." << llendl;
}
}
}
@ -2765,7 +2754,8 @@ void LLAppViewer::checkForCrash(void)
// Pop up a freeze or crash warning dialog
//
S32 choice;
if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_ASK)
const S32 cb = gCrashSettings.getS32("CrashSubmitBehavior");
if(cb == CRASH_BEHAVIOR_ASK)
{
std::ostringstream msg;
msg << LLTrans::getString("MBFrozenCrashed");
@ -2774,7 +2764,7 @@ void LLAppViewer::checkForCrash(void)
alert,
OSMB_YESNO);
}
else if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_NEVER_SEND)
else if(cb == CRASH_BEHAVIOR_NEVER_SEND)
{
choice = OSBTN_NO;
}
@ -2831,10 +2821,9 @@ bool LLAppViewer::initWindow()
LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
// Need to load feature table before cheking to start watchdog.
const S32 NEVER_SUBMIT_REPORT = 2;
bool use_watchdog = false;
int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
if(watchdog_enabled_setting == -1)
if (watchdog_enabled_setting == -1)
{
use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
}
@ -2844,8 +2833,7 @@ bool LLAppViewer::initWindow()
use_watchdog = bool(watchdog_enabled_setting);
}
bool send_reports = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT;
if(use_watchdog && send_reports)
if (use_watchdog)
{
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
@ -4516,7 +4504,7 @@ void LLAppViewer::idleShutdown()
void LLAppViewer::sendLogoutRequest()
{
if(!mLogoutRequestSent)
if(!mLogoutRequestSent && gMessageSystem)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_LogoutRequest);

View File

@ -361,46 +361,35 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
}
else
{
const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
// Always generate the report, have the logger do the asking, and
// don't wait for the logger before exiting (-> total cleanup).
if (CRASH_BEHAVIOR_NEVER_SEND != cb)
{
// launch the actual crash logger
const char* ask_dialog = "-dialog";
if (CRASH_BEHAVIOR_ASK != cb)
ask_dialog = ""; // omit '-dialog' option
const char * cmdargv[] =
{cmd.c_str(),
ask_dialog,
"-user",
(char*)LLGridManager::getInstance()->getGridLabel().c_str(),
"-name",
LLAppViewer::instance()->getSecondLifeTitle().c_str(),
NULL};
fflush(NULL);
pid_t pid = fork();
if (pid == 0)
{ // child
execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
llwarns << "execv failure when trying to start " << cmd << llendl;
_exit(1); // avoid atexit()
// launch the actual crash logger
const char * cmdargv[] =
{cmd.c_str(),
"-user",
(char*)LLGridManager::getInstance()->getGridLabel().c_str(),
"-name",
LLAppViewer::instance()->getSecondLifeTitle().c_str(),
NULL};
fflush(NULL);
pid_t pid = fork();
if (pid == 0)
{ // child
execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
llwarns << "execv failure when trying to start " << cmd << llendl;
_exit(1); // avoid atexit()
}
else
{
if (pid > 0)
{
// DO NOT wait for child proc to die; we want
// the logger to outlive us while we quit to
// free up the screen/keyboard/etc.
////int childExitStatus;
////waitpid(pid, &childExitStatus, 0);
}
else
{
if (pid > 0)
{
// DO NOT wait for child proc to die; we want
// the logger to outlive us while we quit to
// free up the screen/keyboard/etc.
////int childExitStatus;
////waitpid(pid, &childExitStatus, 0);
}
else
{
llwarns << "fork failure." << llendl;
}
llwarns << "fork failure." << llendl;
}
}
// Sometimes signals don't seem to quit the viewer. Also, we may

View File

@ -518,11 +518,7 @@ void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
}
else
{
S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
if(cb != CRASH_BEHAVIOR_NEVER_SEND)
{
_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
}
_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
}
}

View File

@ -0,0 +1,230 @@
/**
* @file llestateinfomodel.cpp
* @brief Estate info model
*
* $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 "llviewerprecompiledheaders.h"
#include "llestateinfomodel.h"
// libs
#include "llhttpclient.h"
#include "llregionflags.h"
#include "message.h"
// viewer
#include "llagent.h"
#include "llfloaterregioninfo.h" // for invoice id
#include "llviewerregion.h"
LLEstateInfoModel::LLEstateInfoModel()
: mID(0)
, mFlags(0)
, mSunHour(0)
{
}
boost::signals2::connection LLEstateInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb)
{
return mUpdateSignal.connect(cb);
}
boost::signals2::connection LLEstateInfoModel::setCommitCallback(const update_signal_t::slot_type& cb)
{
return mCommitSignal.connect(cb);
}
void LLEstateInfoModel::sendEstateInfo()
{
if (!commitEstateInfoCaps())
{
// the caps method failed, try the old way
LLFloaterRegionInfo::nextInvoice();
commitEstateInfoDataserver();
}
}
bool LLEstateInfoModel::getUseFixedSun() const { return mFlags & REGION_FLAGS_SUN_FIXED; }
bool LLEstateInfoModel::getIsExternallyVisible() const { return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE; }
bool LLEstateInfoModel::getAllowDirectTeleport() const { return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT; }
bool LLEstateInfoModel::getDenyAnonymous() const { return mFlags & REGION_FLAGS_DENY_ANONYMOUS; }
bool LLEstateInfoModel::getDenyAgeUnverified() const { return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED; }
bool LLEstateInfoModel::getAllowVoiceChat() const { return mFlags & REGION_FLAGS_ALLOW_VOICE; }
void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); }
void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); }
void LLEstateInfoModel::setAllowDirectTeleport(bool val) { setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, val); }
void LLEstateInfoModel::setDenyAnonymous(bool val) { setFlag(REGION_FLAGS_DENY_ANONYMOUS, val); }
void LLEstateInfoModel::setDenyAgeUnverified(bool val) { setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED, val); }
void LLEstateInfoModel::setAllowVoiceChat(bool val) { setFlag(REGION_FLAGS_ALLOW_VOICE, val); }
void LLEstateInfoModel::update(const strings_t& strings)
{
// NOTE: LLDispatcher extracts strings with an extra \0 at the
// end. If we pass the std::string direct to the UI/renderer
// it draws with a weird character at the end of the string.
mName = strings[0].c_str();
mOwnerID = LLUUID(strings[1].c_str());
mID = strtoul(strings[2].c_str(), NULL, 10);
mFlags = strtoul(strings[3].c_str(), NULL, 10);
mSunHour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
LL_DEBUGS("Windlight Sync") << "Received estate info: "
<< "is_sun_fixed = " << getUseFixedSun()
<< ", sun_hour = " << getSunHour() << LL_ENDL;
lldebugs << getInfoDump() << llendl;
// Update region owner.
LLViewerRegion* regionp = gAgent.getRegion();
regionp->setOwner(mOwnerID);
// Let interested parties know that estate info has been updated.
mUpdateSignal();
}
void LLEstateInfoModel::notifyCommit()
{
mCommitSignal();
}
//== PRIVATE STUFF ============================================================
class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
{
public:
// if we get a normal response, handle it here
virtual void result(const LLSD& content)
{
llinfos << "Committed estate info" << llendl;
LLEstateInfoModel::instance().notifyCommit();
}
// if we get an error response
virtual void error(U32 status, const std::string& reason)
{
llwarns << "Failed to commit estate info (" << status << "): " << reason << llendl;
}
};
// tries to send estate info using a cap; returns true if it succeeded
bool LLEstateInfoModel::commitEstateInfoCaps()
{
std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
if (url.empty())
{
// whoops, couldn't find the cap, so bail out
return false;
}
LLSD body;
body["estate_name" ] = getName();
body["sun_hour" ] = getSunHour();
body["is_sun_fixed" ] = getUseFixedSun();
body["is_externally_visible"] = getIsExternallyVisible();
body["allow_direct_teleport"] = getAllowDirectTeleport();
body["deny_anonymous" ] = getDenyAnonymous();
body["deny_age_unverified" ] = getDenyAgeUnverified();
body["allow_voice_chat" ] = getAllowVoiceChat();
body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
LL_DEBUGS("Windlight Sync") << "Sending estate caps: "
<< "is_sun_fixed = " << getUseFixedSun()
<< ", sun_hour = " << getSunHour() << LL_ENDL;
lldebugs << body << LL_ENDL;
// we use a responder so that we can re-get the data after committing to the database
LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder);
return true;
}
/* This is the old way of doing things, is deprecated, and should be
deleted when the dataserver model can be removed */
// key = "estatechangeinfo"
// strings[0] = str(estate_id) (added by simulator before relay - not here)
// strings[1] = estate_name
// strings[2] = str(estate_flags)
// strings[3] = str((S32)(sun_hour * 1024.f))
void LLEstateInfoModel::commitEstateInfoDataserver()
{
LL_DEBUGS("Windlight Sync") << "Sending estate info: "
<< "is_sun_fixed = " << getUseFixedSun()
<< ", sun_hour = " << getSunHour() << LL_ENDL;
lldebugs << getInfoDump() << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("EstateOwnerMessage");
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
msg->nextBlock("MethodData");
msg->addString("Method", "estatechangeinfo");
msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
msg->nextBlock("ParamList");
msg->addString("Parameter", getName());
msg->nextBlock("ParamList");
msg->addString("Parameter", llformat("%u", getFlags()));
msg->nextBlock("ParamList");
msg->addString("Parameter", llformat("%d", (S32) (getSunHour() * 1024.0f)));
gAgent.sendMessage();
}
void LLEstateInfoModel::setFlag(U32 flag, bool val)
{
if (val)
{
mFlags |= flag;
}
else
{
mFlags &= ~flag;
}
}
std::string LLEstateInfoModel::getInfoDump()
{
LLSD dump;
dump["estate_name" ] = getName();
dump["sun_hour" ] = getSunHour();
dump["is_sun_fixed" ] = getUseFixedSun();
dump["is_externally_visible"] = getIsExternallyVisible();
dump["allow_direct_teleport"] = getAllowDirectTeleport();
dump["deny_anonymous" ] = getDenyAnonymous();
dump["deny_age_unverified" ] = getDenyAgeUnverified();
dump["allow_voice_chat" ] = getAllowVoiceChat();
std::stringstream dump_str;
dump_str << dump;
return dump_str.str();
}

View File

@ -0,0 +1,103 @@
/**
* @file llestateinfomodel.h
* @brief Estate info model
*
* $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 LL_LLESTATEINFOMODEL_H
#define LL_LLESTATEINFOMODEL_H
class LLMessageSystem;
#include "llsingleton.h"
/**
* Contains estate info, notifies interested parties of its changes.
*/
class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
{
LOG_CLASS(LLEstateInfoModel);
public:
typedef boost::signals2::signal<void()> update_signal_t;
boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated
boost::signals2::connection setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied
void sendEstateInfo(); /// send estate info to the simulator
// getters
bool getUseFixedSun() const;
bool getIsExternallyVisible() const;
bool getAllowDirectTeleport() const;
bool getDenyAnonymous() const;
bool getDenyAgeUnverified() const;
bool getAllowVoiceChat() const;
const std::string& getName() const { return mName; }
const LLUUID& getOwnerID() const { return mOwnerID; }
U32 getID() const { return mID; }
F32 getSunHour() const { return getUseFixedSun() ? mSunHour : 0.f; }
// setters
void setUseFixedSun(bool val);
void setIsExternallyVisible(bool val);
void setAllowDirectTeleport(bool val);
void setDenyAnonymous(bool val);
void setDenyAgeUnverified(bool val);
void setAllowVoiceChat(bool val);
void setSunHour(F32 sun_hour) { mSunHour = sun_hour; }
protected:
typedef std::vector<std::string> strings_t;
friend class LLSingleton<LLEstateInfoModel>;
friend class LLDispatchEstateUpdateInfo;
friend class LLEstateChangeInfoResponder;
LLEstateInfoModel();
/// refresh model with data from the incoming server message
void update(const strings_t& strings);
void notifyCommit();
private:
bool commitEstateInfoCaps();
void commitEstateInfoDataserver();
U32 getFlags() const { return mFlags; }
void setFlag(U32 flag, bool val);
std::string getInfoDump();
// estate info
std::string mName; /// estate name
LLUUID mOwnerID; /// estate owner id
U32 mID; /// estate id
U32 mFlags; /// estate flags
F32 mSunHour; /// estate sun hour
update_signal_t mUpdateSignal; /// emitted when we receive update from sim
update_signal_t mCommitSignal; /// emitted when our update gets applied to sim
};
#endif // LL_LLESTATEINFOMODEL_H

View File

@ -27,7 +27,6 @@
#include "llviewerprecompiledheaders.h"
#include "llfloaterauction.h"
#include "llfloaterregioninfo.h"
#include "llgl.h"
#include "llimagej2c.h"
@ -40,6 +39,7 @@
#include "llagent.h"
#include "llcombobox.h"
#include "llestateinfomodel.h"
#include "llmimetypes.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
@ -114,16 +114,9 @@ void LLFloaterAuction::initialize()
getChildView("reset_parcel_btn")->setEnabled(TRUE);
getChildView("start_auction_btn")->setEnabled(TRUE);
LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
if (panel)
{ // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
U32 estate_id = panel->getEstateID();
getChildView("sell_to_anyone_btn")->setEnabled((estate_id == ESTATE_TEEN || estate_id == 0));
}
else
{ // Don't have the panel up, so don't know if we're on the teen grid or not. Default to enabling it
getChildView("sell_to_anyone_btn")->setEnabled(TRUE);
}
U32 estate_id = LLEstateInfoModel::instance().getID();
// Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
getChildView("sell_to_anyone_btn")->setEnabled(estate_id == ESTATE_TEEN || estate_id == 0);
}
else
{

View File

@ -751,10 +751,7 @@ void LLFloaterPreference::onBtnOK()
closeFloater(false);
LLUIColorTable::instance().saveUserSettings();
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
// save all settings, even if equals defaults
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
}
else
{

View File

@ -54,6 +54,7 @@
#include "llcombobox.h"
#include "lldaycyclemanager.h"
#include "llenvmanager.h"
#include "llestateinfomodel.h"
#include "llfilepicker.h"
#include "llfloatergodtools.h" // for send_sim_wide_deletes()
#include "llfloatertopobjects.h" // added to fix SL-32336
@ -1363,6 +1364,9 @@ LLPanelEstateInfo::LLPanelEstateInfo()
: LLPanelRegionInfo(),
mEstateID(0) // invalid
{
LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
}
// static
@ -1385,29 +1389,6 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
estate_dispatch_initialized = true;
}
#ifndef TMP_DISABLE_WLES
// Disables the sun-hour slider and the use fixed time check if the use global time is check
void LLPanelEstateInfo::onChangeUseGlobalTime()
{
bool enabled = !getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
getChildView("sun_hour_slider")->setEnabled(enabled);
getChildView("fixed_sun_check")->setEnabled(enabled);
getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(FALSE));
enableButton("apply_btn");
}
// Enables the sun-hour slider if the fixed-sun checkbox is set
void LLPanelEstateInfo::onChangeFixedSun()
{
bool enabled = !getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
getChildView("use_global_time_check")->setEnabled(enabled);
getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(FALSE));
enableButton("apply_btn");
}
#endif // TMP_DISABLE_WLES
//---------------------------------------------------------------------------
// Add/Remove estate access button callbacks
//---------------------------------------------------------------------------
@ -1610,10 +1591,7 @@ std::string all_estates_text()
// static
bool LLPanelEstateInfo::isLindenEstate()
{
LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
if (!panel) return false;
U32 estate_id = panel->getEstateID();
U32 estate_id = LLEstateInfoModel::instance().getID();
return (estate_id <= ESTATE_LAST_LINDEN);
}
@ -1975,7 +1953,7 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
// Can't ban people from mainland, orientation islands, etc. because this
// creates much network traffic and server load.
// Disable their accounts in CSR tool instead.
bool linden_estate = (getEstateID() <= ESTATE_LAST_LINDEN);
bool linden_estate = isLindenEstate();
bool enable_ban = (god || owner || manager) && !linden_estate;
getChildView("add_banned_avatar_btn")->setEnabled(enable_ban);
getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban);
@ -1987,6 +1965,8 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
getChildView("add_estate_manager_btn")->setEnabled(god || owner);
getChildView("remove_estate_manager_btn")->setEnabled(god || owner);
getChildView("estate_manager_name_list")->setEnabled(god || owner);
refresh();
}
bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
@ -2093,10 +2073,13 @@ BOOL LLPanelEstateInfo::postBuild()
void LLPanelEstateInfo::refresh()
{
// Disable access restriction controls if they make no sense.
bool public_access = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
getChildView("Only Allow")->setEnabled(public_access);
getChildView("limit_payment")->setEnabled(public_access);
getChildView("limit_age_verified")->setEnabled(public_access);
// if this is set to false, then the limit fields are meaningless and should be turned off
if (public_access == false)
{
@ -2105,6 +2088,39 @@ void LLPanelEstateInfo::refresh()
}
}
void LLPanelEstateInfo::refreshFromEstate()
{
const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName());
setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString());
getChild<LLUICtrl>("externally_visible_check")->setValue(estate_info.getIsExternallyVisible());
getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat());
getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport());
getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous());
getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified());
// If visible from mainland, disable the access allowed
// UI, as anyone can teleport there.
// However, gods need to be able to edit the access list for
// linden estates, regardless of visibility, to allow object
// and L$ transfers.
{
bool visible_from_mainland = estate_info.getIsExternallyVisible();
bool god = gAgent.isGodlike();
bool linden_estate = isLindenEstate();
bool enable_agent = (!visible_from_mainland || (god && linden_estate));
bool enable_group = enable_agent;
bool enable_ban = !linden_estate;
setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
}
refresh();
}
BOOL LLPanelEstateInfo::sendUpdate()
{
llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl;
@ -2112,7 +2128,7 @@ BOOL LLPanelEstateInfo::sendUpdate()
LLNotification::Params params("ChangeLindenEstate");
params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2));
if (getEstateID() <= ESTATE_LAST_LINDEN)
if (isLindenEstate())
{
// trying to change reserved estate, warn
LLNotifications::instance().add(params);
@ -2131,13 +2147,21 @@ bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, con
switch(option)
{
case 0:
// send the update
if (!commitEstateInfoCaps())
{
// the caps method failed, try the old way
LLFloaterRegionInfo::nextInvoice();
commitEstateInfoDataserver();
LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
// update model
estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore
estate_info.setIsExternallyVisible(getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean());
estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean());
estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean());
estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean());
estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean());
// send the update to sim
estate_info.sendEstateInfo();
}
// we don't want to do this because we'll get it automatically from the sim
// after the spaceserver processes it
// else
@ -2194,6 +2218,8 @@ public:
// if we get a normal response, handle it here
virtual void result(const LLSD& content)
{
LL_INFOS("Windlight") << "Successfully committed estate info" << llendl;
// refresh the panel from the database
LLPanelEstateInfo* panel = dynamic_cast<LLPanelEstateInfo*>(mpPanel.get());
if (panel)
@ -2210,178 +2236,6 @@ private:
LLHandle<LLPanel> mpPanel;
};
// tries to send estate info using a cap; returns true if it succeeded
bool LLPanelEstateInfo::commitEstateInfoCaps()
{
std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
if (url.empty())
{
// whoops, couldn't find the cap, so bail out
return false;
}
LLSD body;
body["estate_name"] = getEstateName();
body["is_externally_visible"] = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
body["allow_direct_teleport"] = getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean();
body["deny_anonymous" ] = getChild<LLUICtrl>("limit_payment")->getValue().asBoolean();
body["deny_age_unverified" ] = getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean();
body["allow_voice_chat" ] = getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean();
body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
// block fly is in estate database but not in estate UI, so we're not supporting it
//body["block_fly" ] = getChild<LLUICtrl>("")->getValue().asBoolean();
F32 sun_hour = getSunHour();
if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
{
sun_hour = 0.f; // 0 = global time
}
body["sun_hour"] = sun_hour;
// we use a responder so that we can re-get the data after committing to the database
LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
return true;
}
/* This is the old way of doing things, is deprecated, and should be
deleted when the dataserver model can be removed */
// key = "estatechangeinfo"
// strings[0] = str(estate_id) (added by simulator before relay - not here)
// strings[1] = estate_name
// strings[2] = str(estate_flags)
// strings[3] = str((S32)(sun_hour * 1024.f))
void LLPanelEstateInfo::commitEstateInfoDataserver()
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("EstateOwnerMessage");
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
msg->nextBlock("MethodData");
msg->addString("Method", "estatechangeinfo");
msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
msg->nextBlock("ParamList");
msg->addString("Parameter", getEstateName());
std::string buffer;
buffer = llformat("%u", computeEstateFlags());
msg->nextBlock("ParamList");
msg->addString("Parameter", buffer);
F32 sun_hour = getSunHour();
if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
{
sun_hour = 0.f; // 0 = global time
}
buffer = llformat("%d", (S32)(sun_hour*1024.0f));
msg->nextBlock("ParamList");
msg->addString("Parameter", buffer);
gAgent.sendMessage();
}
void LLPanelEstateInfo::setEstateFlags(U32 flags)
{
getChild<LLUICtrl>("externally_visible_check")->setValue(LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) );
getChild<LLUICtrl>("voice_chat_check")->setValue(
LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE));
getChild<LLUICtrl>("allow_direct_teleport")->setValue(LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
getChild<LLUICtrl>("limit_payment")->setValue(LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
getChild<LLUICtrl>("limit_age_verified")->setValue(LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) );
refresh();
}
U32 LLPanelEstateInfo::computeEstateFlags()
{
U32 flags = 0;
if (getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean())
{
flags |= REGION_FLAGS_EXTERNALLY_VISIBLE;
}
if ( getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean() )
{
flags |= REGION_FLAGS_ALLOW_VOICE;
}
if (getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean())
{
flags |= REGION_FLAGS_ALLOW_DIRECT_TELEPORT;
}
if (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean())
{
flags |= REGION_FLAGS_DENY_ANONYMOUS;
}
if (getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean())
{
flags |= REGION_FLAGS_DENY_AGEUNVERIFIED;
}
return flags;
}
BOOL LLPanelEstateInfo::getGlobalTime()
{
return getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
}
void LLPanelEstateInfo::setGlobalTime(bool b)
{
getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(b));
getChildView("fixed_sun_check")->setEnabled(LLSD(!b));
getChildView("sun_hour_slider")->setEnabled(LLSD(!b));
if (b)
{
getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(0.f));
}
}
BOOL LLPanelEstateInfo::getFixedSun()
{
return getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
}
void LLPanelEstateInfo::setSunHour(F32 sun_hour)
{
if(sun_hour < 6.0f)
{
sun_hour = 24.0f + sun_hour;
}
getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(sun_hour));
}
F32 LLPanelEstateInfo::getSunHour()
{
if (getChildView("sun_hour_slider")->getEnabled())
{
return (F32)getChild<LLUICtrl>("sun_hour_slider")->getValue().asReal();
}
return 0.f;
}
const std::string LLPanelEstateInfo::getEstateName() const
{
return getChild<LLUICtrl>("estate_name")->getValue().asString();
}
void LLPanelEstateInfo::setEstateName(const std::string& name)
{
getChild<LLUICtrl>("estate_name")->setValue(LLSD(name));
}
const std::string LLPanelEstateInfo::getOwnerName() const
{
return getChild<LLUICtrl>("estate_owner")->getValue().asString();
@ -2884,55 +2738,10 @@ bool LLDispatchEstateUpdateInfo::operator()(
{
lldebugs << "Received estate update" << llendl;
LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
if (!panel) return true;
// NOTE: LLDispatcher extracts strings with an extra \0 at the
// end. If we pass the std::string direct to the UI/renderer
// it draws with a weird character at the end of the string.
std::string estate_name = strings[0].c_str(); // preserve c_str() call!
panel->setEstateName(estate_name);
LLViewerRegion* regionp = gAgent.getRegion();
LLUUID owner_id(strings[1]);
regionp->setOwner(owner_id);
// Update estate owner name in UI
std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString();
panel->setOwnerName(owner_name);
U32 estate_id = strtoul(strings[2].c_str(), NULL, 10);
panel->setEstateID(estate_id);
U32 flags = strtoul(strings[3].c_str(), NULL, 10);
panel->setEstateFlags(flags);
F32 sun_hour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
if(sun_hour == 0 && (flags & REGION_FLAGS_SUN_FIXED ? FALSE : TRUE))
{
lldebugs << "Estate uses global time" << llendl;
panel->setGlobalTime(TRUE);
}
else
{
lldebugs << "Estate sun hour: " << sun_hour << llendl;
panel->setGlobalTime(FALSE);
panel->setSunHour(sun_hour);
}
bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE);
bool god = gAgent.isGodlike();
bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN);
// If visible from mainland, disable the access allowed
// UI, as anyone can teleport there.
// However, gods need to be able to edit the access list for
// linden estates, regardless of visibility, to allow object
// and L$ transfers.
bool enable_agent = (!visible_from_mainland || (god && linden_estate));
bool enable_group = enable_agent;
bool enable_ban = !linden_estate;
panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
// Update estate info model.
// This will call LLPanelEstateInfo::refreshFromEstate().
// *TODO: Move estate message handling stuff to llestateinfomodel.cpp.
LLEstateInfoModel::instance().update(strings);
return true;
}
@ -3275,6 +3084,20 @@ void LLPanelEnvironmentInfo::sendRegionSunUpdate()
region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice());
}
void LLPanelEnvironmentInfo::fixEstateSun()
{
// We don't support fixed sun estates anymore and need to fix
// such estates for region day cycle to take effect.
// *NOTE: Assuming that current estate settings have arrived already.
LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
if (estate_info.getUseFixedSun())
{
llinfos << "Switching estate to global sun" << llendl;
estate_info.setUseFixedSun(false);
estate_info.sendEstateInfo();
}
}
void LLPanelEnvironmentInfo::populateWaterPresetsList()
{
mWaterPresetCombo->removeall();
@ -3668,6 +3491,9 @@ void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)
// That is caused by the simulator re-sending the region info, which in turn makes us
// re-request and display old region environment settings while the new ones haven't been applied yet.
sendRegionSunUpdate();
// Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506).
fixEstateSun();
}
else
{

View File

@ -304,23 +304,9 @@ public:
virtual BOOL postBuild();
virtual void updateChild(LLUICtrl* child_ctrl);
virtual void refresh();
U32 computeEstateFlags();
void setEstateFlags(U32 flags);
BOOL getGlobalTime();
void setGlobalTime(bool b);
BOOL getFixedSun(); // *TODO: deprecated
F32 getSunHour(); // *TODO: deprecated
void setSunHour(F32 sun_hour); // *TODO: deprecated
void refreshFromEstate();
const std::string getEstateName() const;
void setEstateName(const std::string& name);
U32 getEstateID() const { return mEstateID; }
void setEstateID(U32 estate_id) { mEstateID = estate_id; }
static bool isLindenEstate();
const std::string getOwnerName() const;
@ -334,8 +320,6 @@ protected:
// confirmation dialog callback
bool callbackChangeLindenEstate(const LLSD& notification, const LLSD& response);
void commitEstateInfoDataserver();
bool commitEstateInfoCaps();
void commitEstateAccess();
void commitEstateManagers();
@ -434,6 +418,7 @@ private:
void setDirty(bool dirty);
void sendRegionSunUpdate();
void fixEstateSun();
void populateWaterPresetsList();
void populateSkyPresetsList();

View File

@ -566,7 +566,7 @@ bool toggle_show_object_render_cost(const LLSD& newvalue)
return true;
}
void toggle_updater_service_active(LLControlVariable* control, const LLSD& new_value)
void toggle_updater_service_active(const LLSD& new_value)
{
if(new_value.asInteger())
{
@ -735,7 +735,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));
gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(&toggle_updater_service_active);
gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));
gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));
}

View File

@ -35,7 +35,7 @@
#include "llweb.h"
const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/";
const char* DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";
const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";

View File

@ -1563,6 +1563,25 @@ LLViewerWindow::LLViewerWindow(
ignore_pixel_depth,
gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
if (NULL == mWindow)
{
LLSplashScreen::update(LLTrans::getString("StartupRequireDriverUpdate"));
LL_WARNS("Window") << "Failed to create window, to be shutting Down, be sure your graphics driver is updated." << llendl ;
ms_sleep(5000) ; //wait for 5 seconds.
LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
#if LL_LINUX || LL_SOLARIS
llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
<< llendl;
#else
LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
<< LL_ENDL;
#endif
LLAppViewer::instance()->fastQuit(1);
}
if (!LLAppViewer::instance()->restoreErrorTrap())
{
LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
@ -1578,19 +1597,6 @@ LLViewerWindow::LLViewerWindow(
gSavedSettings.setS32("FullScreenHeight",scr.mY);
}
if (NULL == mWindow)
{
LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
#if LL_LINUX || LL_SOLARIS
llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
<< llendl;
#else
LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
<< LL_ENDL;
#endif
LLAppViewer::instance()->fastQuit(1);
}
// Get the real window rect the window was created with (since there are various OS-dependent reasons why
// the size of a window or fullscreen context may have been adjusted slightly...)
F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");

View File

@ -62,12 +62,12 @@ IDI_LCD_LL_ICON ICON "icon1.ico"
// Dialog
//
SPLASHSCREEN DIALOG 32, 32, 144, 34
SPLASHSCREEN DIALOG 32, 32, 264, 34
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE
FONT 8, "MS Sans Serif"
BEGIN
ICON IDI_LL_ICON,IDC_STATIC,7,7,20,20
LTEXT "Loading Second Life...",666,36,13,91,8
LTEXT "Loading Second Life...",666,36,13,211,8
END
@ -82,7 +82,7 @@ BEGIN
"SPLASHSCREEN", DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 137
RIGHTMARGIN, 257
VERTGUIDE, 36
TOPMARGIN, 7
BOTTOMMARGIN, 27

View File

@ -133,12 +133,12 @@
0
</text>
<button label="Land kaufen" label_selected="Land kaufen..." name="Buy Land..."/>
<button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
<button label="Skriptinfo" name="Scripts..."/>
<button label="Für Gruppe kaufen" label_selected="Für Gruppe kaufen..." name="Buy For Group..."/>
<button label="Pass kaufen" label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/>
<button label="Land aufgeben" label_selected="Land aufgeben..." name="Abandon Land..."/>
<button label="Land in Besitz nehmen" label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/>
<button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
</panel>
<panel label="VERTRAG" name="land_covenant_panel">
<panel.string name="can_resell">
@ -309,6 +309,9 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<panel.string name="push_restrict_region_text">
Kein Stoßen (regional)
</panel.string>
<panel.string name="see_avs_text">
Auf dieser Parzelle Einwohner sehen und mit ihnen chatten
</panel.string>
<text name="allow_label">
Anderen Einwohnern gestatten:
</text>
@ -371,6 +374,10 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<text name="allow_label5">
Einwohnern auf anderen Parzellen Folgendes gestatten:
</text>
<check_box label="Avatare sehen" name="SeeAvatarsCheck" tool_tip="Gestattet sowohl Einwohnern auf anderen Parzellen, Einwohner auf dieser Parzelle zu sehen und mit ihnen zu chatten, als auch Ihnen, diese Einwohner auf anderen Parzellen zu sehen und mit ihnen zu chatten."/>
<text name="landing_point">
Landepunkt: [LANDING]
</text>
@ -427,6 +434,11 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Sound:
</text>
<check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/>
<text name="Avatar Sounds:">
Avatarsounds:
</text>
<check_box label="Jeder" name="all av sound check"/>
<check_box label="Gruppe" name="group av sound check"/>
<text name="Voice settings:">
Voice:
</text>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<floater name="Delete Env Preset" title="UMGEB.VOREINST. LÖSCHEN">
<string name="title_water">
Wasser-Voreinstellung löschen
</string>
<string name="title_sky">
Hilmmel-Voreinstellung löschen
</string>
<string name="title_day_cycle">
Tageszyklus löschen
</string>
<string name="label_water">
Voreinstellung:
</string>
<string name="label_sky">
Voreinstellung:
</string>
<string name="label_day_cycle">
Tageszyklus:
</string>
<string name="msg_confirm_deletion">
Möchten Sie die ausgewählte Voreinstellung wirklich löschen?
</string>
<string name="msg_sky_is_referenced">
Eine Voreinstellung, auf die sich ein Tageszyklus bezieht, kann nicht gelöscht werden.
</string>
<string name="combo_label">
-Voreinstellung auswählen-
</string>
<text name="label">
Voreinstellung:
</text>
<button label="Löschen" name="delete"/>
<button label="Abbrechen" name="cancel"/>
</floater>

View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Day cycle" title="Tageszyklus bearbeiten">
<string name="title_new">
Neuen Tageszyklus erstellen
</string>
<string name="title_edit">
Tageszyklus bearbeiten
</string>
<string name="hint_new">
Geben Sie einen Namen für den Tageszyklus ein, passen Sie die Steuerungen an, um den Tageszyklus zu erstellen, und klicken Sie auf „Speichern“.
</string>
<string name="hint_edit">
Um den Tageszyklus zu bearbeiten, passen Sie die Steuerungen unten an und klicken Sie auf „Speichern“.
</string>
<string name="combo_label">
-Voreinstellung auswählen-
</string>
<text name="label">
Name der Voreinstellung:
</text>
<text name="note">
Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
</text>
<text name="hint_item1">
- Klicken Sie auf eine Registerkarte, um die Himmeleinstellungen und die Uhrzeit zu bearbeiten.
</text>
<text name="hint_item2">
- Klicken und ziehen Sie die Registerkarten, um die Übergangszeiten einzustellen.
</text>
<text name="hint_item3">
- Anhand des Scrubbers können Sie eine Vorschau Ihres Tageszyklus anzeigen.
</text>
<panel name="day_cycle_slider_panel">
<multi_slider initial_value="0" name="WLTimeSlider"/>
<multi_slider initial_value="0" name="WLDayCycleKeys"/>
<button label="Schlüssel hinzufügen" label_selected="Schlüssel hinzufügen" name="WLAddKey"/>
<button label="Schlüssel löschen" label_selected="Schlüssel löschen" name="WLDeleteKey"/>
<text name="WL12am">
0:00
</text>
<text name="WL3am">
3:00
</text>
<text name="WL6am">
6:00
</text>
<text name="WL9amHash">
9:00
</text>
<text name="WL12pmHash">
12:00
</text>
<text name="WL3pm">
15:00
</text>
<text name="WL6pm">
18:00
</text>
<text name="WL9pm">
21:00
</text>
<text name="WL12am2">
0:00
</text>
<text name="WL12amHash">
|
</text>
<text name="WL3amHash">
I
</text>
<text name="WL6amHash">
|
</text>
<text name="WL9amHash2">
I
</text>
<text name="WL12pmHash2">
|
</text>
<text name="WL3pmHash">
I
</text>
<text name="WL6pmHash">
|
</text>
<text name="WL9pmHash">
I
</text>
<text name="WL12amHash2">
|
</text>
</panel>
<text name="WLCurKeyPresetText">
Himmeleinstellung:
</text>
<combo_box label="Voreinstellung" name="WLSkyPresets"/>
<text name="WLCurKeyTimeText">
Uhrzeit:
</text>
<time name="time" value="6:00"/>
<check_box label="Zu meinem neuen Tageszyklus machen" name="make_default_cb"/>
<button label="Speichern" name="save"/>
<button label="Abbrechen" name="cancel"/>
</floater>

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Sky Preset" title="Himmel-Voreinstellung bearbeiten">
<string name="title_new">
Neue Himmel-Voreinstellung erstellen
</string>
<string name="title_edit">
Himmel-Voreinstellung bearbeiten
</string>
<string name="hint_new">
Geben Sie einen Namen für die Voreinstellung ein, passen Sie die Steuerungen an, um die Voreinstellung zu erstellen, und klicken Sie dann auf „Speichern“.
</string>
<string name="hint_edit">
Um Ihre Himmel-Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
</string>
<string name="combo_label">
-Voreinstellung auswählen-
</string>
<text name="hint">
Um Ihre Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
</text>
<text name="label">
Name der Voreinstellung:
</text>
<text name="note">
Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
</text>
<tab_container name="WindLight Tabs">
<panel label="ATMOSPHÄRE" name="Atmosphere">
<text name="BHText">
Blauer Horizont
</text>
<text name="BDensText">
Horizonttrübung
</text>
<text name="BDensText2">
Farbintensität
</text>
<text name="HDText">
Trübungsintensität
</text>
<text name="DensMultText">
Dichtemultiplikator
</text>
<text name="WLDistanceMultText">
Entfernungsmultiplikator
</text>
<text name="MaxAltText">
Max. Höhe
</text>
</panel>
<panel label="BELEUCHTUNG" name="Lighting">
<text name="SLCText">
Sonne/Mond-Farbe
</text>
<text name="WLAmbientText">
Umgebung
</text>
<text name="SunGlowText">
Sonnenleuchtkraft
</text>
<slider label="Fokus" name="WLGlowB"/>
<slider label="Größe" name="WLGlowR"/>
<text name="WLStarText">
Sternenleuchtkraft
</text>
<text name="SceneGammaText">
Gamma in Szene
</text>
<text name="TODText">
Sonne/Mond-Stand
</text>
<multi_slider initial_value="0" name="WLSunPos"/>
<text name="WL12amHash">
|
</text>
<text name="WL6amHash">
|
</text>
<text name="WL12pmHash2">
|
</text>
<text name="WL6pmHash">
|
</text>
<text name="WL12amHash2">
|
</text>
<text name="WL12am">
0:00
</text>
<text name="WL6am">
3:00
</text>
<text name="WL12pmHash">
12:00
</text>
<text name="WL6pm">
18:00
</text>
<text name="WL12am2">
0:00
</text>
<time name="WLDayTime" value="6:00"/>
<text name="WLEastAngleText">
Ostausrichtung
</text>
</panel>
<panel label="WOLKEN" name="Clouds">
<text name="WLCloudColorText">
Wolkenfarbe
</text>
<text name="WLCloudColorText2">
Wolken-XY/Dichte
</text>
<slider label="X" name="WLCloudX"/>
<slider label="Y" name="WLCloudY"/>
<slider label="D" name="WLCloudDensity"/>
<text name="WLCloudCoverageText">
Wolkendichte
</text>
<text name="WLCloudScaleText">
Wolkenskalierung
</text>
<text name="WLCloudDetailText">
Wolkendetails (XY/Dichte)
</text>
<slider label="X" name="WLCloudDetailX"/>
<slider label="Y" name="WLCloudDetailY"/>
<slider label="D" name="WLCloudDetailDensity"/>
<text name="WLCloudScrollXText">
Wolkenbewegung X
</text>
<check_box label="Sperren" name="WLCloudLockX"/>
<text name="WLCloudScrollYText">
Wolkenbewegung Y
</text>
<check_box label="Sperren" name="WLCloudLockY"/>
</panel>
</tab_container>
<check_box label="Diese Voreinstellung zu meiner neuen Himmeleinstellung machen" name="make_default_cb"/>
<button label="Speichern" name="save"/>
<button label="Abbrechen" name="cancel"/>
</floater>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Water Preset" title="Wasser-Voreinstellung bearbeiten">
<string name="title_new">
Neue Wasser-Voreinstellung erstellen
</string>
<string name="title_edit">
Wasser-Voreinstellung bearbeiten
</string>
<string name="hint_new">
Geben Sie einen Namen für die Voreinstellung ein, passen Sie die Steuerungen an, um die Voreinstellung zu erstellen, und klicken Sie dann auf „Speichern“.
</string>
<string name="hint_edit">
Um Ihre Wasser-Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
</string>
<string name="combo_label">
-Voreinstellung auswählen-
</string>
<text name="hint">
Um Ihre Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
</text>
<text name="label">
Name der Voreinstellung:
</text>
<text name="note">
Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
</text>
<panel name="panel_water_preset">
<text name="water_color_label">
Trübungsfarbe
</text>
<text name="water_fog_density_label">
Exponent für Trübungsdichte
</text>
<text name="underwater_fog_modifier_label">
Modifikator für Wassertrübung
</text>
<text name="BHText">
Richtung für große Wellen
</text>
<slider label="X" name="WaterWave1DirX"/>
<slider label="Y" name="WaterWave1DirY"/>
<text name="BDensText">
Reflexionswellengröße
</text>
<text name="HDText">
Fresnel-Skalierung
</text>
<text name="FresnelOffsetText">
Fresnel-Versatz
</text>
<text name="BHText2">
Richtung für kleine Wellen
</text>
<slider label="X" name="WaterWave2DirX"/>
<slider label="Y" name="WaterWave2DirY"/>
<text name="DensMultText">
Brechungsstärke oben
</text>
<text name="WaterScaleBelowText">
Brechungsstärke unten
</text>
<text name="MaxAltText">
Mischungsmultiplikator
</text>
<text name="BHText3">
Normal-Map
</text>
</panel>
<check_box label="Diese Voreinstellung zu meiner neuen Wassereinstellung machen" name="make_default_cb"/>
<button label="Speichern" name="save"/>
<button label="Abbrechen" name="cancel"/>
</floater>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Environment Editor Floater" title="UMGEBUNGSEINSTELLUNGEN">
<text name="note">
Anhand der Optionen unten können Sie die Umgebungseinstellungen für Ihren Viewer anpassen.
</text>
<radio_group name="region_settings_radio_group">
<radio_item label="Regionseinstellungen verwenden" name="use_region_settings"/>
<radio_item label="Meine Umgebung anpassen" name="use_my_settings"/>
</radio_group>
<panel name="user_environment_settings">
<text name="note">
Hinweis: Ihre benutzerdefinierten Einstellungen sind für andere Benutzer nicht sichtbar.
</text>
<text name="water_settings_title">
Wassereinstellung
</text>
<combo_box name="water_settings_preset_combo">
<combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
Himmel / Tageszyklus
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Fester Himmel" name="my_sky_settings"/>
<radio_item label="Tageszyklus" name="my_dayc_settings"/>
</radio_group>
<combo_box name="sky_settings_preset_combo">
<combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
</combo_box>
<combo_box name="dayc_settings_preset_combo">
<combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
</combo_box>
</panel>
<button label="OK" name="ok_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</floater>

View File

@ -3,6 +3,9 @@
<string name="status_idle">
Inaktiv
</string>
<string name="status_parse_error">
DAE-Parsing-Fehler. Details siehe Protokoll.
</string>
<string name="status_reading_file">
Laden...
</string>
@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
</string>
<string name="bad_element">
Fehler: ungültiges Element.
</string>
<string name="high">
Hoch
</string>

View File

@ -193,6 +193,9 @@
<string name="status_idle">
Inaktiv
</string>
<string name="status_parse_error">
DAE-Parsing-Fehler. Details siehe Protokoll.
</string>
<string name="status_reading_file">
Laden...
</string>
@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
</string>
<string name="bad_element">
Fehler: ungültiges Element.
</string>
<string name="high">
Hoch
</string>

View File

@ -66,7 +66,7 @@
<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
<button label="Link" name="link_btn" width="30"/>
<button label="Verknüpfung auflösen" name="unlink_btn" width="126"/>
<text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt" left_pad="0">
<text left_pad="0" name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt">
þ: [COUNT]
</text>
<check_box label="" name="checkbox uniform"/>
@ -408,7 +408,7 @@
</combo_box>
<spinner label="Schwerkraft" name="Physics Gravity"/>
<spinner label="Reibung" name="Physics Friction"/>
<spinner label="Dichte" name="Physics Density"/>
<spinner label="Dichte in 100 kg/m^3" name="Physics Density"/>
<spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Textur" name="Texture">

View File

@ -18,7 +18,7 @@
<menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
<menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
<menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
<menu_item_call label="Test Webinhalt-Floater" name="Web Content Floater Test"/>
<menu_item_call label="Web Content Floater Debug Test" name="Web Content Floater Debug Test"/>
<menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/>
<menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/>
</menu>

View File

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
<toggleable_menu name="menu_group_plus">
<menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
<menu_item_check label="Nach Name sortieren" name="sort_name"/>
<menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
<menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
<menu_item_check label="Karte anzeigen" name="view_map"/>
<menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
</menu>
</toggleable_menu>

View File

@ -31,6 +31,7 @@
<menu_item_call label="Meine Gruppen" name="My Groups"/>
<menu_item_check label="Chat in der Nähe" name="Nearby Chat"/>
<menu_item_call label="Leute in der Nähe" name="Active Speakers"/>
<menu_item_check label="Stimme in der Nähe" name="Nearby Voice"/>
</menu>
<menu label="Welt" name="World">
<menu_item_check label="Minikarte" name="Mini-Map"/>
@ -63,8 +64,24 @@
<menu_item_call label="Mittag" name="Noon"/>
<menu_item_call label="Sonnenuntergang" name="Sunset"/>
<menu_item_call label="Mitternacht" name="Midnight"/>
<menu_item_call label="Grundbesitzzeit" name="Revert to Region Default"/>
<menu_item_call label="Umwelt-Editor" name="Environment Editor"/>
</menu>
<menu label="Umgebungs-Editor" name="Enviroment Editor">
<menu_item_call label="Umgebungseinstellungen..." name="Enviroment Settings"/>
<menu label="Wasser-Voreinstellungen" name="Water Presets">
<menu_item_call label="Neue Voreinstellung..." name="new_water_preset"/>
<menu_item_call label="Voreinstellung bearbeiten..." name="edit_water_preset"/>
<menu_item_call label="Voreinstellung löschen..." name="delete_water_preset"/>
</menu>
<menu label="Himmel-Voreinstellungen" name="Sky Presets">
<menu_item_call label="Neue Voreinstellung..." name="new_sky_preset"/>
<menu_item_call label="Voreinstellung bearbeiten..." name="edit_sky_preset"/>
<menu_item_call label="Voreinstellung löschen..." name="delete_sky_preset"/>
</menu>
<menu label="Tag-Voreinstellungen" name="Day Presets">
<menu_item_call label="Neue Voreinstellung..." name="new_day_preset"/>
<menu_item_call label="Voreinstellung bearbeiten..." name="edit_day_preset"/>
<menu_item_call label="Voreinstellung löschen..." name="delete_day_preset"/>
</menu>
</menu>
</menu>
<menu label="Bauen" name="BuildTools">

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Gear Wearing">
<toggleable_menu name="Gear Wearing">
<menu_item_call label="Outfit bearbeiten" name="edit"/>
<menu_item_call label="Ausziehen" name="takeoff"/>
</menu>
<menu_item_call label="Outfitliste in Zwischenablage kopieren" name="copy"/>
</toggleable_menu>

View File

@ -1565,6 +1565,11 @@ Versuchen Sie es später erneut.
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
<notification name="TooManyTeleportOffers">
Sie haben versucht, [OFFERS] Teleport-Angebote zu machen,
womit Sie die Höchstgrenze von [LIMIT] überschreiten.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="OfferTeleportFromGod">
Einwohner zu Ihrem Standort einladen?
<form name="form">
@ -1986,6 +1991,10 @@ Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschl
Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmClearCache">
Möchten Sie Ihren Viewer-Cache wirklich leeren?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Sind Sie sicher, dass Sie Ihre Cookies löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
@ -2011,49 +2020,31 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies
Die gespeicherte Voreinstellung überschreiben?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="WLDeletePresetAlert">
[SKY] löschen?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="WLNoEditDefault">
Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
</notification>
<notification name="WLMissingSky">
Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY].
</notification>
<notification name="WLRegionApplyFail">
Die Einstellungen konnten nicht auf die Region angewendet werden. Verlassen Sie die Region und kehren Sie zurück, um das Problem zu beheben. Angegebener Grund: [FAIL_REASON]
</notification>
<notification name="EnvCannotDeleteLastDayCycleKey">
Der letzte Schlüssel in diesem Tageszyklus kann nicht gelöscht werden, da ein Tageszyklus nicht leer sein kann. Statt den letzten verbleibenden Schlüssel zu löschen, versuchen Sie stattdessen, ihn zu modifizieren und dann einen neuen zu erstellen.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="DayCycleTooManyKeyframes">
Sie können diesem Tageszyklus keine Keyframes mehr hinzufügen. Die Höchstzahl an Keyframes für Tageszyklen mit Umfang [SCOPE] beträgt [MAX].
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="EnvUpdateRate">
Sie können die Umgebungseinstellungen der Region nur alle [WAIT] Sekunden aktualisieren. Warten Sie mindestens so lange und versuchen Sie es dann erneut.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="PPSaveEffectAlert">
Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="NewSkyPreset">
Wählen Sie einen Namen für den neuen Himmel.
<form name="form">
<input name="message">
Neue Voreinstellung
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
<notification name="ExistsSkyPresetAlert">
Voreinstellung bereits vorhanden!
</notification>
<notification name="NewWaterPreset">
Wählen Sie einen Namen für die neue Wasservoreinstellung.
<form name="form">
<input name="message">
Neue Voreinstellung
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
<notification name="ExistsWaterPresetAlert">
Voreinstellung bereits vorhanden!
</notification>
<notification name="WaterNoEditDefault">
Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
</notification>
<notification name="ChatterBoxSessionStartError">
Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden.
[REASON]
@ -2343,6 +2334,9 @@ Fliegen ist hier nicht möglich.
<notification name="NoBuild">
In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen.
</notification>
<notification name="SeeAvatars">
Diese Parzelle verbirgt Avatare und Text-Chat vor einer anderen Parzelle. Sie können Einwohner außerhalb dieser Parzelle weder sehen noch von ihnen gesehen werden. Regulärer Text-Chat auf Kanal 0 ist ebenfalls blockiert.
</notification>
<notification name="ScriptsStopped">
Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert.
</notification>
@ -2771,7 +2765,9 @@ Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist.
Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten.
</notification>
<notification name="MeshUploadError">
[LABEL] konnte nicht hochgeladen werden: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
[LABEL] konnte nicht hochgeladen werden: [MESSAGE] [IDENTIFIER]
Details finden Sie in der Protokolldatei.
</notification>
<notification name="ShareItemsConfirmation">
Möchten Sie wirklich die folgenden Objekte:

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
<accordion name="outfits_accordion">
<no_matched_tabs_text name="no_matched_outfits_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche]."/>
<no_visible_tabs_text name="no_outfits_msg" value="Sie haben noch keine Outfits. Versuchen Sie es mit der [secondlife:///app/search/all/ ] Suche]."/>
</accordion>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
<menu_button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
<button name="trash_btn" tool_tip="Ausgewähltes Outfit löschen"/>
</panel>
</panel>

View File

@ -67,13 +67,13 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
<button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
</layout_panel>
<layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
<button label="IM" name="im_btn" tool_tip="IM-Sitzung öffnen"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
</layout_panel>
<layout_panel name="share_btn_lp">
<button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/>
<button label="Freigeben" name="share_btn" tool_tip="Inventarobjekt freigeben"/>
</layout_panel>
<layout_panel name="teleport_btn_lp">
<button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>

View File

@ -68,6 +68,8 @@
<text name="scripts_value" value="Ein"/>
<text name="damage_label" value="Schaden:"/>
<text name="damage_value" value="Aus"/>
<text name="see_avatars_label" value="Avatare sehen:"/>
<text name="see_avatars_value" value="Aus"/>
<button label="Über Land" name="about_land_btn"/>
</panel>
</accordion_tab>

View File

@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
<text name="Cache:">
Cache:
</text>
<spinner label="Cache-Größe (64 9.984 MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
<button label="Cache leeren" label_selected="Cache leeren" name="clear_cache"/>
<text name="Cache location">
Cache-Ordner:
</text>
<button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
<button label="Vorgabestandort" label_selected="Vorgabestandort" name="default_cache_location"/>
<text name="UI Size:">
UI-Größe:
</text>

View File

@ -19,6 +19,7 @@
<check_box label="Aktiviert" name="enable_voice_check"/>
<check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben." value="true"/>
<check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden." value="true"/>
<check_box label="Sounds von Gesten abspielen" name="gesture_audio_play_btn" tool_tip="Markieren, um Sounds von Gesten zu hören" value="true"/>
<text name="voice_chat_settings">
Voice-Chat-Einstellungen
</text>
@ -35,28 +36,5 @@
<button label="Taste festlegen" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/>
<button label="Eingabe-/Ausgabegeräte" name="device_settings_btn"/>
<panel label="Geräte-Einstellungen" name="device_settings_panel">
<panel.string name="default_text">
Standard
</panel.string>
<panel.string name="default system device">
Standardgerät
</panel.string>
<panel.string name="no device">
Kein Gerät
</panel.string>
<text name="Input">
Eingabe
</text>
<text name="My volume label">
Meine Lautstärke:
</text>
<slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ändern Sie die Lautstärke mit dem Regler"/>
<text name="wait_text">
Bitte warten
</text>
<text name="Output">
Ausgabe
</text>
</panel>
<panel label="Geräte-Einstellungen" name="device_settings_panel"/>
</panel>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Umgebung" name="panel_env_info">
<text name="water_settings_title">
Wählen Sie die Wasser- und Himmel-/Tageszykluseinstellungen aus, die alle Besucher Ihrer Region sehen sollen. Mehr Infos
</text>
<radio_group name="region_settings_radio_group">
<radio_item label="Second Life-Standard verwenden" name="use_sl_default_settings"/>
<radio_item label="Folgende Einstellungen verwenden" name="use_my_settings"/>
</radio_group>
<panel name="user_environment_settings">
<text name="water_settings_title">
Wassereinstellung
</text>
<combo_box name="water_settings_preset_combo">
<combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
Himmel / Tageszyklus
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Fester Himmel" name="my_sky_settings"/>
<radio_item label="Tageszyklus" name="my_dayc_settings"/>
</radio_group>
<combo_box name="sky_settings_preset_combo">
<combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
</combo_box>
<combo_box name="dayc_settings_preset_combo">
<combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
</combo_box>
</panel>
<button label="Anwenden" name="apply_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terrain" name="Terrain">
<text name="region_text_lbl">
Region:
@ -6,25 +6,55 @@
<text name="region_text">
unbekannt
</text>
<spinner label="Wasserhöhe" name="water_height_spin" />
<button label="?" name="water_height_help" />
<spinner label="Obere Terraingrenze" name="terrain_raise_spin" />
<button label="?" name="terrain_raise_help" />
<spinner label="Untere Terraingrenze" name="terrain_lower_spin" />
<button label="?" name="terrain_lower_help" />
<check_box label="Grundbesitzsonne verwenden" name="use_estate_sun_check" />
<button label="?" name="use_estate_sun_help" />
<check_box label="Sonne fest" name="fixed_sun_check" />
<button label="?" name="fixed_sun_help" />
<slider label="Phase" name="sun_hour_slider" />
<button label="Übernehmen" name="apply_btn" />
<button label="RAW-Terrain herunterladen..." name="download_raw_btn"
tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
<button label="?" name="download_raw_help" />
<button label="RAW-Terrain hochladen..." name="upload_raw_btn"
tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
<button label="?" name="upload_raw_help" />
<button label="Terrain formen" name="bake_terrain_btn"
tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen" />
<button label="?" name="bake_terrain_help" />
<spinner label="Wasserhöhe" name="water_height_spin"/>
<spinner label="Obere Terraingrenze" name="terrain_raise_spin"/>
<spinner label="Untere Terraingrenze" name="terrain_lower_spin"/>
<text name="detail_texture_text">
Terraintexturen (erfordert 24-Bit-.tga-Dateien mit einer Größe von 512x512)
</text>
<text name="height_text_lbl">
1 (niedrig)
</text>
<text name="height_text_lbl2">
2
</text>
<text name="height_text_lbl3">
3
</text>
<text name="height_text_lbl4">
4 (Hoch)
</text>
<text name="height_text_lbl5">
Texturhöhenbereich
</text>
<text name="height_text_lbl10">
Diese Werte geben den Mischungsgrad für die obigen Texturen an.
</text>
<text name="height_text_lbl11">
In Metern gemessen. Der Wert „Niedrig“ ist die maximale Höhe von Textur 1, der Wert „Hoch“ die Mindesthöhe von Textur 4.
</text>
<text name="height_text_lbl6">
Nordwest
</text>
<text name="height_text_lbl7">
Nordost
</text>
<spinner label="Niedrig" name="height_start_spin_1"/>
<spinner label="Niedrig" name="height_start_spin_3"/>
<spinner label="Hoch" name="height_range_spin_1"/>
<spinner label="Hoch" name="height_range_spin_3"/>
<text name="height_text_lbl8">
Südwest
</text>
<text name="height_text_lbl9">
Südost
</text>
<spinner label="Niedrig" name="height_start_spin_0"/>
<spinner label="Niedrig" name="height_start_spin_2"/>
<spinner label="Hoch" name="height_range_spin_0"/>
<spinner label="Hoch" name="height_range_spin_2"/>
<button label="RAW-Terrain herunterladen..." name="download_raw_btn" tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter"/>
<button label="RAW-Terrain hochladen..." name="upload_raw_btn" tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter"/>
<button label="Terrain formen" name="bake_terrain_btn" tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen"/>
<button label="Übernehmen" name="apply_btn"/>
</panel>

View File

@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sonstiges" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
<layout_stack name="inventory_layout_stack">
<layout_panel name="inbox_layout_panel">
<panel label="" name="marketplace_inbox">
<string name="InboxLabelWithArg">
Erhaltene Objekte ([NUM])
</string>
<string name="InboxLabelNoArg">
Erhaltene Objekte
</string>
<button label="Erhaltene Objekte" name="inbox_btn"/>
<text name="inbox_fresh_new_count">
[NUM] neu
</text>
<panel tool_tip="Drag and drop items to your inventory to manage and use them">
<text name="inbox_inventory_placeholder">
Einkäufe auf dem Marktplatz werden hierher geliefert.
</text>
</panel>
</panel>
</layout_panel>
<layout_panel name="outbox_layout_panel">
<panel label="" name="marketplace_outbox">
<button label="Händler-Outbox" name="outbox_btn"/>
<button label="" name="outbox_sync_btn" tool_tip="Zu meiner Marktplatz-Storefront verschieben"/>
<panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
<text name="outbox_inventory_placeholder">
Richtigen Sie ein Händlerkonto ein, um diese Funktion zu verwenden.
</text>
</panel>
</panel>
</layout_panel>
</layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">

View File

@ -1192,6 +1192,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
<string name="InventoryInboxNoItems">
Objekte, die auf dem Marktplatz gekauft wurden, werden hierher geliefert.
</string>
<string name="InventoryOutboxNoItems">
Objekte hierher ziehen, um Sie in Ihrer Marktplatz-Storefront zum Verkauf anzubieten.
</string>
<string name="no_transfer" value=" (kein Transferieren)"/>
<string name="no_modify" value=" (kein Bearbeiten)"/>
<string name="no_copy" value=" (kein Kopieren)"/>
@ -1322,6 +1328,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InvFolder All">
Alle
</string>
<string name="no_attachments">
Keine Anhänge getragen
</string>
<string name="Buy">
Kaufen
</string>
@ -1657,6 +1666,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="IMTeen">
Teen
</string>
<string name="Anyone">
jeder
</string>
<string name="RegionInfoError">
Fehler
</string>
@ -1879,6 +1891,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="Public">
Öffentlich
</string>
<string name="LocalSettings">
Lokale Einstellungen
</string>
<string name="RegionSettings">
Regionseinstellungen
</string>
<string name="ClassifiedClicksTxt">
Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
</string>
@ -3724,6 +3742,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="LocationCtrlGeneralIconTooltip">
Generelle Region
</string>
<string name="LocationCtrlSeeAVsTooltip">
Avatare sichtbar; Chat außerhalb dieser Parzelle gestattet
</string>
<string name="UpdaterWindowTitle">
[APP_NAME] Aktualisierung
</string>

View File

@ -2918,18 +2918,6 @@
function="Floater.Toggle"
parameter="region_debug_console" />
</menu_item_check>
<menu_item_check
label="Region Debug Console"
name="Region Debug Console"
shortcut="control|shift|`"
use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
parameter="region_debug_console" />
<menu_item_check.on_click
function="Floater.Toggle"
parameter="region_debug_console" />
</menu_item_check>
<menu_item_separator />
<menu_item_check

View File

@ -268,7 +268,7 @@
height="23"
layout="topleft"
left_delta="50"
top_pad="5"
top_pad="5"
name="updater_service_combobox"
width="300">
<combo_box.item

View File

@ -18,6 +18,7 @@
<string name="StartupClearingCache">Clearing cache...</string>
<string name="StartupInitializingTextureCache">Initializing Texture Cache...</string>
<string name="StartupInitializingVFS">Initializing VFS...</string>
<string name="StartupRequireDriverUpdate">Graphics Initialization Failed. Please Update Your Graphics Driver!</string>
<!-- progress -->
<string name="ProgressRestoring">Restoring...</string>

View File

@ -133,12 +133,12 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
0
</text>
<button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
<button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
<button label="Información de scripts" name="Scripts..."/>
<button label="Comprar para el grupo" name="Buy For Group..."/>
<button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
<button label="Abandonar el terreno" name="Abandon Land..."/>
<button label="Reclamar el terreno" name="Reclaim Land..."/>
<button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
</panel>
<panel label="CONTRATO" name="land_covenant_panel">
<panel.string name="can_resell">
@ -308,6 +308,9 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="push_restrict_region_text">
Sin &apos;empujones&apos; (prevalece lo marcado en la región)
</panel.string>
<panel.string name="see_avs_text">
Ver a los residentes de esta parcela y chatear con ellos
</panel.string>
<text name="allow_label">
Permitir a otros Residentes:
</text>
@ -370,6 +373,10 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
<text name="allow_label5">
Permitir a los residentes de otras parcelas:
</text>
<check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los residentes de otras parcelas vean a los residentes de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>
<text name="landing_point">
Punto de llegada: [LANDING]
</text>
@ -429,6 +436,11 @@ los media:
Sonido:
</text>
<check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
<text name="Avatar Sounds:">
Sonidos de avatar:
</text>
<check_box label="Todos" name="all av sound check"/>
<check_box label="Grupo" name="group av sound check"/>
<text name="Voice settings:">
Voz:
</text>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<floater name="Delete Env Preset" title="ELIMINAR EL ENV PREDEFINIDO">
<string name="title_water">
Eliminar el agua predefinida
</string>
<string name="title_sky">
Eliminar cielo predefinido
</string>
<string name="title_day_cycle">
Eliminar ciclo del día
</string>
<string name="label_water">
Predefinido:
</string>
<string name="label_sky">
Predefinido:
</string>
<string name="label_day_cycle">
Ciclo del día:
</string>
<string name="msg_confirm_deletion">
¿Estás seguro de que quieres eliminar el valor predefinido seleccionado?
</string>
<string name="msg_sky_is_referenced">
No se puede quitar un valor predefinido al que se hace referencia en otro u otros ciclos del día.
</string>
<string name="combo_label">
-Selecciona un valor predefinido-
</string>
<text name="label">
Predefinido:
</text>
<button label="Borrar" name="delete"/>
<button label="Cancelar" name="cancel"/>
</floater>

View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Day cycle" title="Editar ciclo del día">
<string name="title_new">
Crear un ciclo del día nuevo
</string>
<string name="title_edit">
Editar ciclo del día
</string>
<string name="hint_new">
Asigna un nombre al ciclo del día, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
</string>
<string name="hint_edit">
Para editar el ciclo del día, ajusta los controles siguientes y selecciona &quot;Guardar&quot;.
</string>
<string name="combo_label">
-Selecciona un valor predefinido-
</string>
<text name="label">
Nombre predefinido:
</text>
<text name="note">
Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
</text>
<text name="hint_item1">
- Pulsa en una pestaña para editar la configuración y el tiempo de un cielo determinado.
</text>
<text name="hint_item2">
- Pulsa y arrastra las pestañas para ajustar los tiempos de transición.
</text>
<text name="hint_item3">
- Usa el depurador para obtener una vista previa del ciclo del día.
</text>
<panel name="day_cycle_slider_panel">
<multi_slider initial_value="0" name="WLTimeSlider"/>
<multi_slider initial_value="0" name="WLDayCycleKeys"/>
<button label="Añadir clave" label_selected="Añadir clave" name="WLAddKey"/>
<button label="Eliminar clave" label_selected="Eliminar clave" name="WLDeleteKey"/>
<text name="WL12am">
12 AM
</text>
<text name="WL3am">
3 AM
</text>
<text name="WL6am">
6 AM
</text>
<text name="WL9amHash">
9 AM
</text>
<text name="WL12pmHash">
12 PM
</text>
<text name="WL3pm">
3 PM
</text>
<text name="WL6pm">
6 PM
</text>
<text name="WL9pm">
9 PM
</text>
<text name="WL12am2">
12 AM
</text>
<text name="WL12amHash">
|
</text>
<text name="WL3amHash">
I
</text>
<text name="WL6amHash">
|
</text>
<text name="WL9amHash2">
I
</text>
<text name="WL12pmHash2">
|
</text>
<text name="WL3pmHash">
I
</text>
<text name="WL6pmHash">
|
</text>
<text name="WL9pmHash">
I
</text>
<text name="WL12amHash2">
|
</text>
</panel>
<text name="WLCurKeyPresetText">
Configuración del cielo:
</text>
<combo_box label="Predefinido" name="WLSkyPresets"/>
<text name="WLCurKeyTimeText">
Hora:
</text>
<time name="time" value="6 AM"/>
<check_box label="Convertir en mi nuevo ciclo del día" name="make_default_cb"/>
<button label="Guardar" name="save"/>
<button label="Cancelar" name="cancel"/>
</floater>

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Sky Preset" title="Editar cielo predefinido">
<string name="title_new">
Crear un nuevo cielo predefinido
</string>
<string name="title_edit">
Editar cielo predefinido
</string>
<string name="hint_new">
Asigna un nombre al valor predefinido, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
</string>
<string name="hint_edit">
Para editar el cielo predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
</string>
<string name="combo_label">
-Selecciona un valor predefinido-
</string>
<text name="hint">
Para editar el valor predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
</text>
<text name="label">
Nombre predefinido:
</text>
<text name="note">
Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
</text>
<tab_container name="WindLight Tabs">
<panel label="ATMÓSFERA" name="Atmosphere">
<text name="BHText">
Horizonte azul
</text>
<text name="BDensText">
Cantidad de bruma
</text>
<text name="BDensText2">
Saturación
</text>
<text name="HDText">
Densidad de la bruma
</text>
<text name="DensMultText">
Densidad
</text>
<text name="WLDistanceMultText">
Distancia
</text>
<text name="MaxAltText">
Altitud máx.
</text>
</panel>
<panel label="LUZ" name="Lighting">
<text name="SLCText">
Color del sol y de la luna
</text>
<text name="WLAmbientText">
Ambiental
</text>
<text name="SunGlowText">
Resplandor del sol
</text>
<slider label="Visión" name="WLGlowB"/>
<slider label="Tamaño" name="WLGlowR"/>
<text name="WLStarText">
Brillo de las estrellas
</text>
<text name="SceneGammaText">
Gamma de la escena
</text>
<text name="TODText">
Posición del sol y la luna
</text>
<multi_slider initial_value="0" name="WLSunPos"/>
<text name="WL12amHash">
|
</text>
<text name="WL6amHash">
|
</text>
<text name="WL12pmHash2">
|
</text>
<text name="WL6pmHash">
|
</text>
<text name="WL12amHash2">
|
</text>
<text name="WL12am">
12 AM
</text>
<text name="WL6am">
6 AM
</text>
<text name="WL12pmHash">
12 PM
</text>
<text name="WL6pm">
6 PM
</text>
<text name="WL12am2">
12 AM
</text>
<time name="WLDayTime" value="6:00 AM"/>
<text name="WLEastAngleText">
Ángulo de elevación
</text>
</panel>
<panel label="NUBES" name="Clouds">
<text name="WLCloudColorText">
Color de las nubes
</text>
<text name="WLCloudColorText2">
Posición/Densidad de las nubes
</text>
<slider label="X" name="WLCloudX"/>
<slider label="Y" name="WLCloudY"/>
<slider label="D" name="WLCloudDensity"/>
<text name="WLCloudCoverageText">
Nubosidad
</text>
<text name="WLCloudScaleText">
Altitud de las nubes
</text>
<text name="WLCloudDetailText">
Detalle de las nubes (Posición/Densidad)
</text>
<slider label="X" name="WLCloudDetailX"/>
<slider label="Y" name="WLCloudDetailY"/>
<slider label="D" name="WLCloudDetailDensity"/>
<text name="WLCloudScrollXText">
Velocidad de las nubes: X
</text>
<check_box label="Lock" name="WLCloudLockX"/>
<text name="WLCloudScrollYText">
Velocidad de las nubes: Y
</text>
<check_box label="Lock" name="WLCloudLockY"/>
</panel>
</tab_container>
<check_box label="Convertir este valor predefinido en mi nueva configuración de cielo" name="make_default_cb"/>
<button label="Guardar" name="save"/>
<button label="Cancelar" name="cancel"/>
</floater>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Water Preset" title="Editar el agua predefinida">
<string name="title_new">
Crear una nueva agua predefinida
</string>
<string name="title_edit">
Editar el agua predefinida
</string>
<string name="hint_new">
Asigna un nombre al valor predefinido, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
</string>
<string name="hint_edit">
Para editar el agua predefinida, ajusta los controles y selecciona &quot;Guardar&quot;.
</string>
<string name="combo_label">
-Selecciona un valor predefinido-
</string>
<text name="hint">
Para editar el valor predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
</text>
<text name="label">
Nombre predefinido:
</text>
<text name="note">
Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
</text>
<panel name="panel_water_preset">
<text name="water_color_label">
Color del agua
</text>
<text name="water_fog_density_label">
Transparencia
</text>
<text name="underwater_fog_modifier_label">
Modificar la claridad del agua
</text>
<text name="BHText">
Sentido de las olas grandes
</text>
<slider label="X" name="WaterWave1DirX"/>
<slider label="Y" name="WaterWave1DirY"/>
<text name="BDensText">
Tamaño de las ondulaciones
</text>
<text name="HDText">
Escala de Fresnel
</text>
<text name="FresnelOffsetText">
Coeficiente de reflexión
</text>
<text name="BHText2">
Sentido de las olas pequeñas
</text>
<slider label="X" name="WaterWave2DirX"/>
<slider label="Y" name="WaterWave2DirY"/>
<text name="DensMultText">
Refracción de la superficie
</text>
<text name="WaterScaleBelowText">
Refracción bajo la superficie
</text>
<text name="MaxAltText">
Desenfoque
</text>
<text name="BHText3">
Vista Normal
</text>
</panel>
<check_box label="Convertir este valor predefinido en mi nueva configuración de agua" name="make_default_cb"/>
<button label="Guardar" name="save"/>
<button label="Cancelar" name="cancel"/>
</floater>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Environment Editor Floater" title="CONFIGURACIÓN DE ENTORNO">
<text name="note">
Puedes personalizar la configuración del entorno de tu visor con las opciones siguientes.
</text>
<radio_group name="region_settings_radio_group">
<radio_item label="Usar configuración de región" name="use_region_settings"/>
<radio_item label="Personalizar mi entorno" name="use_my_settings"/>
</radio_group>
<panel name="user_environment_settings">
<text name="note">
Nota: La configuración personalizada no estará visible para otros usuarios.
</text>
<text name="water_settings_title">
Configuración de agua
</text>
<combo_box name="water_settings_preset_combo">
<combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
Cielo/Ciclo del día
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Cielo invariable" name="my_sky_settings"/>
<radio_item label="Ciclo del día" name="my_dayc_settings"/>
</radio_group>
<combo_box name="sky_settings_preset_combo">
<combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
</combo_box>
<combo_box name="dayc_settings_preset_combo">
<combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
</combo_box>
</panel>
<button label="OK" name="ok_btn"/>
<button label="Cancelar" name="cancel_btn"/>
</floater>

View File

@ -3,6 +3,9 @@
<string name="status_idle">
Inactivo
</string>
<string name="status_parse_error">
Problema de análisis de DAE - consulta los datos en el registro.
</string>
<string name="status_reading_file">
Cargando...
</string>
@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Error: El número de intersección es superior a 65534. Cancelado.
</string>
<string name="bad_element">
Error: el elemento no es válido
</string>
<string name="high">
Alto
</string>

View File

@ -193,6 +193,9 @@
<string name="status_idle">
Inactivo
</string>
<string name="status_parse_error">
Problema de análisis de DAE - consulta los datos en el registro.
</string>
<string name="status_reading_file">
Cargando...
</string>
@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Error: El número de intersección es superior a 65534. Cancelado.
</string>
<string name="bad_element">
Error: el elemento no es válido
</string>
<string name="high">
Alto
</string>

View File

@ -405,7 +405,7 @@
</combo_box>
<spinner label="Gravedad" name="Physics Gravity"/>
<spinner label="Fricción" name="Physics Friction"/>
<spinner label="Densidad" name="Physics Density"/>
<spinner label="Densidad en 100 kg/m^3" name="Physics Density"/>
<spinner label="Reemplazo" name="Physics Restitution"/>
</panel>
<panel label="Textura" name="Texture">

View File

@ -17,7 +17,7 @@
<menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
<menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
<menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
<menu_item_call label="Prueba de ventanas de contenidos web" name="Web Content Floater Test"/>
<menu_item_call label="Prueba de depuración de ventanas de contenido web" name="Web Content Floater Debug Test"/>
<menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/>
<menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/>
</menu>

View File

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
<toggleable_menu name="menu_group_plus">
<menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
<menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
<menu_item_check label="Ordenar según distancia" name="sort_distance"/>
<menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
<menu_item_check label="Ver mapa" name="view_map"/>
<menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
</menu>
</toggleable_menu>

View File

@ -31,6 +31,7 @@
<menu_item_call label="Mis grupos" name="My Groups"/>
<menu_item_check label="Chat" name="Nearby Chat"/>
<menu_item_call label="Gente cerca" name="Active Speakers"/>
<menu_item_check label="Chat de voz" name="Nearby Voice"/>
</menu>
<menu label="Mundo" name="World">
<menu_item_check label="Minimapa" name="Mini-Map"/>
@ -63,8 +64,24 @@
<menu_item_call label="Mediodía" name="Noon"/>
<menu_item_call label="Atardecer" name="Sunset"/>
<menu_item_call label="Medianoche" name="Midnight"/>
<menu_item_call label="Hora del Estado" name="Revert to Region Default"/>
<menu_item_call label="Editor del entorno" name="Environment Editor"/>
</menu>
<menu label="Editor de entorno" name="Enviroment Editor">
<menu_item_call label="Configuración de entorno..." name="Enviroment Settings"/>
<menu label="Agua predefinida" name="Water Presets">
<menu_item_call label="Nuevo predefinido..." name="new_water_preset"/>
<menu_item_call label="Editar predefinido..." name="edit_water_preset"/>
<menu_item_call label="Eliminar predefinido..." name="delete_water_preset"/>
</menu>
<menu label="Cielos predefinidos" name="Sky Presets">
<menu_item_call label="Nuevo predefinido..." name="new_sky_preset"/>
<menu_item_call label="Editar predefinido..." name="edit_sky_preset"/>
<menu_item_call label="Eliminar predefinido..." name="delete_sky_preset"/>
</menu>
<menu label="Días predefinidos" name="Day Presets">
<menu_item_call label="Nuevo predefinido..." name="new_day_preset"/>
<menu_item_call label="Editar predefinido..." name="edit_day_preset"/>
<menu_item_call label="Eliminar predefinido..." name="delete_day_preset"/>
</menu>
</menu>
</menu>
<menu label="Construir" name="BuildTools">

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Gear Wearing">
<toggleable_menu name="Gear Wearing">
<menu_item_call label="Editar el vestuario" name="edit"/>
<menu_item_call label="Quitarme" name="takeoff"/>
</menu>
<menu_item_call label="Copiar la lista del vestuario al portapapeles" name="copy"/>
</toggleable_menu>

View File

@ -1560,6 +1560,11 @@ Vuelve a intentarlo más tarde.
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="TooManyTeleportOffers">
Has intentado hacer [OFFERS] ofertas de teleporte,
excediendo el límite de [LIMIT].
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="OfferTeleportFromGod">
¿Obligar a este Residente a ir a tu localización?
<form name="form">
@ -1980,6 +1985,10 @@ Linden Lab
¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmClearCache">
¿Estás seguro de que quieres vaciar la caché del visor?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
¿Estás seguro de que quieres limpiar tus cookies?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
@ -2005,49 +2014,31 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
¿Quieres sobrescribir la preselección guardada?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="WLDeletePresetAlert">
¿Quieres borrar [SKY]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="WLNoEditDefault">
No puedes editar ni borrar una preselección por defecto.
</notification>
<notification name="WLMissingSky">
Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
</notification>
<notification name="WLRegionApplyFail">
No se pudo aplicar la configuración a la región. El problema podría solucionarse saliendo de la región y regresando a ella. La razón especificada fue: [FAIL_REASON]
</notification>
<notification name="EnvCannotDeleteLastDayCycleKey">
No se puede eliminar la última clave de este ciclo del día, ya que no puedes vaciar la caché del día. En lugar de intentar eliminar la última clave restante y después intentar crear una nueva, debes modificarla.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="DayCycleTooManyKeyframes">
No se pueden añadir más fotogramas clave a este ciclo del día. El número máximo de fotogramas clave para ciclos del día de alcance [SCOPE] es [MAX].
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="EnvUpdateRate">
La configuración de entorno de la región sólo puede actualizarse cada [WAIT] segundos. Espera por lo menos este tiempo y vuelve intentarlo.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="PPSaveEffectAlert">
Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="NewSkyPreset">
Dame un nombre para el cielo nuevo.
<form name="form">
<input name="message">
Preselección nueva
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="ExistsSkyPresetAlert">
¡Esa preselección ya existe!
</notification>
<notification name="NewWaterPreset">
Dame un nombre para la nueva preselección de agua.
<form name="form">
<input name="message">
Preselección nueva
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="ExistsWaterPresetAlert">
¡Esa preselección ya existe!
</notification>
<notification name="WaterNoEditDefault">
No puedes editar o borrar una preselección por defecto.
</notification>
<notification name="ChatterBoxSessionStartError">
No se puede empezar una nueva sesión de chat con [RECIPIENT].
[REASON]
@ -2337,6 +2328,9 @@ Aquí no puedes volar.
<notification name="NoBuild">
Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
</notification>
<notification name="SeeAvatars">
Esta parcela oculta los avatares y el chat de texto de otras parcelas. No podrás ver a los residentes que estén fuera la parcela ni ellos podrán verte a ti. El chat de texto regular del canal 0 también está bloqueado.
</notification>
<notification name="ScriptsStopped">
Un administrador ha detenido temporalmente los scripts en esta región.
</notification>
@ -2763,7 +2757,9 @@ Se mostrará cuando haya suficiente espacio.
Selecciona los residentes con quienes deseas compartir.
</notification>
<notification name="MeshUploadError">
No se ha cargado [ETIQUETA]: [MENSAJE] [IDENTIFICADOR] [IDENTIFICADOR_FALTA_VALIDEZ]
[LABEL] no se pudo subir: [MESSAGE] [IDENTIFIER]
Consulta los detalles en el archivo de registro.
</notification>
<notification name="ShareItemsConfirmation">
¿Estás seguro de que quieres compartir los elementos siguientes?

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
<accordion name="outfits_accordion">
<no_matched_tabs_text name="no_matched_outfits_msg" value="¿No encuentras lo que buscas? Inténtalo con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]."/>
<no_visible_tabs_text name="no_outfits_msg" value="Todavía no tienes vestuario. Inténtalo con [secondlife:///app/search/all/ Buscar]"/>
</accordion>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Ver más opciones"/>
<menu_button name="options_gear_btn" tool_tip="Ver más opciones"/>
<button name="trash_btn" tool_tip="Eliminar el vestuario seleccionado"/>
</panel>
</panel>

View File

@ -76,7 +76,7 @@
<button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
</layout_panel>
<layout_panel name="teleport_btn_lp">
<button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
<button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_ls1">

View File

@ -64,6 +64,8 @@
<text name="scripts_value" value="Sí"/>
<text name="damage_label" value="Daño:"/>
<text name="damage_value" value="No"/>
<text name="see_avatars_label" value="Ver los avatares:"/>
<text name="see_avatars_value" value="No"/>
<button label="Acerca del terreno" name="about_land_btn"/>
</panel>
</accordion_tab>

View File

@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
<text name="Cache:">
Caché:
</text>
<spinner label="Tamaño de la caché (64 - 9984 MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
<button label="Vaciar la caché" label_selected="Vaciar la caché" name="clear_cache"/>
<text name="Cache location">
Localización de la caché:
</text>
<button label="Elegir" label_selected="Elegir" name="set_cache"/>
<button label="Ubicación predeterminada" label_selected="Ubicación predeterminada" name="default_cache_location"/>
<text name="UI Size:">
Tamaño de la UI:
</text>

View File

@ -19,6 +19,7 @@
<check_box label="Activado" name="enable_voice_check"/>
<check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media" value="true"/>
<check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos" value="true"/>
<check_box label="Reproducir sonidos de los gestos" name="gesture_audio_play_btn" tool_tip="Selecciona esta opción para escuchar los sonidos de los gestos" value="verdadero"/>
<text name="voice_chat_settings">
Configuración del chat de voz
</text>
@ -35,28 +36,5 @@
<button label="Elegir la tecla" name="set_voice_hotkey_button"/>
<button name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/>
<button label="Dispositivos de entrada y salida" name="device_settings_btn" width="210"/>
<panel label="Configuración de dispositivos" name="device_settings_panel">
<panel.string name="default_text">
Por defecto
</panel.string>
<panel.string name="default system device">
Dispositivo del sistema por defecto
</panel.string>
<panel.string name="no device">
Ningún dispositivo
</panel.string>
<text name="Input">
Entrada
</text>
<text name="My volume label">
Mi volumen:
</text>
<slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/>
<text name="wait_text">
Por favor, espera
</text>
<text name="Output">
Salida
</text>
</panel>
<panel label="Configuración de dispositivos" name="device_settings_panel"/>
</panel>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Entorno" name="panel_env_info">
<text name="water_settings_title">
Selecciona la configuración de agua y cielo/ciclo del día que deseas que vean todos los visitantes de tu región. Más información
</text>
<radio_group name="region_settings_radio_group">
<radio_item label="Usar los valores predeterminados de Second Life" name="use_sl_default_settings"/>
<radio_item label="Usar la configuración siguiente" name="use_my_settings"/>
</radio_group>
<panel name="user_environment_settings">
<text name="water_settings_title">
Configuración de agua
</text>
<combo_box name="water_settings_preset_combo">
<combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
Cielo/Ciclo del día
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Cielo invariable" name="my_sky_settings"/>
<radio_item label="Ciclo del día" name="my_dayc_settings"/>
</radio_group>
<combo_box name="sky_settings_preset_combo">
<combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
</combo_box>
<combo_box name="dayc_settings_preset_combo">
<combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
</combo_box>
</panel>
<button label="Aplicar" name="apply_btn"/>
<button label="Cancelar" name="cancel_btn"/>
</panel>

View File

@ -7,21 +7,56 @@
desconocida
</text>
<spinner label="Nivel del agua" name="water_height_spin"/>
<button label="?" name="water_height_help"/>
<spinner label="Límite de elevación &#10;del terreno" name="terrain_raise_spin"/>
<button label="?" name="terrain_raise_help"/>
<spinner label="Límite de bajada del &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
<button label="?" name="terrain_lower_help"/>
<check_box label="Usar el Sol del estado" name="use_estate_sun_check"/>
<button label="?" name="use_estate_sun_help"/>
<check_box label="Fijar el Sol" name="fixed_sun_check"/>
<button label="?" name="fixed_sun_help"/>
<slider label="Fase" name="sun_hour_slider"/>
<spinner label="Límite de elevación
del terreno" name="terrain_raise_spin"/>
<spinner bottom_delta="-34" label="Límite de bajada del
terreno" name="terrain_lower_spin"/>
<text name="detail_texture_text">
Texturas del terreno (requiere archivos .tga de 512x512, 24 bits)
</text>
<text name="height_text_lbl">
1 (bajo)
</text>
<text name="height_text_lbl2">
2
</text>
<text name="height_text_lbl3">
3
</text>
<text name="height_text_lbl4">
4 (alto)
</text>
<text name="height_text_lbl5">
Intervalos de elevación de textura
</text>
<text name="height_text_lbl10">
Estos valores representan la gama de mezclas para las texturas anteriores.
</text>
<text name="height_text_lbl11">
El valor BAJA mide en metros la altura MÁXIMA de la textura n.º 1, y el valor ALTA es la altura MÍNIMA de la textura n.º 4.
</text>
<text name="height_text_lbl6">
Noroeste
</text>
<text name="height_text_lbl7">
Noreste
</text>
<spinner label="Bajo" name="height_start_spin_1"/>
<spinner label="Bajo" name="height_start_spin_3"/>
<spinner label="Alto" name="height_range_spin_1"/>
<spinner label="Alto" name="height_range_spin_3"/>
<text name="height_text_lbl8">
Suroeste
</text>
<text name="height_text_lbl9">
Sureste
</text>
<spinner label="Bajo" name="height_start_spin_0"/>
<spinner label="Bajo" name="height_start_spin_2"/>
<spinner label="Alto" name="height_range_spin_0"/>
<spinner label="Alto" name="height_range_spin_2"/>
<button label="Descargar el RAW del terreno..." name="download_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores" width="230"/>
<button label="Subir un RAW para el terreno..." name="upload_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores" width="230"/>
<button label="Predeterminar este terreno" name="bake_terrain_btn" tool_tip="Definir el terreno actual como punto medio para los límites de elevación/bajada" width="230"/>
<button label="Aplicar" name="apply_btn"/>
<button width="230" label="Descargar el RAW del terreno..." name="download_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores"/>
<button left="246" label="?" name="download_raw_help"/>
<button width="230" label="Subir un RAW para el terreno..." name="upload_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores"/>
<button left="246" label="?" name="upload_raw_help"/>
<button width="230" label="Predeterminar este terreno" name="bake_terrain_btn" tool_tip="Definir el terreno actual como punto medio para los límites de elevación/bajada"/>
<button left="246" label="?" name="bake_terrain_help"/>
</panel>

View File

@ -1,6 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cosas" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
<layout_stack name="inventory_layout_stack">
<layout_panel name="inbox_layout_panel">
<panel label="" name="marketplace_inbox">
<string name="InboxLabelWithArg">
Objetos recibidos ([NUM])
</string>
<string name="InboxLabelNoArg">
Objetos recibidos
</string>
<button label="Objetos recibidos" name="inbox_btn"/>
<text name="inbox_fresh_new_count">
[NUM] Nuevos
</text>
<panel tool_tip="Drag and drop items to your inventory to manage and use them">
<text name="inbox_inventory_placeholder">
Aquí se entregarán las compras realizadas en el mercado.
</text>
</panel>
</panel>
</layout_panel>
<layout_panel name="outbox_layout_panel">
<panel label="" name="marketplace_outbox">
<button label="Buzón de salida de comerciante" name="outbox_btn"/>
<button label="" name="outbox_sync_btn" tool_tip="Poner en el escaparate de Mi Mercado"/>
<panel tool_tip="Drag and drop items here to prepare them for sale on your storefront">
<text name="outbox_inventory_placeholder">
Configura tu cuenta de comerciante para utilizar esta función.
</text>
</panel>
</panel>
</layout_panel>
</layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">

View File

@ -1171,6 +1171,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InventoryNoTexture">
No tienes en tu inventario una copia de esta textura
</string>
<string name="InventoryInboxNoItems">
Aquí se entregarán los objetos comprados en el mercado.
</string>
<string name="InventoryOutboxNoItems">
Arrastra objetos aquí para preparar una lista del escaparate de tu mercado.
</string>
<string name="no_transfer" value="(no transferible)"/>
<string name="no_modify" value="(no modificable)"/>
<string name="no_copy" value="(no copiable)"/>
@ -1295,6 +1301,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InvFolder All">
Todas
</string>
<string name="no_attachments">
No tienes puestos anexos
</string>
<string name="Buy">
Comprar
</string>
@ -1630,6 +1639,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="IMTeen">
teen
</string>
<string name="Anyone">
cualquiera
</string>
<string name="RegionInfoError">
error
</string>
@ -1846,6 +1858,12 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="Public">
Público
</string>
<string name="LocalSettings">
Configuración local
</string>
<string name="RegionSettings">
Configuración de la región
</string>
<string name="ClassifiedClicksTxt">
Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
</string>
@ -3637,6 +3655,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Región General
</string>
<string name="LocationCtrlSeeAVsTooltip">
Los avatares están visibles y está permitido el chat fuera de esta parcela
</string>
<string name="UpdaterWindowTitle">
Actualizar [APP_NAME]
</string>

View File

@ -135,12 +135,12 @@
0
</text>
<button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
<button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
<button label="Infos sur les scripts" name="Scripts..." width="110"/>
<button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
<button label="Acheter un pass" label_selected="Acheter un pass..." left_delta="-127" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
<button label="Abandonner le terrain" label_selected="Abandonner le terrain..." name="Abandon Land..."/>
<button label="Récupérer le terrain" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
<button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
</panel>
<panel label="RÈGLEMENT" name="land_covenant_panel">
<panel.string name="can_resell">
@ -312,6 +312,9 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<panel.string name="push_restrict_region_text">
Pas de bousculades (les règles de la région priment)
</panel.string>
<panel.string name="see_avs_text">
Voir et chatter avec les résidents sur cette parcelle
</panel.string>
<text name="allow_label">
Autoriser les autres résidents à :
</text>
@ -374,6 +377,10 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Photo :
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
<text name="allow_label5">
Autoriser les résidents sur les autres parcelles à :
</text>
<check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux résidents présents sur d&apos;autres parcelles de voir et chatter avec les résidents présents sur cette parcelle et vous permettre de les voir et de chatter avec eux."/>
<text name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
@ -434,6 +441,11 @@ musique :
Son :
</text>
<check_box label="Limiter les gestes et sons d&apos;objet à cette parcelle" name="check sound local"/>
<text name="Avatar Sounds:">
Sons d&apos;avatar :
</text>
<check_box label="Tout le monde" name="all av sound check"/>
<check_box label="Groupe" name="group av sound check"/>
<text name="Voice settings:">
Voix :
</text>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<floater name="Delete Env Preset" title="SUPPRIMER PRÉRÉGLAGE ENV.">
<string name="title_water">
Supprimer un préréglage de l&apos;eau
</string>
<string name="title_sky">
Supprimer un préréglage du ciel
</string>
<string name="title_day_cycle">
Supprimer un cycle du jour
</string>
<string name="label_water">
Préréglage :
</string>
<string name="label_sky">
Préréglage :
</string>
<string name="label_day_cycle">
Cycle du jour :
</string>
<string name="msg_confirm_deletion">
Voulez-vous vraiment supprimer le préréglage sélectionné ?
</string>
<string name="msg_sky_is_referenced">
Impossible de supprimer un préréglage référencé dans un ou plusieurs cycles du jour.
</string>
<string name="combo_label">
-Effectuer une sélection-
</string>
<text name="label">
Préréglage :
</text>
<button label="Supprimer" name="delete"/>
<button label="Annuler" name="cancel"/>
</floater>

View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Day cycle" title="Modifier un cycle du jour">
<string name="title_new">
Créer un nouveau cycle du jour
</string>
<string name="title_edit">
Modifier un cycle du jour
</string>
<string name="hint_new">
Donnez un nom au cycle du jour, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
</string>
<string name="hint_edit">
Pour modifier le cycle du jour, ajustez les contrôles ci-dessous, puis cliquez sur Enregistrer.
</string>
<string name="combo_label">
-Effectuer une sélection-
</string>
<text name="label">
Nom du préréglage :
</text>
<text name="note">
Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
</text>
<text name="hint_item1">
- Cliquez sur un repère pour modifier le réglage du ciel et l&apos;heure associés.
</text>
<text name="hint_item2">
- Cliquez sur les repères et faites-les glisser afin de définir les heures de transition.
</text>
<text name="hint_item3">
- Déplacez le marqueur en forme de triangle pour afficher un aperçu du cycle du jour.
</text>
<panel name="day_cycle_slider_panel">
<multi_slider initial_value="0" name="WLTimeSlider"/>
<multi_slider initial_value="0" name="WLDayCycleKeys"/>
<button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/>
<button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/>
<text name="WL12am">
Min.
</text>
<text name="WL3am">
3h
</text>
<text name="WL6am">
6h
</text>
<text name="WL9amHash">
9h
</text>
<text name="WL12pmHash">
Midi
</text>
<text name="WL3pm">
15h
</text>
<text name="WL6pm">
18h
</text>
<text name="WL9pm">
21h
</text>
<text name="WL12am2">
Min.
</text>
<text name="WL12amHash">
|
</text>
<text name="WL3amHash">
I
</text>
<text name="WL6amHash">
|
</text>
<text name="WL9amHash2">
I
</text>
<text name="WL12pmHash2">
|
</text>
<text name="WL3pmHash">
I
</text>
<text name="WL6pmHash">
|
</text>
<text name="WL9pmHash">
I
</text>
<text name="WL12amHash2">
|
</text>
</panel>
<text name="WLCurKeyPresetText">
Réglage du ciel :
</text>
<combo_box label="Préréglage" name="WLSkyPresets"/>
<text name="WLCurKeyTimeText">
Heure :
</text>
<time name="time" value="6h"/>
<check_box label="Appliquer ce nouveau cycle du jour" name="make_default_cb"/>
<button label="Enregistrer" name="save"/>
<button label="Annuler" name="cancel"/>
</floater>

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Sky Preset" title="Modifier un préréglage du ciel">
<string name="title_new">
Créer un nouveau préréglage du ciel
</string>
<string name="title_edit">
Modifier un préréglage du ciel
</string>
<string name="hint_new">
Donnez un nom à votre préréglage, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
</string>
<string name="hint_edit">
Pour modifier le préréglage du ciel, ajustez les contrôles, puis cliquez sur Enregistrer.
</string>
<string name="combo_label">
-Effectuer une sélection-
</string>
<text name="hint">
Pour modifier le préréglage, ajustez les contrôles, puis cliquez sur Enregistrer.
</text>
<text name="label">
Nom du préréglage :
</text>
<text name="note">
Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
</text>
<tab_container name="WindLight Tabs">
<panel label="ATMOSPHÈRE" name="Atmosphere">
<text name="BHText">
Bleu de l&apos;horizon
</text>
<text name="BDensText">
Quantité de brume
</text>
<text name="BDensText2">
Densité du bleu
</text>
<text name="HDText">
Densité de la brume
</text>
<text name="DensMultText">
Multiplicateur de densité
</text>
<text name="WLDistanceMultText">
Multiplicateur de distance
</text>
<text name="MaxAltText">
Altitude maximum
</text>
</panel>
<panel label="LUMIÈRE" name="Lighting">
<text name="SLCText">
Couleur soleil/lune
</text>
<text name="WLAmbientText">
Éclairage ambiant
</text>
<text name="SunGlowText">
Rayonnement du soleil
</text>
<slider label="Netteté" name="WLGlowB"/>
<slider label="Taille" name="WLGlowR"/>
<text name="WLStarText">
Éclat des étoiles
</text>
<text name="SceneGammaText">
Gamma de la scène
</text>
<text name="TODText">
Position soleil/lune
</text>
<multi_slider initial_value="0" name="WLSunPos"/>
<text name="WL12amHash">
|
</text>
<text name="WL6amHash">
|
</text>
<text name="WL12pmHash2">
|
</text>
<text name="WL6pmHash">
|
</text>
<text name="WL12amHash2">
|
</text>
<text name="WL12am">
Min.
</text>
<text name="WL6am">
6h
</text>
<text name="WL12pmHash">
Midi
</text>
<text name="WL6pm">
18h
</text>
<text name="WL12am2">
Min.
</text>
<time name="WLDayTime" value="6h"/>
<text name="WLEastAngleText">
Angle du levant
</text>
</panel>
<panel label="NUAGES" name="Clouds">
<text name="WLCloudColorText">
Couleur des nuages
</text>
<text name="WLCloudColorText2">
Nuages - XY/Densité
</text>
<slider label="X" name="WLCloudX"/>
<slider label="Y" name="WLCloudY"/>
<slider label="D" name="WLCloudDensity"/>
<text name="WLCloudCoverageText">
Couverture nuageuse
</text>
<text name="WLCloudScaleText">
Altitude des nuages
</text>
<text name="WLCloudDetailText">
Détails des nuages - XY/Densité
</text>
<slider label="X" name="WLCloudDetailX"/>
<slider label="Y" name="WLCloudDetailY"/>
<slider label="D" name="WLCloudDetailDensity"/>
<text name="WLCloudScrollXText">
Direction et vitesse X
</text>
<check_box label="Verrouiller" name="WLCloudLockX"/>
<text name="WLCloudScrollYText">
Direction et vitesse Y
</text>
<check_box label="Verrouiller" name="WLCloudLockY"/>
</panel>
</tab_container>
<check_box label="Appliquer ce nouveau préréglage pour le ciel" name="make_default_cb"/>
<button label="Enregistrer" name="save"/>
<button label="Annuler" name="cancel"/>
</floater>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Water Preset" title="Modifier un préréglage de l&apos;eau">
<string name="title_new">
Créer un nouveau préréglage de l&apos;eau
</string>
<string name="title_edit">
Modifier un préréglage de l&apos;eau
</string>
<string name="hint_new">
Donnez un nom à votre préréglage, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
</string>
<string name="hint_edit">
Pour modifier le préréglage de l&apos;eau, ajustez les contrôles, puis cliquez sur Enregistrer.
</string>
<string name="combo_label">
-Effectuer une sélection-
</string>
<text name="hint">
Pour modifier le préréglage, ajustez les contrôles, puis cliquez sur Enregistrer.
</text>
<text name="label">
Nom du préréglage :
</text>
<text name="note">
Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
</text>
<panel name="panel_water_preset">
<text name="water_color_label">
Couleur du brouillard dans l&apos;eau
</text>
<text name="water_fog_density_label">
Densité du brouillard
</text>
<text name="underwater_fog_modifier_label">
Brouillard sous-marin
</text>
<text name="BHText">
Direction grande vague
</text>
<slider label="X" name="WaterWave1DirX"/>
<slider label="Y" name="WaterWave1DirY"/>
<text name="BDensText">
Échelle des vaguelettes
</text>
<text name="HDText">
Échelle Fresnel
</text>
<text name="FresnelOffsetText">
Décalage Fresnel
</text>
<text name="BHText2">
Direction petite vague
</text>
<slider label="X" name="WaterWave2DirX"/>
<slider label="Y" name="WaterWave2DirY"/>
<text name="DensMultText">
Réfraction au-dessus
</text>
<text name="WaterScaleBelowText">
Réfraction en dessous
</text>
<text name="MaxAltText">
Multiplicateur de flou
</text>
<text name="BHText3">
Normal Map
</text>
</panel>
<check_box label="Appliquer ce nouveau préréglage pour l&apos;eau" name="make_default_cb"/>
<button label="Enregistrer" name="save"/>
<button label="Annuler" name="cancel"/>
</floater>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Environment Editor Floater" title="PARAMÈTRES D&apos;ENVIRONNEMENT">
<text name="note">
Utilisez les options ci-dessous pour personnaliser l&apos;environnement de votre client.
</text>
<radio_group name="region_settings_radio_group">
<radio_item label="Utiliser les réglages de la région" name="use_region_settings"/>
<radio_item label="Personnaliser mon environnement" name="use_my_settings"/>
</radio_group>
<panel name="user_environment_settings">
<text name="note">
Remarque : les autres utilisateurs ne pourront pas voir votre configuration personnalisée.
</text>
<text name="water_settings_title">
Réglage de l&apos;eau
</text>
<combo_box name="water_settings_preset_combo">
<combo_box.item label="-Effectuer une sélection-" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
Ciel / Cycle du jour
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Ciel fixe" name="my_sky_settings"/>
<radio_item label="Cycle du jour" name="my_dayc_settings"/>
</radio_group>
<combo_box name="sky_settings_preset_combo">
<combo_box.item label="-Effectuer une sélection-" name="item0"/>
</combo_box>
<combo_box name="dayc_settings_preset_combo">
<combo_box.item label="-Effectuer une sélection-" name="item0"/>
</combo_box>
</panel>
<button label="OK" name="ok_btn"/>
<button label="Annuler" name="cancel_btn"/>
</floater>

View File

@ -3,6 +3,9 @@
<string name="status_idle">
Inactif
</string>
<string name="status_parse_error">
Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
</string>
<string name="status_reading_file">
Chargement...
</string>
@ -12,6 +15,9 @@
<string name="status_vertex_number_overflow">
Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
</string>
<string name="bad_element">
Erreur : élément non valide
</string>
<string name="high">
Élevé
</string>

View File

@ -193,6 +193,9 @@
<string name="status_idle">
Inactif
</string>
<string name="status_parse_error">
Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
</string>
<string name="status_reading_file">
Chargement...
</string>
@ -202,6 +205,9 @@
<string name="status_vertex_number_overflow">
Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
</string>
<string name="bad_element">
Erreur : élément non valide
</string>
<string name="high">
Élevé
</string>

View File

@ -405,7 +405,7 @@
</combo_box>
<spinner label="Gravité" name="Physics Gravity"/>
<spinner label="Friction" name="Physics Friction"/>
<spinner label="Densité" name="Physics Density"/>
<spinner label="Densité en 100 kg/m^3" name="Physics Density"/>
<spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Texture" name="Texture">

View File

@ -18,7 +18,7 @@
<menu_item_call label="Afficher les conditions d&apos;utilisation" name="TOS"/>
<menu_item_call label="Afficher le message critique" name="Critical"/>
<menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
<menu_item_call label="Test de la fenêtre flottante du contenu Web" name="Web Content Floater Test"/>
<menu_item_call label="Test de débogage de la fenêtre flottante du contenu Web" name="Web Content Floater Debug Test"/>
<menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/>
<menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/>
</menu>

View File

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
<toggleable_menu name="menu_group_plus">
<menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/>
<menu_item_check label="Trier par nom" name="sort_name"/>
<menu_item_check label="Trier par distance" name="sort_distance"/>
<menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
<menu_item_check label="Afficher la carte" name="view_map"/>
<menu_item_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/>
</menu>
</toggleable_menu>

View File

@ -31,6 +31,7 @@
<menu_item_call label="Mes groupes" name="My Groups"/>
<menu_item_check label="Chat près de moi" name="Nearby Chat"/>
<menu_item_call label="Personnes près de moi" name="Active Speakers"/>
<menu_item_check label="Chat vocal près de vous" name="Nearby Voice"/>
</menu>
<menu label="Monde" name="World">
<menu_item_check label="Mini-carte" name="Mini-Map"/>
@ -63,8 +64,24 @@
<menu_item_call label="Milieu de journée" name="Noon"/>
<menu_item_call label="Coucher de soleil" name="Sunset"/>
<menu_item_call label="Minuit" name="Midnight"/>
<menu_item_call label="Heure du domaine" name="Revert to Region Default"/>
<menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor"/>
</menu>
<menu label="Éditeur d&apos;environnement" name="Enviroment Editor">
<menu_item_call label="Paramètres d&apos;environnement..." name="Enviroment Settings"/>
<menu label="Préréglages de l&apos;eau" name="Water Presets">
<menu_item_call label="Nouveau préréglage..." name="new_water_preset"/>
<menu_item_call label="Modifier un préréglage..." name="edit_water_preset"/>
<menu_item_call label="Supprimer un préréglage..." name="delete_water_preset"/>
</menu>
<menu label="Préréglages du ciel" name="Sky Presets">
<menu_item_call label="Nouveau préréglage..." name="new_sky_preset"/>
<menu_item_call label="Modifier un préréglage..." name="edit_sky_preset"/>
<menu_item_call label="Supprimer un préréglage..." name="delete_sky_preset"/>
</menu>
<menu label="Préréglages du jour" name="Day Presets">
<menu_item_call label="Nouveau préréglage..." name="new_day_preset"/>
<menu_item_call label="Modifier un préréglage..." name="edit_day_preset"/>
<menu_item_call label="Supprimer un préréglage..." name="delete_day_preset"/>
</menu>
</menu>
</menu>
<menu label="Construire" name="BuildTools">

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Gear Wearing">
<toggleable_menu name="Gear Wearing">
<menu_item_call label="Modifier la tenue" name="edit"/>
<menu_item_call label="Enlever" name="takeoff"/>
</menu>
<menu_item_call label="Copier la liste de la tenue dans le presse-papiers" name="copy"/>
</toggleable_menu>

View File

@ -1550,6 +1550,11 @@ Veuillez réessayer ultérieurement.
<button name="Cancel" text="Annuler"/>
</form>
</notification>
<notification name="TooManyTeleportOffers">
Vous avez essayé d&apos;effectuer [OFFERS] offres de téléportation,
or ce nombre dépasse la limite autorisée fixée à [LIMIT].
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="OfferTeleportFromGod">
Exiger du résident qu&apos;il vienne vous rejoindre ?
<form name="form">
@ -1971,6 +1976,10 @@ Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
Êtes-vous certain de vouloir supprimer l&apos;historique de vos visites et recherches ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ConfirmClearCache">
Voulez-vous vraiment vider le cache de votre client ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Êtes-vous certain de vouloir supprimer vos cookies ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
@ -1996,49 +2005,31 @@ Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apo
Voulez-vous écraser l&apos;option précédemment enregistrée ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="WLDeletePresetAlert">
Voulez-vous supprimer [SKY] ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="WLNoEditDefault">
Vous ne pouvez pas modifier ou supprimer un préréglage par défaut.
</notification>
<notification name="WLMissingSky">
Une dossier semble manquer au Cycle du jour : [SKY].
</notification>
<notification name="WLRegionApplyFail">
Impossible d&apos;appliquer les réglages à la région. Le problème est parfois résolu en quittant la région puis en y revenant. Motif fourni : [FAIL_REASON]
</notification>
<notification name="EnvCannotDeleteLastDayCycleKey">
Impossible de supprimer la dernière clé de ce cycle du jour car ce dernier ne peut pas être vide. Modifiez la dernière clé restante au lieu d&apos;essayer de la supprimer puis d&apos;en créer une nouvelle.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="DayCycleTooManyKeyframes">
Impossible d&apos;ajouter plus d&apos;images-clés à ce cycle du jour. Un maximum de [MAX] images-clés peut être associé aux cycles du jour de type [SCOPE].
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="EnvUpdateRate">
Vous ne pouvez mettre à jour les paramètres d&apos;environnement d&apos;une région que toutes les [WAIT] secondes. Veuillez patienter pendant au moins ce délai avant de réessayer.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="PPSaveEffectAlert">
Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="NewSkyPreset">
Nommez le nouveau ciel.
<form name="form">
<input name="message">
Nouveau préréglage
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Annuler"/>
</form>
</notification>
<notification name="ExistsSkyPresetAlert">
Ce préréglage existe déjà !
</notification>
<notification name="NewWaterPreset">
Nommez ce nouveau préréglage d&apos;eau.
<form name="form">
<input name="message">
Nouveau préréglage
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Annuler"/>
</form>
</notification>
<notification name="ExistsWaterPresetAlert">
Ce préréglage existe déjà !
</notification>
<notification name="WaterNoEditDefault">
Vous ne pouvez pas modifier ou supprimer un préréglage par défaut.
</notification>
<notification name="ChatterBoxSessionStartError">
Impossible de démarrer une nouvelle session de chat avec [RECIPIENT].
[REASON]
@ -2329,6 +2320,9 @@ Vous ne pouvez pas voler ici.
<notification name="NoBuild">
La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d&apos;objets ici.
</notification>
<notification name="SeeAvatars">
Cette parcelle masque les avatars et le chat écrit des autres parcelles. Vous ne pouvez pas voir les résidents qui se trouvent en dehors, et ceux qui se trouvent en dehors ne peuvent pas vous voir. Le chat écrit habituel sur le canal 0 est également bloqué.
</notification>
<notification name="ScriptsStopped">
Un administrateur a temporairement stoppé les scripts dans cette région.
</notification>
@ -2756,7 +2750,9 @@ Le bouton sera affiché quand il y aura suffisamment de place.
Sélectionnez les résidents avec lesquels partager l&apos;élément.
</notification>
<notification name="MeshUploadError">
Échec de chargement de [LABEL] : [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
Échec de chargement de [LABEL] : [MESSAGE] [IDENTIFIER]
Voir le fichier journal pour plus de détails.
</notification>
<notification name="ShareItemsConfirmation">
Voulez-vous vraiment partager les articles suivants :

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
<accordion name="outfits_accordion">
<no_matched_tabs_text name="no_matched_outfits_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher]."/>
<no_visible_tabs_text name="no_outfits_msg" value="Aucune tenue n&apos;est actuellement en votre possession. Essayez [secondlife:///app/search/all Rechercher]."/>
</accordion>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
<menu_button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
<button name="trash_btn" tool_tip="Supprimer la tenue sélectionnée"/>
</panel>
</panel>

View File

@ -67,16 +67,16 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
<button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
</layout_panel>
<layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
<button label="IM" name="im_btn" tool_tip="Ouvrir une session IM."/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/>
<button label="Appel" name="call_btn" tool_tip="Appeler ce résident."/>
</layout_panel>
<layout_panel name="share_btn_lp">
<button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire"/>
<button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire."/>
</layout_panel>
<layout_panel name="teleport_btn_lp">
<button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/>
<button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation."/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_ls1">

View File

@ -68,6 +68,8 @@
<text name="scripts_value" value="Activé"/>
<text name="damage_label" value="Dégâts :"/>
<text name="damage_value" value="Désactivé"/>
<text name="see_avatars_label" value="Voir les avatars :"/>
<text name="see_avatars_value" value="Désactivé"/>
<button label="À propos du terrain" name="about_land_btn"/>
</panel>
</accordion_tab>

View File

@ -3,6 +3,19 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
<text name="Cache:">
Cache :
</text>
<spinner label="Taille du cache (64 - 9984 Mo)" name="cachesizespinner"/>
<text name="text_box5">
Mo
</text>
<button label="Vider le cache" label_selected="Vider le cache" name="clear_cache"/>
<text name="Cache location">
Emplacement du cache :
</text>
<button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
<button label="Par défaut" label_selected="Par défaut" name="default_cache_location"/>
<text name="UI Size:">
Taille d&apos;interface :
</text>

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