Merge branch 'master' into starlight
commit
3b92b326b8
|
|
@ -115,28 +115,28 @@ else (USESYSTEMLIBS)
|
|||
elseif (DARWIN)
|
||||
set(BOOST_CONTEXT_LIBRARY
|
||||
optimized boost_context-mt${addrsfx}
|
||||
debug boost_context-mt${addrsfx}-d)
|
||||
debug boost_context-mt${addrsfx})
|
||||
set(BOOST_FIBER_LIBRARY
|
||||
optimized boost_fiber-mt${addrsfx}
|
||||
debug boost_fiber-mt${addrsfx}-d)
|
||||
debug boost_fiber-mt${addrsfx})
|
||||
set(BOOST_FILESYSTEM_LIBRARY
|
||||
optimized boost_filesystem-mt${addrsfx}
|
||||
debug boost_filesystem-mt${addrsfx}-d)
|
||||
debug boost_filesystem-mt${addrsfx})
|
||||
set(BOOST_PROGRAM_OPTIONS_LIBRARY
|
||||
optimized boost_program_options-mt${addrsfx}
|
||||
debug boost_program_options-mt${addrsfx}-d)
|
||||
debug boost_program_options-mt${addrsfx})
|
||||
set(BOOST_REGEX_LIBRARY
|
||||
optimized boost_regex-mt${addrsfx}
|
||||
debug boost_regex-mt${addrsfx}-d)
|
||||
debug boost_regex-mt${addrsfx})
|
||||
set(BOOST_SIGNALS_LIBRARY
|
||||
optimized boost_signals-mt${addrsfx}
|
||||
debug boost_signals-mt${addrsfx}-d)
|
||||
debug boost_signals-mt${addrsfx})
|
||||
set(BOOST_SYSTEM_LIBRARY
|
||||
optimized boost_system-mt${addrsfx}
|
||||
debug boost_system-mt${addrsfx}-d)
|
||||
debug boost_system-mt${addrsfx})
|
||||
set(BOOST_THREAD_LIBRARY
|
||||
optimized boost_thread-mt${addrsfx}
|
||||
debug boost_thread-mt${addrsfx}-d)
|
||||
debug boost_thread-mt${addrsfx})
|
||||
set(BOOST_WAVE_LIBRARY
|
||||
optimized boost_wave-mt${addrsfx}
|
||||
debug boost_wave-mt${addrsfx}-gd)
|
||||
|
|
|
|||
|
|
@ -857,6 +857,7 @@ set(viewer_SOURCE_FILES
|
|||
llxmlrpctransaction.cpp
|
||||
noise.cpp
|
||||
particleeditor.cpp
|
||||
permissionstracker.cpp
|
||||
piemenu.cpp
|
||||
pieseparator.cpp
|
||||
pieslice.cpp
|
||||
|
|
@ -1630,6 +1631,7 @@ set(viewer_HEADER_FILES
|
|||
macmain.h
|
||||
noise.h
|
||||
particleeditor.h
|
||||
permissionstracker.h
|
||||
piemenu.h
|
||||
pieseparator.h
|
||||
pieslice.h
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.5.5
|
||||
6.5.6
|
||||
|
|
|
|||
|
|
@ -21918,6 +21918,30 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>CefVerboseLog</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable/disable CEF verbose loggingk</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ResetUIScaleOnFirstRun</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Resets the UI scale factor on first run due to changed display scaling behavior</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>360CaptureUseInterestListCap</key>
|
||||
<map>
|
||||
|
|
@ -21996,30 +22020,19 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>3</integer>
|
||||
</map>
|
||||
<key>CefVerboseLog</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable/disable CEF verbose loggingk</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ResetUIScaleOnFirstRun</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Resets the UI scale factor on first run due to changed display scaling behavior</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>MFAHash</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Override MFA state hash for authentication</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSShowServerVersionChangeNotice</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -3705,6 +3705,11 @@ bool LLAppViewer::initWindow()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLAppViewer::isUpdaterMissing()
|
||||
{
|
||||
return mUpdaterNotFound;
|
||||
}
|
||||
|
||||
void LLAppViewer::writeDebugInfo(bool isStatic)
|
||||
{
|
||||
#if LL_WINDOWS && LL_BUGSPLAT
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ public:
|
|||
bool quitRequested() { return mQuitRequested; }
|
||||
bool logoutRequestSent() { return mLogoutRequestSent; }
|
||||
bool isSecondInstance() { return mSecondInstance; }
|
||||
bool isUpdaterMissing() { return mUpdaterNotFound; }
|
||||
bool isUpdaterMissing(); // In use by tests
|
||||
|
||||
void writeDebugInfo(bool isStatic=true);
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
#include "llfollowcam.h"
|
||||
#include "llagent.h"
|
||||
|
||||
#include "permissionstracker.h"
|
||||
|
||||
//-------------------------------------------------------
|
||||
// constants
|
||||
//-------------------------------------------------------
|
||||
|
|
@ -829,11 +831,13 @@ void LLFollowCamMgr::setCameraActive( const LLUUID& source, bool active )
|
|||
if (found_it != mParamStack.end())
|
||||
{
|
||||
mParamStack.erase(found_it);
|
||||
PermissionsTracker::instance().removePermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
|
||||
}
|
||||
// put on top of stack
|
||||
if(active)
|
||||
{
|
||||
mParamStack.push_back(params);
|
||||
PermissionsTracker::instance().addPermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -843,6 +847,8 @@ void LLFollowCamMgr::removeFollowCamParams(const LLUUID& source)
|
|||
LLFollowCamParams* params = getParamsForID(source);
|
||||
mParamMap.erase(source);
|
||||
delete params;
|
||||
|
||||
PermissionsTracker::instance().removePermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
|
||||
}
|
||||
|
||||
bool LLFollowCamMgr::isScriptedCameraSource(const LLUUID& source)
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@
|
|||
#include "lltrans.h"
|
||||
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
#include <sstream>
|
||||
|
||||
const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login
|
||||
|
|
@ -239,8 +240,9 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
|
|||
request_params["id0"] = mSerialNumber;
|
||||
request_params["host_id"] = gSavedSettings.getString("HostID");
|
||||
request_params["extended_errors"] = true; // request message_id and message_args
|
||||
request_params["token"] = "";
|
||||
|
||||
// log request_params _before_ adding the credentials
|
||||
// log request_params _before_ adding the credentials or sensitive MFA hash data
|
||||
LL_DEBUGS("LLLogin") << "Login parameters: " << LLSDOStreamer<LLSDNotationFormatter>(request_params) << LL_ENDL;
|
||||
|
||||
// Copy the credentials into the request after logging the rest
|
||||
|
|
@ -253,6 +255,33 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
|
|||
request_params[it->first] = it->second;
|
||||
}
|
||||
|
||||
std::string mfa_hash = gSavedSettings.getString("MFAHash"); //non-persistent to enable testing
|
||||
std::string grid(LLGridManager::getInstance()->getGridId());
|
||||
std::string user_id = user_credential->userID();
|
||||
if (gSecAPIHandler)
|
||||
{
|
||||
if (mfa_hash.empty())
|
||||
{
|
||||
// normal execution, mfa_hash was not set from debug setting so load from protected store
|
||||
LLSD data_map = gSecAPIHandler->getProtectedData("mfa_hash", grid);
|
||||
if (data_map.isMap() && data_map.has(user_id))
|
||||
{
|
||||
mfa_hash = data_map[user_id].asString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// SL-16888 the mfa_hash is being overridden for testing so save it for consistency for future login requests
|
||||
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, mfa_hash);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "unable to access protected store for mfa_hash" << LL_ENDL;
|
||||
}
|
||||
|
||||
request_params["mfa_hash"] = mfa_hash;
|
||||
|
||||
// Specify desired timeout/retry options
|
||||
LLSD http_params;
|
||||
F32 srv_timeout = llclamp(gSavedSettings.getF32("LoginSRVTimeout"), LOGIN_SRV_TIMEOUT_MIN, LOGIN_SRV_TIMEOUT_MAX);
|
||||
|
|
@ -265,6 +294,11 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
|
|||
mRequestData["params"] = request_params;
|
||||
mRequestData["options"] = requested_options;
|
||||
mRequestData["http_params"] = http_params;
|
||||
//#if LL_RELEASE_FOR_DOWNLOAD
|
||||
// mRequestData["wait_for_updater"] = !gSavedSettings.getBOOL("CmdLineSkipUpdater") && !LLAppViewer::instance()->isUpdaterMissing();
|
||||
//#else
|
||||
mRequestData["wait_for_updater"] = false;
|
||||
//#endif
|
||||
}
|
||||
|
||||
bool LLLoginInstance::handleLoginEvent(const LLSD& event)
|
||||
|
|
@ -420,6 +454,38 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
|
|||
boost::bind(&LLLoginInstance::syncWithUpdater, this, resp, _1, _2));
|
||||
}
|
||||
}
|
||||
else if(reason_response == "mfa_challenge")
|
||||
{
|
||||
LL_DEBUGS("LLLogin") << " MFA challenge" << LL_ENDL;
|
||||
|
||||
if (gViewerWindow)
|
||||
{
|
||||
gViewerWindow->setShowProgress(FALSE, FALSE);
|
||||
}
|
||||
|
||||
LLSD args(llsd::map( "MESSAGE", LLTrans::getString(response["message_id"]) ));
|
||||
LLSD payload;
|
||||
LLNotificationsUtil::add("PromptMFAToken", args, payload, [=](LLSD const & notif, LLSD const & response) {
|
||||
bool continue_clicked = response["continue"].asBoolean();
|
||||
std::string token = response["token"].asString();
|
||||
LL_DEBUGS("LLLogin") << "PromptMFAToken: response: " << response << " continue_clicked" << continue_clicked << LL_ENDL;
|
||||
|
||||
// strip out whitespace - SL-17034/BUG-231938
|
||||
token = boost::regex_replace(token, boost::regex("\\s"), "");
|
||||
|
||||
if (continue_clicked && !token.empty())
|
||||
{
|
||||
LL_INFOS("LLLogin") << "PromptMFAToken: token submitted" << LL_ENDL;
|
||||
|
||||
// Set the request data to true and retry login.
|
||||
mRequestData["params"]["token"] = token;
|
||||
reconnect();
|
||||
} else {
|
||||
LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
|
||||
attemptComplete();
|
||||
}
|
||||
});
|
||||
}
|
||||
else if( reason_response == "key"
|
||||
|| reason_response == "presence"
|
||||
|| reason_response == "connect"
|
||||
|
|
|
|||
|
|
@ -485,6 +485,9 @@ public:
|
|||
const std::string& data_id,
|
||||
const std::string& map_elem)=0;
|
||||
|
||||
// ensure protected store's map is written to storage
|
||||
virtual void syncProtectedMap() = 0;
|
||||
|
||||
public:
|
||||
virtual LLPointer<LLCredential> createCredential(const std::string& grid,
|
||||
const LLSD& identifier,
|
||||
|
|
|
|||
|
|
@ -1621,6 +1621,11 @@ void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type,
|
|||
}
|
||||
}
|
||||
|
||||
void LLSecAPIBasicHandler::syncProtectedMap()
|
||||
{
|
||||
// TODO - consider unifing these functions
|
||||
_writeProtectedData();
|
||||
}
|
||||
//
|
||||
// Create a credential object from an identifier and authenticator. credentials are
|
||||
// per credential name (was: grid).
|
||||
|
|
|
|||
|
|
@ -278,6 +278,9 @@ public:
|
|||
const std::string& data_id,
|
||||
const std::string& map_elem);
|
||||
|
||||
// ensure protected store's map is written to storage
|
||||
virtual void syncProtectedMap();
|
||||
|
||||
// credential management routines
|
||||
|
||||
virtual LLPointer<LLCredential> createCredential(const std::string& credName,
|
||||
|
|
|
|||
|
|
@ -141,6 +141,7 @@
|
|||
#include "llproxy.h"
|
||||
#include "llproductinforequest.h"
|
||||
#include "llqueryflags.h"
|
||||
#include "llsecapi.h"
|
||||
#include "llselectmgr.h"
|
||||
#include "llsky.h"
|
||||
#include "llstatview.h"
|
||||
|
|
@ -1732,10 +1733,10 @@ bool idle_startup()
|
|||
}
|
||||
else
|
||||
{
|
||||
if (reason_response != "tos")
|
||||
if (reason_response != "tos" && reason_response != "mfa_challenge")
|
||||
{
|
||||
// Don't pop up a notification in the TOS case because
|
||||
// LLFloaterTOS::onCancel() already scolded the user.
|
||||
// Don't pop up a notification in the TOS or MFA cases because
|
||||
// the specialized floater has already scolded the user.
|
||||
std::string error_code;
|
||||
if(response.has("errorcode"))
|
||||
{
|
||||
|
|
@ -3247,8 +3248,31 @@ void show_release_notes_if_required()
|
|||
&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
|
||||
&& !gSavedSettings.getBOOL("FirstLoginThisInstall"))
|
||||
{
|
||||
LLSD info(LLAppViewer::instance()->getViewerInfo());
|
||||
LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
|
||||
|
||||
#if LL_RELEASE_FOR_DOWNLOAD
|
||||
if (!gSavedSettings.getBOOL("CmdLineSkipUpdater")
|
||||
&& !LLAppViewer::instance()->isUpdaterMissing())
|
||||
{
|
||||
// Instantiate a "relnotes" listener which assumes any arriving event
|
||||
// is the release notes URL string. Since "relnotes" is an
|
||||
// LLEventMailDrop, this listener will be invoked whether or not the
|
||||
// URL has already been posted. If so, it will fire immediately;
|
||||
// otherwise it will fire whenever the URL is (later) posted. Either
|
||||
// way, it will display the release notes as soon as the URL becomes
|
||||
// available.
|
||||
LLEventPumps::instance().obtain("relnotes").listen(
|
||||
"showrelnotes",
|
||||
[](const LLSD& url) {
|
||||
LLWeb::loadURLInternal(url.asString());
|
||||
return false;
|
||||
});
|
||||
}
|
||||
else
|
||||
#endif // LL_RELEASE_FOR_DOWNLOAD
|
||||
{
|
||||
LLSD info(LLAppViewer::instance()->getViewerInfo());
|
||||
LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
|
||||
}
|
||||
release_notes_shown = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -4703,6 +4727,17 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
|
|||
LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token);
|
||||
}
|
||||
|
||||
|
||||
// Only save mfa_hash for future logins if the user wants their info remembered.
|
||||
if(response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && gSavedSettings.getBOOL("RememberPassword"))
|
||||
{
|
||||
std::string grid(LLGridManager::getInstance()->getGridId());
|
||||
std::string user_id(gUserCredential->userID());
|
||||
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]);
|
||||
// TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
|
||||
gSecAPIHandler->syncProtectedMap();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> OpenSim legacy economy support
|
||||
#ifdef OPENSIM
|
||||
if (!LLGridManager::instance().isInSecondLife())
|
||||
|
|
|
|||
|
|
@ -166,6 +166,7 @@
|
|||
#include "lltexturecache.h"
|
||||
#include "llvovolume.h"
|
||||
#include "particleeditor.h"
|
||||
#include "permissionstracker.h"
|
||||
|
||||
using namespace LLAvatarAppearanceDefines;
|
||||
|
||||
|
|
@ -5424,6 +5425,9 @@ void handle_reset_camera_angles()
|
|||
// Camera focus and offset with CTRL/SHIFT + Scroll wheel
|
||||
gSavedSettings.getControl("FocusOffsetRearView")->resetToDefault();
|
||||
gSavedSettings.getControl("CameraOffsetRearView")->resetToDefault();
|
||||
|
||||
// warn the user if there is a scripted followcam active that might stop a camera reset
|
||||
PermissionsTracker::instance().warnFollowcam();
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
||||
|
|
|
|||
|
|
@ -150,6 +150,7 @@
|
|||
#include "llfloaterbump.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfriendcard.h"
|
||||
#include "permissionstracker.h" // <FS:Zi> Permissions Tracker
|
||||
#include "tea.h" // <FS:AW opensim currency support>
|
||||
#include "NACLantispam.h"
|
||||
#include "chatbar_as_cmdline.h"
|
||||
|
|
@ -4733,6 +4734,8 @@ void process_object_properties(LLMessageSystem *msg, void**user_data)
|
|||
{
|
||||
explorer->requestNameCallback(msg);
|
||||
}
|
||||
|
||||
PermissionsTracker::instance().objectPropertiesCallback(msg);
|
||||
}
|
||||
// </FS:Techwolf Lupindo> area search
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,274 @@
|
|||
/**
|
||||
* @file permissionstracker.cpp
|
||||
* @brief Permissions Tracker implementation - Initially it's only tracking
|
||||
* camera control permissions, to warn users about attachments or seats that
|
||||
* took camera control permissions and might interfere with resetting the
|
||||
* camera view.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
* Copyright (C) 2022, Zi Ree @ Second Life
|
||||
*
|
||||
* 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 "llagentdata.h" // for gAgentID anf gAgentSessionID
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llslurl.h"
|
||||
#include "lltrans.h"
|
||||
#include "llviewermenu.h" // for handle_object_edit()
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerobjectlist.h" // for gObjectList
|
||||
#include "llvoavatarself.h" // for gAgentAvatarp
|
||||
#include "llworld.h"
|
||||
|
||||
#include "permissionstracker.h"
|
||||
|
||||
#define PERMISSION_ENTRY_EXPIRY_TIME 3600.0
|
||||
|
||||
PermissionsTracker::PermissionsTracker()
|
||||
: LLSingleton<PermissionsTracker>()
|
||||
{
|
||||
}
|
||||
|
||||
PermissionsTracker::~PermissionsTracker()
|
||||
{
|
||||
}
|
||||
|
||||
void PermissionsTracker::addPermissionsEntry(const LLUUID& source_id, PermissionsTracker::PERM_TYPE permission_type)
|
||||
{
|
||||
// find out if this is a new entry in the list
|
||||
if (mPermissionsList.find(source_id) == mPermissionsList.end())
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "Creating list entry for source " << source_id << LL_ENDL;
|
||||
mPermissionsList[source_id].objectName = LLTrans::getString("LoadingData");
|
||||
|
||||
// find out if the object is still in reach
|
||||
LLViewerObject* vo = gObjectList.findObject(source_id);
|
||||
if (!vo)
|
||||
{
|
||||
mPermissionsList[source_id].objectName = LLTrans::getString("ObjectOutOfRange");
|
||||
}
|
||||
else
|
||||
{
|
||||
mPermissionsList[source_id].attachmentID = vo->getAttachmentItemID();
|
||||
LL_DEBUGS("PermissionsTracker") << "Requesting ObjectProperties for source " << source_id << LL_ENDL;
|
||||
|
||||
// remember which object names we already requested
|
||||
mRequestedIDs.push_back(source_id);
|
||||
|
||||
// send a request out to get this object's details
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
msg->newMessageFast(_PREHASH_ObjectSelect);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
msg->nextBlockFast(_PREHASH_ObjectData);
|
||||
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
|
||||
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
|
||||
|
||||
msg->newMessageFast(_PREHASH_ObjectDeselect);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
msg->nextBlockFast(_PREHASH_ObjectData);
|
||||
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
|
||||
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
|
||||
}
|
||||
}
|
||||
|
||||
LL_DEBUGS("PermissionsTracker") << "Adding permission type " << permission_type << " to source " << source_id << LL_ENDL;
|
||||
mPermissionsList[source_id].type |= permission_type;
|
||||
mPermissionsList[source_id].time = LLDate(LLTimer::getTotalSeconds());
|
||||
|
||||
purgePermissionsEntries();
|
||||
}
|
||||
|
||||
void PermissionsTracker::removePermissionsEntry(const LLUUID& source_id, PermissionsTracker::PERM_TYPE permission_type)
|
||||
{
|
||||
if (mPermissionsList.find(source_id) == mPermissionsList.end())
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "Could not find list entry for source " << source_id << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
LL_DEBUGS("PermissionsTracker") << "Removing permissions type " << permission_type << " from source " << source_id << LL_ENDL;
|
||||
mPermissionsList[source_id].type &= ~permission_type;
|
||||
mPermissionsList[source_id].time = LLDate(LLTimer::getTotalSeconds());
|
||||
|
||||
purgePermissionsEntries();
|
||||
}
|
||||
|
||||
void PermissionsTracker::purgePermissionsEntries()
|
||||
{
|
||||
F64 expiry_time = LLDate(LLTimer::getTotalSeconds()).secondsSinceEpoch() - PERMISSION_ENTRY_EXPIRY_TIME;
|
||||
|
||||
auto it = mPermissionsList.begin();
|
||||
while (it != mPermissionsList.end())
|
||||
{
|
||||
if (it->second.type == PERM_TYPE::PERM_NONE && it->second.time.secondsSinceEpoch() < expiry_time)
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "Erasing list entry for source " << it->first << LL_ENDL;
|
||||
it = mPermissionsList.erase(it);
|
||||
}
|
||||
else
|
||||
{
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PermissionsTracker::warnFollowcam()
|
||||
{
|
||||
std::string followcamList;
|
||||
for (auto entry : mPermissionsList)
|
||||
{
|
||||
if (entry.second.type & PermissionsTracker::PERM_FOLLOWCAM)
|
||||
{
|
||||
if (entry.second.attachmentID.notNull())
|
||||
{
|
||||
std::string attachment_point = "???";
|
||||
gAgentAvatarp->getAttachedPointName(entry.second.attachmentID, attachment_point);
|
||||
|
||||
LLSD args;
|
||||
args["ATTACHMENT_POINT"] = attachment_point;
|
||||
|
||||
std::string verb = "select?name=" + LLURI::escape(entry.second.objectName);
|
||||
followcamList += LLSLURL("inventory", entry.second.attachmentID, verb.c_str()).getSLURLString() + " " +
|
||||
LLTrans::getString("WornOnAttachmentPoint", args) + "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
followcamList += LLSLURL("objectim", entry.first, "").getSLURLString() +
|
||||
"?name=" + LLURI::escape(entry.second.objectName) +
|
||||
"&owner=" + entry.second.ownerID.asString();
|
||||
|
||||
LLSD args;
|
||||
std::string slurl = args["slurl"].asString();
|
||||
if (slurl.empty())
|
||||
{
|
||||
LLViewerRegion* region = LLWorld::instance().getRegionFromPosAgent(gAgentAvatarp->getPositionAgent());
|
||||
if(region)
|
||||
{
|
||||
LLSLURL region_slurl(region->getName(), gAgentAvatarp->getPositionAgent());
|
||||
slurl = region_slurl.getLocationString();
|
||||
}
|
||||
}
|
||||
|
||||
followcamList += "&slurl=" + LLURI::escape(slurl) + "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (followcamList.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLSD args;
|
||||
args["SOURCES"] = followcamList;
|
||||
LLNotificationsUtil::add("WarnScriptedCamera", args);
|
||||
}
|
||||
|
||||
void PermissionsTracker::objectPropertiesCallback(LLMessageSystem* msg)
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "Received ObjectProperties message." << LL_ENDL;
|
||||
|
||||
// if we weren't looking for any IDs, ignore this callback
|
||||
if (mRequestedIDs.empty())
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "No objects in request list." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
// we might have received more than one answer in one block
|
||||
S32 num = msg->getNumberOfBlocksFast(_PREHASH_ObjectData);
|
||||
for (S32 index = 0; index < num; ++index)
|
||||
{
|
||||
LLUUID source_id;
|
||||
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, source_id, index);
|
||||
|
||||
auto iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), source_id);
|
||||
// if this is one of the objects we were looking for, process the data
|
||||
if (iter != mRequestedIDs.end())
|
||||
{
|
||||
// get the name of the object
|
||||
std::string object_name;
|
||||
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, object_name, index);
|
||||
|
||||
LLUUID object_owner;
|
||||
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, object_owner, index);
|
||||
|
||||
LL_DEBUGS("PermissionsTracker") << "Received object name " << object_name
|
||||
<< " and owner " << object_owner.asString() << " for source " << source_id << LL_ENDL;
|
||||
|
||||
// remove the object from the lookup list and add it to the known names list
|
||||
mRequestedIDs.erase(iter);
|
||||
|
||||
mPermissionsList[source_id].objectName = object_name;
|
||||
mPermissionsList[source_id].ownerID = object_owner;
|
||||
|
||||
LLAvatarName avatar_name;
|
||||
if (LLAvatarNameCache::get(object_owner, &avatar_name))
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "Found cached entry for owner " << object_owner.asString()
|
||||
<< ": " << avatar_name.getCompleteName() << LL_ENDL;
|
||||
mPermissionsList[source_id].ownerName = avatar_name.getCompleteName();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mAvatarNameCacheConnections.find(object_owner) != mAvatarNameCacheConnections.end())
|
||||
{
|
||||
boost::signals2::connection cb_connection = LLAvatarNameCache::get(object_owner, boost::bind(&PermissionsTracker::avatarNameCallback, this, _1, _2));
|
||||
mAvatarNameCacheConnections.insert(std::make_pair(object_owner, cb_connection));
|
||||
|
||||
LL_DEBUGS("PermissionsTracker") << "Requesting avatar name for owner " << object_owner.asString() << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PermissionsTracker::avatarNameCallback(const LLUUID& avatar_id, const LLAvatarName& avatar_name)
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "Received avatar name " << avatar_name.getCompleteName() << LL_ENDL;
|
||||
|
||||
auto iter = mAvatarNameCacheConnections.find(avatar_id);
|
||||
if (iter != mAvatarNameCacheConnections.end())
|
||||
{
|
||||
if (iter->second.connected())
|
||||
{
|
||||
iter->second.disconnect();
|
||||
}
|
||||
mAvatarNameCacheConnections.erase(iter);
|
||||
}
|
||||
|
||||
for (auto entry : mPermissionsList)
|
||||
{
|
||||
if (entry.second.ownerID == avatar_id)
|
||||
{
|
||||
LL_DEBUGS("PermissionsTracker") << "Saved avatar name " << avatar_name.getCompleteName()<< " for source " << entry.first.asString() << LL_ENDL;
|
||||
entry.second.ownerName = avatar_name.getCompleteName();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
/**
|
||||
* @file permissionstracker.h
|
||||
* @brief Permissions Tracker declaration
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
* Copyright (C) 2022, Zi Ree @ Second Life
|
||||
*
|
||||
* 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 PERMISSIONSTRACKER_H
|
||||
#define PERMISSIONSTRACKER_H
|
||||
|
||||
#include "llfloater.h"
|
||||
#include "llsingleton.h"
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// PermissionsTracker: holds a list of requested script permissions to be
|
||||
// referred to e.g. when trying to reset the camera view and a script is
|
||||
// holding a follow cam which micht prevent it from working.
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
class PermissionsTracker
|
||||
: public LLSingleton<PermissionsTracker>
|
||||
{
|
||||
LLSINGLETON(PermissionsTracker);
|
||||
~PermissionsTracker();
|
||||
|
||||
public:
|
||||
enum PERM_TYPE
|
||||
{
|
||||
PERM_NONE = 0,
|
||||
PERM_FOLLOWCAM = 1,
|
||||
};
|
||||
|
||||
struct PermissionsEntry
|
||||
{
|
||||
LLUUID ownerID; // agent who owns the requesting object
|
||||
LLUUID attachmentID; // attachment ID in inventory for attached objects
|
||||
std::string ownerName;
|
||||
std::string objectName;
|
||||
LLDate time; // time when the permission was granted
|
||||
U32 type; // what kind of permissions were granted
|
||||
};
|
||||
|
||||
std::map<LLUUID, PermissionsEntry> mPermissionsList; // UUID of the requesting object
|
||||
|
||||
void addPermissionsEntry(
|
||||
const LLUUID& source_id,
|
||||
PermissionsTracker::PERM_TYPE permission_type); // called in llviewermessage.cpp
|
||||
|
||||
void removePermissionsEntry(
|
||||
const LLUUID& source_id,
|
||||
PermissionsTracker::PERM_TYPE permission_type); // called in llviewermessage.cpp
|
||||
|
||||
void purgePermissionsEntries();
|
||||
|
||||
void objectPropertiesCallback(LLMessageSystem* msg);
|
||||
void avatarNameCallback(const LLUUID& avatar_id, const LLAvatarName& av_name);
|
||||
|
||||
void warnFollowcam(); // Warn the user if a script is holding followcam parameters
|
||||
|
||||
std::vector<LLUUID> mRequestedIDs; // list of object IDs we requested named for
|
||||
|
||||
typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;
|
||||
avatar_name_cache_connection_map_t mAvatarNameCacheConnections;
|
||||
};
|
||||
|
||||
#endif // PERMISSIONSTRACKER_H
|
||||
|
|
@ -4839,8 +4839,15 @@ Bitte kopieren Sie diese in Ihr Inventar und versuchen Sie es erneut.
|
|||
Test-Ergebnis für gip-Level 6 Datei-Komprimierung für [FILE] mit Größe [SIZE] KB:
|
||||
Packen: [PACK_TIME]s [PSIZE]KB
|
||||
Entpacken: [UNPACK_TIME]s [USIZE]KB
|
||||
<tag>fail</tag>
|
||||
</notification>
|
||||
<tag>fail</tag>
|
||||
</notification>
|
||||
<notification label="Eingabe MFA-Token" name="PromptMFAToken">
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="continue" text="Fortsetzen"/>
|
||||
<button name="cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="NoValidEnvSettingFound">
|
||||
Keine gültige Einstellung für die Umgebung ausgewählt.
|
||||
|
||||
|
|
@ -5544,4 +5551,9 @@ Falls Sie diesen Nutzungsbestimmungen nicht zustimmen, sollten keinerlei finanzi
|
|||
URL auf Standard zurücksetzen?
|
||||
<usetemplate name="okcancelbuttons" notext="Nächstes Mal erinnern" yestext="Zurücksetzen"/>
|
||||
</notification>
|
||||
<notification name="WarnScriptedCamera">
|
||||
Zurücksetzen der Kamera könnte durch folgende Objekte verhindert werden:
|
||||
|
||||
[SOURCES]
|
||||
</notification>
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -249,6 +249,7 @@ http://secondlife.com/viewer-access-faq
|
|||
Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
|
||||
* Benutzername (wie robertschmidt12 oder warme.sonne)
|
||||
* Kennwort
|
||||
* Zwei-Faktor-Token (falls aktiviert)
|
||||
Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
|
||||
</string>
|
||||
<string name="LoginFailedPasswordChanged">
|
||||
|
|
@ -358,6 +359,10 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
|
|||
<string name="LoginFailedLoggingOutSession">
|
||||
Das System hat begonnen, Ihre letzte Sitzung abzumelden.
|
||||
Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
|
||||
</string>
|
||||
<string name="LoginFailedAuthenticationMFARequired">
|
||||
Um die Anmeldung fortzusetzen, geben Sie bitte ein neues Token aus Ihrer Multifaktor-Authentifizierungs-App ein.
|
||||
Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
|
||||
</string>
|
||||
<string name="AgentLostConnection">
|
||||
In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
|
||||
|
|
|
|||
|
|
@ -13728,6 +13728,27 @@ Unpacking: [UNPACK_TIME]s [USIZE]KB
|
|||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
label="Prompt for MFA Token"
|
||||
name="PromptMFAToken"
|
||||
type="alertmodal">
|
||||
[MESSAGE]
|
||||
<tag>confirm</tag>
|
||||
<form name="form">
|
||||
<input name="token" type="text" width="400" />
|
||||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="continue"
|
||||
text="Continue"/>
|
||||
<button
|
||||
index="1"
|
||||
name="cancel"
|
||||
text="Cancel"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notify.tga"
|
||||
name="NoValidEnvSettingFound"
|
||||
|
|
@ -13790,4 +13811,14 @@ Reset the URL to default?
|
|||
notext="Remind me next time"
|
||||
yestext="Reset"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="WarnScriptedCamera"
|
||||
type="notifytip">
|
||||
Camera reset might be inhibited by the following objects:
|
||||
|
||||
[SOURCES]
|
||||
</notification>
|
||||
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -159,6 +159,7 @@ http://secondlife.com/viewer-access-faq</string>
|
|||
Please check to make sure you entered the right
|
||||
* Username (like bobsmith12 or steller.sunshine)
|
||||
* Password
|
||||
* Second Factor Token (if enabled)
|
||||
Also, please make sure your Caps Lock key is off.</string>
|
||||
<string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
|
||||
Please go to your account page at http://secondlife.com/password
|
||||
|
|
@ -218,7 +219,8 @@ Please try logging in again in a minute.</string>
|
|||
Please try logging in again in a minute.</string>
|
||||
<string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
|
||||
Please try logging in again in a minute.</string>
|
||||
|
||||
<string name="LoginFailedAuthenticationMFARequired">To continue logging in, enter a new token from your multifactor authentication app.
|
||||
If you feel this is an error, please contact support@secondlife.com</string>
|
||||
|
||||
<!-- Disconnection -->
|
||||
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
|
||||
|
|
|
|||
|
|
@ -1,406 +1,368 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="Model Preview" title="CHARGEMENT DU MODELE">
|
||||
<string name="status_idle"/>
|
||||
<string name="status_parse_error">
|
||||
Erreur : Problème d'analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
|
||||
</string>
|
||||
<string name="status_bind_shape_orientation">
|
||||
Avertissement : la matrice de formes de reliure n'est pas dans l'orientation standard X-avant.
|
||||
</string>
|
||||
<string name="status_material_mismatch">
|
||||
Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.
|
||||
</string>
|
||||
<string name="status_reading_file">
|
||||
Chargement...
|
||||
</string>
|
||||
<string name="status_generating_meshes">
|
||||
Génération des maillages...
|
||||
</string>
|
||||
<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>
|
||||
<string name="medium">
|
||||
Moyen
|
||||
</string>
|
||||
<string name="low">
|
||||
Faible
|
||||
</string>
|
||||
<string name="lowest">
|
||||
Le plus faible
|
||||
</string>
|
||||
<string name="mesh_status_good">
|
||||
Bon à publier !
|
||||
</string>
|
||||
<string name="mesh_status_na">
|
||||
N/A
|
||||
</string>
|
||||
<string name="mesh_status_none">
|
||||
Aucun
|
||||
</string>
|
||||
<string name="mesh_status_submesh_mismatch">
|
||||
Un nombre différent de faces d'application de texture est associé aux niveaux de détail.
|
||||
</string>
|
||||
<string name="mesh_status_mesh_mismatch">
|
||||
Un nombre différent d'instances de maillage est associé aux niveaux de détail.
|
||||
</string>
|
||||
<string name="mesh_status_too_many_vertices">
|
||||
Trop de sommets pour le niveau de détail.
|
||||
</string>
|
||||
<string name="mesh_status_missing_lod">
|
||||
Niveau de détail requis manquant.
|
||||
</string>
|
||||
<string name="mesh_status_invalid_material_list">
|
||||
Les options du niveau de détail ne sont pas une sous-ensemble d'un modèle de référence.
|
||||
</string>
|
||||
<string name="phys_status_vertex_limit_exceeded">
|
||||
Certaines enveloppes physiques dépassent les limites de sommets.
|
||||
</string>
|
||||
<string name="layer_all">
|
||||
Tout
|
||||
</string>
|
||||
<string name="decomposing">
|
||||
Analyse...
|
||||
</string>
|
||||
<string name="simplifying">
|
||||
Simplification...
|
||||
</string>
|
||||
<string name="tbd">
|
||||
TBD
|
||||
</string>
|
||||
<panel name="left_panel">
|
||||
<panel name="model_name_representation_panel">
|
||||
<text name="name_label">
|
||||
Nom du modèle :
|
||||
</text>
|
||||
<text name="model_category_label">
|
||||
Ce modèle représente...
|
||||
</text>
|
||||
<combo_box name="model_category_combo">
|
||||
<combo_item label="Choisir une option..." name="Choose one"/>
|
||||
<combo_item label="Silhouette de l'avatar" name="Avatar shape"/>
|
||||
<combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
|
||||
<combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
|
||||
<combo_item label="Éléments pour la construction" name="Building Component"/>
|
||||
<combo_item label="Important, immobile etc." name="Large, non moving etc"/>
|
||||
<combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
|
||||
<combo_item label="Aucun" name="Not really any of these"/>
|
||||
<string name="no_havok">téléchargement du maillage avec physique</string>
|
||||
<string name="status_parse_error">Erreur : Problème d'analyse de fichier .dae ; reportez-vous au journal pour plus de détails.</string>
|
||||
<string name="status_bind_shape_orientation">Avertissement : la matrice de formes de reliure n'est pas dans l'orientation standard X-avant.</string>
|
||||
<string name="status_material_mismatch">Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.</string>
|
||||
<string name="status_lod_model_mismatch">Error: Le modèle LOD n'a pas de parent.</string>
|
||||
<string name="status_reading_file">Chargement...</string>
|
||||
<string name="status_generating_meshes">Génération des maillages...</string>
|
||||
<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>
|
||||
<string name="medium">Moyen</string>
|
||||
<string name="low">Faible</string>
|
||||
<string name="lowest">Le plus faible</string>
|
||||
<string name="mesh_status_good">Bon à publier !</string>
|
||||
<string name="mesh_status_na">N/A</string>
|
||||
<string name="mesh_status_none">Aucun</string>
|
||||
<string name="mesh_status_submesh_mismatch">Un nombre différent de faces d'application de texture est associé aux niveaux de détail.</string>
|
||||
<string name="mesh_status_mesh_mismatch">Un nombre différent d'instances de maillage est associé aux niveaux de détail.</string>
|
||||
<string name="mesh_status_too_many_vertices">Trop de sommets pour le niveau de détail.</string>
|
||||
<string name="mesh_status_missing_lod">Niveau de détail requis manquant.</string>
|
||||
<string name="mesh_status_invalid_material_list">Les options du niveau de détail ne sont pas une sous-ensemble d'un modèle de référence.</string>
|
||||
<string name="phys_status_vertex_limit_exceeded">Certaines enveloppes physiques dépassent les limites de sommets.</string>
|
||||
<string name="phys_status_hull_limit_exceeded">Certains modèles dépassent la limite de la coque (256) ; essayez de "simplifier"..</string>
|
||||
<string name="phys_status_degenerate_triangles">Maillage physique trop dense ; supprimez les petits et fins triangles (voir aperçu).</string>
|
||||
<string name="phys_status_no_havok">Cette version ne contient pas de support Havok et n'est pas recommandée pour le chargement de physiques dans Second Life. Les résultats peuvent être imprévisibles.</string>
|
||||
<string name="phys_status_too_thin">Une ou plusieurs dimensions sont inférieures à 0,5 m, seules les formes physiques basées sur la coque (analysées) fonctionneront correctement.</string>
|
||||
<string name="phys_status_unknown_error">Une erreur inconnue a été détectée.</string>
|
||||
<string name="layer_all">Tout</string>
|
||||
<string name="decomposing">Analyse...</string>
|
||||
<string name="simplifying">Simplification...</string>
|
||||
<string name="TooManyJoint">Le skinning est désactivé en raison d'un trop grand nombre d'articulations : [JOINTS], maximum : [MAX]</string>
|
||||
<string name="UnrecognizedJoint">Riggé à une articulation au nom inconnu [NAME]</string>
|
||||
<string name="UnknownJoints">Skinning désactivé à cause de [COUNT] articulation inconnues.</string>
|
||||
<string name="ModelLoaded">Modèle [MODEL_NAME] chargé</string>
|
||||
<string name="IncompleteTC">Les données des coordonnées de la texture ne sont pas complètes.</string>
|
||||
<panel name="left_panel">
|
||||
<panel name="model_name_representation_panel">
|
||||
<text name="name_label">
|
||||
Nom du modèle :
|
||||
</text>
|
||||
<text name="model_category_label">
|
||||
Ce modèle représente...
|
||||
</text>
|
||||
<combo_box name="model_category_combo">
|
||||
<combo_item label="Choisir une option..." name="Choose one"/>
|
||||
<combo_item label="Silhouette de l'avatar" name="Avatar shape"/>
|
||||
<combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
|
||||
<combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
|
||||
<combo_item label="Éléments pour la construction" name="Building Component"/>
|
||||
<combo_item label="Important, immobile etc." name="Large, non moving etc"/>
|
||||
<combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
|
||||
<combo_item label="Aucun" name="Not really any of these"/>
|
||||
</combo_box>
|
||||
</panel>
|
||||
<tab_container name="import_tab">
|
||||
<panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
|
||||
<text initial_value="Source" name="source" value="Source"/>
|
||||
<text initial_value="Triangles" name="triangles" value="Triangles"/>
|
||||
<text initial_value="Sommets" name="vertices" value="Sommets"/>
|
||||
<text initial_value="Élevé" name="high_label" value="Élevé"/>
|
||||
<combo_box name="lod_source_high">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_high"/>
|
||||
<combo_box name="lod_mode_high">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="high_triangles" value="0"/>
|
||||
<text initial_value="0" name="high_vertices" value="0"/>
|
||||
<text initial_value="Moyen" name="medium_label" value="Moyen"/>
|
||||
<combo_box name="lod_source_medium">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_medium"/>
|
||||
<combo_box name="lod_mode_medium">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="medium_triangles" value="0"/>
|
||||
<text initial_value="0" name="medium_vertices" value="0"/>
|
||||
<text initial_value="Faible" name="low_label" value="Faible"/>
|
||||
<combo_box name="lod_source_low">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_low"/>
|
||||
<combo_box name="lod_mode_low">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="low_triangles" value="0"/>
|
||||
<text initial_value="0" name="low_vertices" value="0"/>
|
||||
<text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
|
||||
<combo_box name="lod_source_lowest">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_lowest"/>
|
||||
<combo_box name="lod_mode_lowest">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="lowest_triangles" value="0"/>
|
||||
<text initial_value="0" name="lowest_vertices" value="0"/>
|
||||
<check_box label="Génération de normales" name="gen_normals"/>
|
||||
<text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
|
||||
<spinner name="crease_angle" value="75"/>
|
||||
</panel>
|
||||
<tab_container name="import_tab">
|
||||
<panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
|
||||
<text initial_value="Source" name="source" value="Source"/>
|
||||
<text initial_value="Triangles" name="triangles" value="Triangles"/>
|
||||
<text initial_value="Sommets" name="vertices" value="Sommets"/>
|
||||
<text initial_value="Élevé" name="high_label" value="Élevé"/>
|
||||
<combo_box name="lod_source_high">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
<panel label="Propriétés physiques" name="physics_panel">
|
||||
<panel name="physics geometry">
|
||||
<text name="first_step_name">
|
||||
Étape 1 : Niveau de détail
|
||||
</text>
|
||||
<combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
|
||||
<combo_item name="choose_one">
|
||||
Choisir une option...
|
||||
</combo_item>
|
||||
<combo_item name="physics_high">
|
||||
Élevé
|
||||
</combo_item>
|
||||
<combo_item name="physics_medium">
|
||||
Moyen
|
||||
</combo_item>
|
||||
<combo_item name="physics_low">
|
||||
Faible
|
||||
</combo_item>
|
||||
<combo_item name="physics_lowest">
|
||||
Le plus faible
|
||||
</combo_item>
|
||||
<combo_item name="physics_cube">
|
||||
Cube
|
||||
</combo_item>
|
||||
<combo_item name="physics_hex">
|
||||
Hexagone
|
||||
</combo_item>
|
||||
<combo_item name="physics_ud">
|
||||
Défini par l'utilisateur
|
||||
</combo_item>
|
||||
<combo_item name="load_from_file">
|
||||
Du fichier
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_high"/>
|
||||
<combo_box name="lod_mode_high">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="high_triangles" value="0"/>
|
||||
<text initial_value="0" name="high_vertices" value="0"/>
|
||||
<text initial_value="Moyen" name="medium_label" value="Moyen"/>
|
||||
<combo_box name="lod_source_medium">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_medium"/>
|
||||
<combo_box name="lod_mode_medium">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="medium_triangles" value="0"/>
|
||||
<text initial_value="0" name="medium_vertices" value="0"/>
|
||||
<text initial_value="Faible" name="low_label" value="Faible"/>
|
||||
<combo_box name="lod_source_low">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_low"/>
|
||||
<combo_box name="lod_mode_low">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="low_triangles" value="0"/>
|
||||
<text initial_value="0" name="low_vertices" value="0"/>
|
||||
<text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
|
||||
<combo_box name="lod_source_lowest">
|
||||
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
|
||||
<item label="Génération" name="Generate" value="Génération"/>
|
||||
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="lod_browse_lowest"/>
|
||||
<combo_box name="lod_mode_lowest">
|
||||
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
|
||||
<item label="Seuil d’erreur" name="Error Threshold" value="Seuil d'erreur"/>
|
||||
</combo_box>
|
||||
<text initial_value="0" name="lowest_triangles" value="0"/>
|
||||
<text initial_value="0" name="lowest_vertices" value="0"/>
|
||||
<check_box label="Génération de normales" name="gen_normals"/>
|
||||
<text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
|
||||
<spinner name="crease_angle" value="75"/>
|
||||
<button label="Parcourir..." name="physics_browse"/>
|
||||
</panel>
|
||||
<panel label="Propriétés physiques" name="physics_panel">
|
||||
<panel name="physics geometry">
|
||||
<text name="first_step_name">
|
||||
Étape 1 : Niveau de détail
|
||||
</text>
|
||||
<combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
|
||||
<combo_item name="choose_one">
|
||||
Choisir une option...
|
||||
</combo_item>
|
||||
<combo_item name="physics_high">
|
||||
Élevé
|
||||
</combo_item>
|
||||
<combo_item name="physics_medium">
|
||||
Moyen
|
||||
</combo_item>
|
||||
<combo_item name="physics_low">
|
||||
Faible
|
||||
</combo_item>
|
||||
<combo_item name="physics_lowest">
|
||||
Le plus faible
|
||||
</combo_item>
|
||||
<combo_item name="physics_cube">
|
||||
Cube
|
||||
</combo_item>
|
||||
<combo_item name="physics_hex">
|
||||
Hexagone
|
||||
</combo_item>
|
||||
<combo_item name="physics_ud">
|
||||
Défini par l'utilisateur
|
||||
</combo_item>
|
||||
<combo_item name="load_from_file">
|
||||
Du fichier
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<button label="Parcourir..." name="physics_browse"/>
|
||||
</panel>
|
||||
<panel name="physics analysis">
|
||||
<text name="method_label">
|
||||
Étape 2 : Analyser
|
||||
</text>
|
||||
<text name="analysis_method_label">
|
||||
Moyen :
|
||||
</text>
|
||||
<text name="quality_label">
|
||||
Qualité :
|
||||
</text>
|
||||
<text name="smooth_method_label">
|
||||
Lissage :
|
||||
</text>
|
||||
<check_box label="Fermer les trous" name="Close Holes (Slow)"/>
|
||||
<button label="Analyser" name="Decompose"/>
|
||||
<button label="Annuler" name="decompose_cancel"/>
|
||||
</panel>
|
||||
<panel name="physics simplification">
|
||||
<text name="second_step_label">
|
||||
Étape 3 : Simplifier
|
||||
</text>
|
||||
<text name="simp_method_header">
|
||||
Moyen :
|
||||
</text>
|
||||
<text name="pass_method_header">
|
||||
Passes :
|
||||
</text>
|
||||
<text name="Detail Scale label">
|
||||
Échelle détail :
|
||||
</text>
|
||||
<text name="Retain%_label">
|
||||
Retenue :
|
||||
</text>
|
||||
<combo_box name="Combine Quality" value="1"/>
|
||||
<button label="Simplifier" name="Simplify"/>
|
||||
<button label="Annuler" name="simplify_cancel"/>
|
||||
</panel>
|
||||
<panel name="physics info">
|
||||
<text name="results_text">
|
||||
Résultats :
|
||||
</text>
|
||||
<text name="physics_triangles">
|
||||
Triangles : [TRIANGLES],
|
||||
</text>
|
||||
<text name="physics_points">
|
||||
Sommets : [POINTS]
|
||||
</text>
|
||||
<text name="physics_hulls">
|
||||
Enveloppes : [HULLS]
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="physics analysis">
|
||||
<text name="method_label">
|
||||
Étape 2 : Analyser
|
||||
</text>
|
||||
<text name="analysis_method_label">
|
||||
Moyen :
|
||||
</text>
|
||||
<text name="quality_label">
|
||||
Qualité :
|
||||
</text>
|
||||
<text name="smooth_method_label">
|
||||
Lissage :
|
||||
</text>
|
||||
<check_box label="Fermer les trous" name="Close Holes (Slow)"/>
|
||||
<button label="Analyser" name="Decompose"/>
|
||||
<button label="Annuler" name="decompose_cancel"/>
|
||||
</panel>
|
||||
<panel label="Option de chargement" name="modifiers_panel">
|
||||
<text name="scale_label">
|
||||
Échelle (1 = aucune) :
|
||||
<panel name="physics simplification">
|
||||
<text name="second_step_label">
|
||||
Étape 3 : Simplifier
|
||||
</text>
|
||||
<text name="dimensions_label">
|
||||
Dimensions :
|
||||
<text name="simp_method_header">
|
||||
Moyen :
|
||||
</text>
|
||||
<text name="import_dimensions">
|
||||
[X] X [Y] X [Z]
|
||||
<text name="pass_method_header">
|
||||
Passes :
|
||||
</text>
|
||||
<check_box label="Inclure les textures" name="upload_textures"/>
|
||||
<text name="Detail Scale label">
|
||||
Échelle détail :
|
||||
</text>
|
||||
<text name="Retain%_label">
|
||||
Retenue :
|
||||
</text>
|
||||
<combo_box name="Combine Quality" value="1"/>
|
||||
<button label="Simplifier" name="Simplify"/>
|
||||
<button label="Annuler" name="simplify_cancel"/>
|
||||
</panel>
|
||||
<panel label="Outrepasser" title="Avatar" name="rigging_panel">
|
||||
<check_box label="Inclure pondération de la peau :" name="upload_skin"/>
|
||||
<check_box label="Inclure position des articulations :" name="upload_joints"/>
|
||||
<check_box label="Verrouiller l’échelle si la position des articulations est définie" name="lock_scale_if_joint_position"/>
|
||||
<text name="pelvis_offset_label">
|
||||
Décalage Z (élever/abaisser l'avatar) :
|
||||
<panel name="physics info">
|
||||
<text name="results_text">
|
||||
Résultats :
|
||||
</text>
|
||||
<text name="skin_too_many_joints">
|
||||
Trop d'articulations texturées
|
||||
<text name="physics_triangles">
|
||||
Triangles : [TRIANGLES],
|
||||
</text>
|
||||
<text name="skin_unknown_joint">
|
||||
Le modèle a des articulations inconnues
|
||||
<text name="physics_points">
|
||||
Sommets : [POINTS]
|
||||
</text>
|
||||
<text name="joints_descr">
|
||||
Articulations :
|
||||
<text name="physics_hulls">
|
||||
Enveloppes : [HULLS]
|
||||
</text>
|
||||
<text name="conflicts_description">
|
||||
[CONFLICTS] Conflits dans la/les articulations [JOINTS_COUNT]
|
||||
</text>
|
||||
<text name="pos_overrides_descr">
|
||||
Position annulée pour l'articulation '[JOINT]':
|
||||
</text>
|
||||
<scroll_list name="pos_overrides_list">
|
||||
<scroll_list.columns label="Modèle" name="model_name"/>
|
||||
<scroll_list.columns label="X" name="axis_x"/>
|
||||
<scroll_list.columns label="Y" name="axis_y"/>
|
||||
<scroll_list.columns label="Z" name="axis_z"/>
|
||||
</scroll_list>
|
||||
</panel>
|
||||
<panel label="Journal" name="logs_panel">
|
||||
<check_box label="Afficher le journal détaillé" name="verbose_logging"/>
|
||||
</panel>
|
||||
<panel label="Réglages aperçu" name="mesh_preview_settings_panel">
|
||||
<text name="mesh_upload_behaviour_label">
|
||||
Chargement des modèles :
|
||||
</text>
|
||||
<check_box label="Activation automatique des poids" tool_tip="Régler automatiquement le poids des mesh avec les informations de rigging" name="mesh_preview_auto_weights"/>
|
||||
<check_box label="Visualisation automatique des poids" tool_tip="Visualiser automatiquement les poids dans l'aperçu des meshes avec les info de rigging" name="mesh_preview_auto_show_weights"/>
|
||||
<text name="mesh_preview_ud_preset_label">
|
||||
Physique défini par l'utilisateur :
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Chemin d'accès complet vers un fichier Collada à utiliser pour les propriétés physiques."/>
|
||||
<text name="mesh_preview_colors_label">
|
||||
Couleurs de l'aperçu des modèles :
|
||||
</text>
|
||||
<text name="user_label">
|
||||
Général :
|
||||
</text>
|
||||
<color_swatch label="Arrière-plan" tool_tip="Couleur d'arrière-plan pour l'uploader" name="mesh_preview_canvas_color"/>
|
||||
<color_swatch label="Arêtes du modèle" tool_tip="Couleur des arêtes du modèle dans l'aperçu de l'uploader" name="mesh_preview_edge_color"/>
|
||||
<text name="physics_settings_label">
|
||||
Physiques :
|
||||
</text>
|
||||
<color_swatch label="Arêtes du physique" tool_tip="Couleur des arêtes pour les triangles du physique dans l'aperçu de l'uploader" name="mesh_preview_physics_edge_color"/>
|
||||
<color_swatch label="Physique" tool_tip="Couleur de remplissage pour les physiques dans l'aperçu de l'uploader" name="mesh_preview_physics_fill_color"/>
|
||||
<text name="physics_issues_setting_label">
|
||||
Pb des physiques :
|
||||
</text>
|
||||
<color_swatch label="Mauvaises arêtes" tool_tip="Couleur des arêtes pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_preview_degenerate_edge_color"/>
|
||||
<color_swatch label="Mauvais triangles" tool_tip="Couleur de remplissage pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_degenerate_fill_color"/>
|
||||
</panel>
|
||||
</tab_container>
|
||||
<panel name="weights_and_warning_panel">
|
||||
<button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
|
||||
<button label="Annuler" name="cancel_btn"/>
|
||||
<button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur"/>
|
||||
<button label="Effacer les paramètres / réinitialiser" name="reset_btn"/>
|
||||
<text name="upload_fee">
|
||||
Frais de chargt : [FEE] L$
|
||||
</panel>
|
||||
<panel label="Option de chargement" name="modifiers_panel">
|
||||
<text name="scale_label">
|
||||
Échelle (1 = aucune) :
|
||||
</text>
|
||||
<text name="prim_weight">
|
||||
Impact terrain : [EQ]
|
||||
<text name="dimensions_label">
|
||||
Dimensions :
|
||||
</text>
|
||||
<text name="download_weight">
|
||||
Chargement : [ST]
|
||||
<text name="import_dimensions">
|
||||
[X] X [Y] X [Z]
|
||||
</text>
|
||||
<text name="physics_weight">
|
||||
Physique : [PH]
|
||||
<check_box label="Inclure les textures" name="upload_textures"/>
|
||||
</panel>
|
||||
<panel label="Outrepasser" title="Avatar" name="rigging_panel">
|
||||
<check_box label="Inclure pondération de la peau :" name="upload_skin"/>
|
||||
<check_box label="Inclure position des articulations :" name="upload_joints"/>
|
||||
<check_box label="Verrouiller l’échelle si la position des articulations est définie" name="lock_scale_if_joint_position"/>
|
||||
<text name="pelvis_offset_label">
|
||||
Décalage Z (élever/abaisser l'avatar) :
|
||||
</text>
|
||||
<text name="server_weight">
|
||||
Serveur : [SIM]
|
||||
<text name="skin_too_many_joints">
|
||||
Trop d'articulations texturées
|
||||
</text>
|
||||
<panel name="price_breakdown_panel">
|
||||
<text name="price_breakdown_title">
|
||||
Répartition des coûts
|
||||
</text>
|
||||
<text name="price_breakdown_labels">
|
||||
<text name="skin_unknown_joint">
|
||||
Le modèle a des articulations inconnues
|
||||
</text>
|
||||
<text name="joints_descr">
|
||||
Articulations :
|
||||
</text>
|
||||
<text name="conflicts_description">
|
||||
[CONFLICTS] Conflits dans la/les articulations [JOINTS_COUNT]
|
||||
</text>
|
||||
<text name="pos_overrides_descr">
|
||||
Position annulée pour l'articulation '[JOINT]':
|
||||
</text>
|
||||
<scroll_list name="pos_overrides_list">
|
||||
<scroll_list.columns label="Modèle" name="model_name"/>
|
||||
<scroll_list.columns label="X" name="axis_x"/>
|
||||
<scroll_list.columns label="Y" name="axis_y"/>
|
||||
<scroll_list.columns label="Z" name="axis_z"/>
|
||||
</scroll_list>
|
||||
</panel>
|
||||
<panel label="Journal" name="logs_panel">
|
||||
<check_box label="Afficher le journal détaillé" name="verbose_logging"/>
|
||||
</panel>
|
||||
<panel label="Réglages aperçu" name="mesh_preview_settings_panel">
|
||||
<text name="mesh_upload_behaviour_label">
|
||||
Chargement des modèles :
|
||||
</text>
|
||||
<check_box label="Activation automatique des poids" tool_tip="Régler automatiquement le poids des mesh avec les informations de rigging" name="mesh_preview_auto_weights"/>
|
||||
<check_box label="Visualisation automatique des poids" tool_tip="Visualiser automatiquement les poids dans l'aperçu des meshes avec les info de rigging" name="mesh_preview_auto_show_weights"/>
|
||||
<text name="mesh_preview_ud_preset_label">
|
||||
Physique défini par l'utilisateur :
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Chemin d'accès complet vers un fichier Collada à utiliser pour les propriétés physiques."/>
|
||||
<text name="mesh_preview_colors_label">
|
||||
Couleurs de l'aperçu des modèles :
|
||||
</text>
|
||||
<text name="user_label">
|
||||
Général :
|
||||
</text>
|
||||
<color_swatch label="Arrière-plan" tool_tip="Couleur d'arrière-plan pour l'uploader" name="mesh_preview_canvas_color"/>
|
||||
<color_swatch label="Arêtes du modèle" tool_tip="Couleur des arêtes du modèle dans l'aperçu de l'uploader" name="mesh_preview_edge_color"/>
|
||||
<text name="physics_settings_label">
|
||||
Physiques :
|
||||
</text>
|
||||
<color_swatch label="Arêtes du physique" tool_tip="Couleur des arêtes pour les triangles du physique dans l'aperçu de l'uploader" name="mesh_preview_physics_edge_color"/>
|
||||
<color_swatch label="Physique" tool_tip="Couleur de remplissage pour les physiques dans l'aperçu de l'uploader" name="mesh_preview_physics_fill_color"/>
|
||||
<text name="physics_issues_setting_label">
|
||||
Pb des physiques :
|
||||
</text>
|
||||
<color_swatch label="Mauvaises arêtes" tool_tip="Couleur des arêtes pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_preview_degenerate_edge_color"/>
|
||||
<color_swatch label="Mauvais triangles" tool_tip="Couleur de remplissage pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_degenerate_fill_color"/>
|
||||
</panel>
|
||||
</tab_container>
|
||||
<panel name="weights_and_warning_panel">
|
||||
<button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
|
||||
<button label="Annuler" name="cancel_btn"/>
|
||||
<button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur"/>
|
||||
<button label="Effacer les paramètres / réinitialiser" name="reset_btn"/>
|
||||
<text name="upload_fee">
|
||||
Frais de chargt : [FEE] L$
|
||||
</text>
|
||||
<text name="prim_weight">
|
||||
Impact terrain : [EQ]
|
||||
</text>
|
||||
<text name="download_weight">
|
||||
Chargement : [ST]
|
||||
</text>
|
||||
<text name="physics_weight">
|
||||
Physique : [PH]
|
||||
</text>
|
||||
<text name="server_weight">
|
||||
Serveur : [SIM]
|
||||
</text>
|
||||
<panel name="price_breakdown_panel">
|
||||
<text name="price_breakdown_title">
|
||||
Répartition des coûts
|
||||
</text>
|
||||
<text name="price_breakdown_labels">
|
||||
Chargement :
|
||||
Physique :
|
||||
Instances :
|
||||
Textures :
|
||||
Modèle :
|
||||
</text>
|
||||
</panel>
|
||||
<!--
|
||||
<text name="streaming_breakdown_labels">
|
||||
</text>
|
||||
</panel>
|
||||
<!--
|
||||
<text name="streaming_breakdown_labels">
|
||||
Streaming/Téléchargement :
|
||||
Élevé :
|
||||
Moyen :
|
||||
Bas :
|
||||
Le plus bas :
|
||||
</text>
|
||||
-->
|
||||
<panel name="physics_costs_panel">
|
||||
<text name="physics_breakdown_title">
|
||||
Coûts du physique
|
||||
</text>
|
||||
-->
|
||||
<panel name="physics_costs_panel">
|
||||
<text name="physics_breakdown_title">
|
||||
Coûts du physique
|
||||
</text>
|
||||
<text name="physics_breakdown_labels">
|
||||
<text name="physics_breakdown_labels">
|
||||
Enveloppe :
|
||||
Maillage :
|
||||
Analysé :
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="preview_controls_panel">
|
||||
<panel name="preview_controls_inner_panel">
|
||||
<text name="preview_controls_title">
|
||||
Contrôles de l'aperçu
|
||||
</text>
|
||||
<combo_box name="preview_lod_combo" tool_tip="Dargestelltes LOD in der Vorschau">
|
||||
<combo_item name="high">Élevé</combo_item>
|
||||
<combo_item name="medium">Moyen</combo_item>
|
||||
<combo_item name="low">Faible</combo_item>
|
||||
<combo_item name="lowest">Le plus faible</combo_item>
|
||||
</combo_box>
|
||||
</panel>
|
||||
<check_box label="Arêtes" name="show_edges"/>
|
||||
<check_box label="Textures" name="show_textures"/>
|
||||
<check_box label="Guide UV" name="show_uv_guide"/>
|
||||
<check_box label="Physique" name="show_physics"/>
|
||||
<text name="exploder_label" width="105">
|
||||
Aperçu :
|
||||
</text>
|
||||
<slider name="physics_explode" width="75" />
|
||||
<check_box label="Poids" name="show_skin_weight"/>
|
||||
<check_box label="Positions articul." name="show_joint_positions"/>
|
||||
<check_box label="Surcharge pos. articulations" name="show_joint_overrides"/>
|
||||
</panel>
|
||||
<text name="warning_title">
|
||||
Remarque :
|
||||
</text>
|
||||
<text name="warning_message">
|
||||
Vous n'avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
|
||||
</text>
|
||||
<text name="status">
|
||||
[STATUS]
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="preview_controls_panel">
|
||||
<panel name="preview_controls_inner_panel">
|
||||
<text name="preview_controls_title">
|
||||
Contrôles de l'aperçu
|
||||
</text>
|
||||
<combo_box name="preview_lod_combo" tool_tip="Dargestelltes LOD in der Vorschau">
|
||||
<combo_item name="high">Élevé</combo_item>
|
||||
<combo_item name="medium">Moyen</combo_item>
|
||||
<combo_item name="low">Faible</combo_item>
|
||||
<combo_item name="lowest">Le plus faible</combo_item>
|
||||
</combo_box>
|
||||
</panel>
|
||||
<check_box label="Arêtes" name="show_edges"/>
|
||||
<check_box label="Textures" name="show_textures"/>
|
||||
<check_box label="Guide UV" name="show_uv_guide"/>
|
||||
<check_box label="Physique" name="show_physics"/>
|
||||
<text name="exploder_label" width="105">
|
||||
Aperçu :
|
||||
</text>
|
||||
<slider name="physics_explode" width="75" />
|
||||
<check_box label="Poids" name="show_skin_weight"/>
|
||||
<check_box label="Positions articul." name="show_joint_positions"/>
|
||||
<check_box label="Surcharge pos. articulations" name="show_joint_overrides"/>
|
||||
</panel>
|
||||
<text name="warning_title">
|
||||
Remarque :
|
||||
</text>
|
||||
<text name="warning_message">
|
||||
Vous n'avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
|
||||
</text>
|
||||
<text name="status">
|
||||
[STATUS]
|
||||
</text>
|
||||
</panel>
|
||||
<text name="lod_label">
|
||||
Aperçu :
|
||||
</text>
|
||||
</panel>
|
||||
<text name="lod_label">
|
||||
Aperçu :
|
||||
</text>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -5389,4 +5389,9 @@ Veuillez noter que "Utiliser l'environnement partagé" et "Basé sur le cycle jo
|
|||
Remettre l'URL par défaut ?
|
||||
<usetemplate name="okcancelbuttons" notext="Rappeler plus tard" yestext="Réinitialiser"/>
|
||||
</notification>
|
||||
<notification name="WarnScriptedCamera">
|
||||
La réinitialisation de la caméra peut être empêchée par les objets suivants :
|
||||
|
||||
[SOURCES]
|
||||
</notification>
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -5160,6 +5160,13 @@ Wynik testu kompresji pliku dla gzip na poziomie 6 z [FILE] o rozmiarze [SIZE] K
|
|||
Pakowanie: [PACK_TIME]s [PSIZE]KB
|
||||
Rozpakowywanie: [UNPACK_TIME]s [USIZE]KB
|
||||
</notification>
|
||||
<notification name="PromptMFAToken">
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="continue" text="Kontynuuj" />
|
||||
<button name="cancel" text="Anuluj" />
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="NoValidEnvSettingFound">
|
||||
Nie wybrano prawidłowego ustawienia otoczenia.
|
||||
|
||||
|
|
@ -5185,4 +5192,9 @@ Pamiętaj, że nie można wybrać "otoczenia współdzielonego" i "bazowanego na
|
|||
Zresetować adres URL do domyślnego?
|
||||
<usetemplate name="okcancelbuttons" notext="Przypomnij mi potem" yestext="Resetuj" />
|
||||
</notification>
|
||||
<notification name="WarnScriptedCamera">
|
||||
Resetowanie kamery może być zablokowane przez następujące obiekty:
|
||||
|
||||
[SOURCES]
|
||||
</notification>
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -232,6 +232,7 @@ http://secondlife.com/viewer-access-faq
|
|||
Upewnij się, że wpisano poprawnie:
|
||||
* Login (np. bobsmith12 czy steller.sunshine)
|
||||
* Hasło
|
||||
* Token weryfikacji dwuetapowej (gdy włączona)
|
||||
Sprawdź też, czy klawisz Caps Lock nie jest wciśnięty.
|
||||
</string>
|
||||
<string name="LoginFailedPasswordChanged">
|
||||
|
|
@ -341,6 +342,10 @@ Spróbuj zalogować się ponownie za minutę.
|
|||
<string name="LoginFailedLoggingOutSession">
|
||||
System rozpoczął wylogowywanie Twojej ostatniej sesji.
|
||||
Spróbuj zalogować się ponownie za minutę.
|
||||
</string>
|
||||
<string name="LoginFailedAuthenticationMFARequired">
|
||||
Wprowadź nowy token z aplikacji do uwierzytelniania wieloskładnikowego.
|
||||
Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
|
||||
</string>
|
||||
<string name="AgentLostConnection">
|
||||
Ten region może mieć problemy. Sprawdź podłączenie do Internetu.
|
||||
|
|
|
|||
|
|
@ -5298,16 +5298,19 @@ https://wiki.firestormviewer.org/fs_voice
|
|||
Диспетчер анимаций (AO): [AO_MESSAGE]
|
||||
<usetemplate ignoretext="Предупредить меня, когда к функции Диспетчера анимаций (AO) обращается скриптовый объект" name="notifyignore"/>
|
||||
</notification>
|
||||
|
||||
<notification name="AttachedRiggedObjectToHUD">
|
||||
Предмет с названием "[NAME]" является ригованым мешем, но прикреплен на экран в "[HUD_POINT]". Это значит, что для вас он будет отображаться правильно, но все остальные вообще не смогут его увидеть. Возможно, вы захотите снять его и снова прикрепить к обычной точке крепления на теле.
|
||||
<usetemplate ignoretext="Предупреждать меня когда ригованные вещи прикрепляются на экран пользователя." name="notifyignore"/>
|
||||
</notification>
|
||||
|
||||
<notification name="WarnForceLoginURL">
|
||||
URL-адрес заставки входа в систему переопределен в целях тестирования.
|
||||
|
||||
Сбросить URL по умолчанию?
|
||||
<usetemplate name="okcancelbuttons" notext="Напомни мне в следующий раз" yestext="Сбросить"/>
|
||||
</notification>
|
||||
<notification name="WarnScriptedCamera">
|
||||
Сброс камеры может быть заблокирован следующими объектами:
|
||||
|
||||
[SOURCES]
|
||||
</notification>
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -208,6 +208,15 @@ std::string LLGridManager::getAppSLURLBase(const std::string& grid_name)
|
|||
{
|
||||
return "myappslurl";
|
||||
}
|
||||
std::string LLGridManager::getGridId(const std::string& grid)
|
||||
{
|
||||
return std::string();
|
||||
}
|
||||
|
||||
//LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type)
|
||||
//{
|
||||
// return nullptr;
|
||||
//}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "../llviewercontrol.h"
|
||||
|
|
@ -240,6 +249,7 @@ bool llHashedUniqueID(unsigned char* id)
|
|||
//-----------------------------------------------------------------------------
|
||||
#include "../llappviewer.h"
|
||||
void LLAppViewer::forceQuit(void) {}
|
||||
bool LLAppViewer::isUpdaterMissing() { return true; }
|
||||
LLAppViewer * LLAppViewer::sInstance = 0;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -248,6 +258,8 @@ LLAppViewer * LLAppViewer::sInstance = 0;
|
|||
static std::string gTOSType;
|
||||
static LLEventPump * gTOSReplyPump = NULL;
|
||||
|
||||
LLPointer<LLSecAPIHandler> gSecAPIHandler;
|
||||
|
||||
//static
|
||||
LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
|
||||
{
|
||||
|
|
@ -365,6 +377,7 @@ namespace tut
|
|||
gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", LLControlVariable::PERSIST_NO);
|
||||
gSavedSettings.declareString("NextLoginLocation", "", "", LLControlVariable::PERSIST_NO);
|
||||
gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", LLControlVariable::PERSIST_NO);
|
||||
gSavedSettings.declareBOOL("CmdLineSkipUpdater", TRUE, "", LLControlVariable::PERSIST_NO);
|
||||
|
||||
LLSD authenticator = LLSD::emptyMap();
|
||||
LLSD identifier = LLSD::emptyMap();
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const st
|
|||
void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, const std::string& data_id, const LLSD& data) {}
|
||||
void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem, const LLSD& data) {}
|
||||
void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem) {}
|
||||
void LLSecAPIBasicHandler::syncProtectedMap() {}
|
||||
LLSD LLSecAPIBasicHandler::getProtectedData(const std::string& data_type, const std::string& data_id) { return LLSD(); }
|
||||
void LLSecAPIBasicHandler::deleteProtectedData(const std::string& data_type, const std::string& data_id) {}
|
||||
LLPointer<LLCredential> LLSecAPIBasicHandler::createCredential(const std::string& grid, const LLSD& identifier, const LLSD& authenticator) { return NULL; }
|
||||
|
|
|
|||
|
|
@ -250,26 +250,34 @@ void LLLogin::Impl::loginCoro(std::string uri, LLSD login_params)
|
|||
|
||||
// Since sSyncPoint is an LLEventMailDrop, we DEFINITELY want to
|
||||
// consume the posted event.
|
||||
// <FS:ND> Disable updater (n.b. this might not beed needed anymore)
|
||||
// LLCoros::OverrideConsuming oc(true);
|
||||
// // Timeout should produce the isUndefined() object passed here.
|
||||
// LL_DEBUGS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL;
|
||||
// LLSD updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 10, LLSD());
|
||||
// if (updater.isUndefined())
|
||||
// {
|
||||
// LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login"
|
||||
// << LL_ENDL;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL;
|
||||
// }
|
||||
// // Let the fail.login handler deal with empty updater response.
|
||||
// LLSD responses(mAuthResponse["responses"]);
|
||||
// responses["updater"] = updater;
|
||||
// sendProgressEvent("offline", "fail.login", responses);
|
||||
sendProgressEvent("offline", "fail.login", mAuthResponse["responses"]);
|
||||
// </FS:ND>
|
||||
LLCoros::OverrideConsuming oc(true);
|
||||
LLSD responses(mAuthResponse["responses"]);
|
||||
LLSD updater;
|
||||
|
||||
if (printable_params["wait_for_updater"].asBoolean())
|
||||
{
|
||||
std::string reason_response = responses["data"]["reason"].asString();
|
||||
if (reason_response == "update") // No point waiting if not an update
|
||||
{
|
||||
// Timeout should produce the isUndefined() object passed here.
|
||||
LL_INFOS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL;
|
||||
updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 10, LLSD());
|
||||
|
||||
if (updater.isUndefined())
|
||||
{
|
||||
LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login"
|
||||
<< LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Let the fail.login handler deal with empty updater response.
|
||||
responses["updater"] = updater;
|
||||
sendProgressEvent("offline", "fail.login", responses);
|
||||
}
|
||||
return; // Done!
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue