Ansariel 2023-07-22 10:45:54 +02:00
commit 2de048052b
32 changed files with 617 additions and 219 deletions

View File

@ -225,38 +225,72 @@ U64 LLMemory::getCurrentRSS()
}
#elif defined(LL_LINUX)
// <FS:Beq> Linux RSS appears to have drifted from the implementation below.
// U64 LLMemory::getCurrentRSS()
// {
// static const char statPath[] = "/proc/self/stat";
// LLFILE *fp = LLFile::fopen(statPath, "r");
// U64 rss = 0;
U64 LLMemory::getCurrentRSS()
{
static const char statPath[] = "/proc/self/stat";
LLFILE *fp = LLFile::fopen(statPath, "r");
U64 rss = 0;
// if (fp == NULL)
// {
// LL_WARNS() << "couldn't open " << statPath << LL_ENDL;
// return 0;
// }
if (fp == NULL)
{
LL_WARNS() << "couldn't open " << statPath << LL_ENDL;
return 0;
}
// Eee-yew! See Documentation/filesystems/proc.txt in your
// nearest friendly kernel tree for details.
// // Eee-yew! See Documentation/filesystems/proc.txt in your
// // nearest friendly kernel tree for details.
{
int ret = fscanf(fp, "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*d %*d "
"%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %Lu",
&rss);
if (ret != 1)
{
LL_WARNS() << "couldn't parse contents of " << statPath << LL_ENDL;
rss = 0;
}
}
// {
// int ret = fscanf(fp, "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*d %*d "
// "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %Lu",
// &rss);
// if (ret != 1)
// {
// LL_WARNS() << "couldn't parse contents of " << statPath << LL_ENDL;
// rss = 0;
// }
// }
fclose(fp);
// fclose(fp);
return rss;
// return rss;
// }
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <filesystem>
#include <unistd.h>
// return the RSS in bytes. This value is converted to kilobytes implicitly elsewhere.
U64 LLMemory::getCurrentRSS() {
namespace fs = std::filesystem;
// Get the page size (static variable)
static const long pageSize = sysconf(_SC_PAGESIZE);
// Open the /proc/self/statm file
static const auto statmPath = fs::path("/proc/self/statm");
std::ifstream statmFile(statmPath);
if (!statmFile.is_open()) {
return 0; // Return 0 if the file cannot be opened
}
// Read the entire line from statm file
std::string line;
std::getline(statmFile, line);
statmFile.close();
// Extract the values from the line
std::istringstream iss(line);
long size, rss, shared, text, lib, data, dt;
iss >> size >> rss >> shared >> text >> lib >> data >> dt;
// Convert pages to bytes and return RSS
return static_cast<U64>( rss * pageSize );
}
// </FS:Beq>
#else
U64 LLMemory::getCurrentRSS()

View File

@ -311,7 +311,7 @@ bool LLThreadSafeQueue<ElementT, QueueT>::push_(lock_t& lock, T&& element)
// <FS:Beq> Make thread queue capacity hangs visible
// return false;
{
LL_WARNS("ThreadPool") << "Threadsafe queue push_(lockacquired) queue full " << mStorage.size() << " >= " << mCapacity << LL_ENDL;
LL_WARNS_ONCE("ThreadPool") << "Threadsafe queue push_(lockacquired) queue full " << mStorage.size() << " >= " << mCapacity << LL_ENDL;
return false;
}
// </FS:Beq>

View File

@ -947,7 +947,7 @@ std::ostream& operator<<(std::ostream &s, const LLAggregatePermissions &perm)
}
// This converts a permissions mask into a string for debugging use.
void mask_to_string(U32 mask, char* str)
void mask_to_string(U32 mask, char* str, bool isOpenSim /*=false*/) // <FS:Beq/> remove misleading X for export when not in OpenSim
{
if (mask & PERM_MOVE)
{
@ -990,23 +990,29 @@ void mask_to_string(U32 mask, char* str)
str++;
// <FS:CR> OpenSim export permission
if (mask & PERM_EXPORT)
#ifdef OPENSIM
// The export permission is only available in OpenSim.
if (isOpenSim)
{
*str = 'X';
if (mask & PERM_EXPORT)
{
*str = 'X';
}
else
{
*str = ' ';
}
str++;
}
else
{
*str = ' ';
}
str++;
#endif
// </FS:CR>
*str = '\0';
}
std::string mask_to_string(U32 mask)
std::string mask_to_string(U32 mask, bool isOpenSim /*=false*/) // <FS:Beq/> remove misleading X for export when not in OpenSim
{
char str[16];
mask_to_string(mask, str);
mask_to_string(mask, str, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
return std::string(str);
}

View File

@ -35,8 +35,8 @@
// prototypes
class LLMessageSystem;
extern void mask_to_string(U32 mask, char* str);
extern std::string mask_to_string(U32 mask);
extern void mask_to_string(U32 mask, char* str, bool isOpenSim=false);
extern std::string mask_to_string(U32 mask, bool isOpenSim=false);
template<class T> class LLMetaClassT;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -9948,7 +9948,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>64</integer>
<integer>0</integer>
</map>
<key>NoPreload</key>
<map>
@ -14282,7 +14282,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>2048</integer>
<integer>4096</integer>
</map>
<key>SceneLoadLowMemoryBound</key>
<map>
@ -14293,7 +14293,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>750</integer>
<integer>2048</integer>
</map>
<key>SceneLoadMinRadius</key>
<map>

View File

@ -174,6 +174,11 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
mRlvBehaviorCallbackConnection()
{
LLViewerRegion::sFSAreaSearchActive = true;
if( LLViewerRegion* region = gAgent.getRegion() )
{
checkRegion();
}
mFactoryMap["area_search_list_panel"] = LLCallbackMap(createPanelList, this);
mFactoryMap["area_search_find_panel"] = LLCallbackMap(createPanelFind, this);
mFactoryMap["area_search_filter_panel"] = LLCallbackMap(createPanelFilter, this);
@ -185,11 +190,24 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
mParcelChangedObserver = std::make_unique<FSParcelChangeObserver>(this);
LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver.get());
mRegionChangeConnection = gAgent.addRegionChangedCallback(boost::bind(&FSAreaSearch::checkRegion, this));
}
FSAreaSearch::~FSAreaSearch()
{
LLViewerRegion::sFSAreaSearchActive = false;
// Tell the Simulator not to send us everything anymore
// and revert to the regular "keyhole" frustum of interest
// list updates.
if( !LLApp::isExiting() )
{
if( LLViewerRegion* region = gAgent.getRegion() )
{
region->useFullUpdateInterestListMode(false);
}
}
if (!gIdleCallbacks.deleteFunction(idle, this))
{
LL_WARNS("FSAreaSearch") << "FSAreaSearch::~FSAreaSearch() failed to delete callback" << LL_ENDL;
@ -214,6 +232,11 @@ FSAreaSearch::~FSAreaSearch()
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver.get());
mParcelChangedObserver = nullptr;
}
if (mRegionChangeConnection.connected())
{
mRegionChangeConnection.disconnect();
}
}
BOOL FSAreaSearch::postBuild()
@ -320,24 +343,27 @@ void FSAreaSearch::updateRlvRestrictions(ERlvBehaviour behavior)
void FSAreaSearch::checkRegion()
{
if (mActive)
{
// Check if we changed region, and if we did, clear the object details cache.
if (LLViewerRegion* region = gAgent.getRegion(); region && (region != mLastRegion))
static LLViewerRegion *last_region = nullptr;
// Check if we changed region, if so reset the interest list to full,
LLViewerRegion* region = gAgent.getRegion();
if( region && (region != last_region) )
{
region->useFullUpdateInterestListMode(true, true); // we force this because we want a true count
if ( mActive )
{
if (!mExcludeNeighborRegions)
// and if we did and are active, clear the object details cache.
if( !mExcludeNeighborRegions )
{
std::vector<LLViewerRegion*> uniqueRegions;
region->getNeighboringRegions(uniqueRegions);
if (std::find(uniqueRegions.begin(), uniqueRegions.end(), mLastRegion) != uniqueRegions.end())
if( std::find( uniqueRegions.begin(), uniqueRegions.end(), last_region ) != uniqueRegions.end() )
{
// Crossed into a neighboring region, no need to clear everything.
mLastRegion = region;
last_region = region;
return;
}
// else teleported into a new region
}
mLastRegion = region;
mRequested = 0;
mObjectDetails.clear();
mRegionRequests.clear();
@ -347,7 +373,14 @@ void FSAreaSearch::checkRegion()
mPanelList->setAgentLastPosition(gAgent.getPositionGlobal());
mRefresh = true;
}
if( last_region )
{
// we clear the old region status, because the instance may persist for us
// but the region itself will have reset when we left.
last_region->clearFullUpdateInterestList();
}
}
last_region = region;
}
void FSAreaSearch::refreshList(bool cache_clear)

View File

@ -213,7 +213,8 @@ private:
typedef std::map<LLUUID, boost::signals2::connection> name_cache_connection_map_t;
name_cache_connection_map_t mNameCacheConnections;
LLViewerRegion* mLastRegion;
boost::signals2::connection mRegionChangeConnection; // reset interest list verbosity after TP
class FSParcelChangeObserver;
friend class FSParcelChangeObserver;

View File

@ -51,6 +51,27 @@
#include <iterator>
// <FS:Beq> Fix 360 capture missing objects after TP
void LLFloater360Capture::checkRegion()
{
static LLViewerRegion *last_region = nullptr;
// Check if we changed region, if so reset the interest list to full,
LLViewerRegion* region = gAgent.getRegion();
if( region && (region != last_region) )
{
region->useFullUpdateInterestListMode(true, true);
if( last_region )
{
// we clear the old region status, because the instance may persist for us
// but the region itself will have reset when we left.
last_region->clearFullUpdateInterestList();
}
}
last_region = region;
}
// </FS:Beq>
LLFloater360Capture::LLFloater360Capture(const LLSD& key)
: LLFloater(key)
{
@ -66,10 +87,19 @@ LLFloater360Capture::LLFloater360Capture(const LLSD& key)
// will take care of cleaning up for us.
if (gSavedSettings.getBOOL("360CaptureUseInterestListCap"))
{
// <FS:Beq> Fix 360 capture missing objects after TP
// send everything to us for as long as this floater is open
const bool send_everything = true;
changeInterestListMode(send_everything);
// const bool send_everything = true;
// changeInterestListMode(send_everything);
// }
// }
if( LLViewerRegion* region = gAgent.getRegion() )
{
checkRegion();
}
}
mRegionChangeConnection = gAgent.addRegionChangedCallback(boost::bind(&LLFloater360Capture::checkRegion, this));
// </FS:Beq>
}
LLFloater360Capture::~LLFloater360Capture()
@ -86,9 +116,22 @@ LLFloater360Capture::~LLFloater360Capture()
// list updates.
if (!LLApp::isExiting() && gSavedSettings.getBOOL("360CaptureUseInterestListCap"))
{
const bool send_everything = false;
changeInterestListMode(send_everything);
// <FS:Beq> Fix 360 capture missing objects after TP
// const bool send_everything = false;
// changeInterestListMode(send_everything);
// }
// }
if( LLViewerRegion* region = gAgent.getRegion() )
{
region->useFullUpdateInterestListMode(false);
}
}
if (mRegionChangeConnection.connected())
{
mRegionChangeConnection.disconnect();
}
// </FS:Beq>
}
BOOL LLFloater360Capture::postBuild()
@ -171,6 +214,8 @@ void LLFloater360Capture::onChooseQualityRadioGroup()
setSourceImageSize();
}
// <FS:Beq> Area search improvements - allow area search and 360 to coexist nicely.
// Code moved to LLViewerRegion.cpp
// Using a new capability, tell the simulator that we want it to send everything
// it knows about and not just what is in front of the camera, in its view
// frustum. We need this feature so that the contents of the region that appears
@ -183,40 +228,40 @@ void LLFloater360Capture::onChooseQualityRadioGroup()
// (hopefully) small period of time while the full contents resolves.
// Pass in a flag to ask the simulator/interest list to "send everything" or
// not (the default mode)
void LLFloater360Capture::changeInterestListMode(bool send_everything)
{
LLSD body;
// void LLFloater360Capture::changeInterestListMode(bool send_everything)
// {
// LLSD body;
// if (send_everything)
// {
// body["mode"] = LLSD::String("360");
// }
// else
// {
// body["mode"] = LLSD::String("default");
// }
if (send_everything)
{
body["mode"] = LLSD::String("360");
}
else
{
body["mode"] = LLSD::String("default");
}
if (gAgent.requestPostCapability("InterestList", body, [](const LLSD & response)
{
LL_INFOS("360Capture") <<
"InterestList capability responded: \n" <<
ll_pretty_print_sd(response) <<
LL_ENDL;
}))
{
LL_INFOS("360Capture") <<
"Successfully posted an InterestList capability request with payload: \n" <<
ll_pretty_print_sd(body) <<
LL_ENDL;
}
else
{
LL_INFOS("360Capture") <<
"Unable to post an InterestList capability request with payload: \n" <<
ll_pretty_print_sd(body) <<
LL_ENDL;
}
}
// if (gAgent.requestPostCapability("InterestList", body, [](const LLSD & response)
// {
// LL_INFOS("360Capture") <<
// "InterestList capability responded: \n" <<
// ll_pretty_print_sd(response) <<
// LL_ENDL;
// }))
// {
// LL_INFOS("360Capture") <<
// "Successfully posted an InterestList capability request with payload: \n" <<
// ll_pretty_print_sd(body) <<
// LL_ENDL;
// }
// else
// {
// LL_INFOS("360Capture") <<
// "Unable to post an InterestList capability request with payload: \n" <<
// ll_pretty_print_sd(body) <<
// LL_ENDL;
// }
// }
// </FS:Beq>
// There is is a setting (360CaptureSourceImageSize) that holds the size
// (width == height since it's a square) of each of the 6 source snapshots.

View File

@ -50,11 +50,14 @@ class LLFloater360Capture:
void onOpen(const LLSD& key) override;
void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override;
void changeInterestListMode(bool send_everything);
// void changeInterestListMode(bool send_everything); // <FS:Beq/> Area search improvements - code relocated to LLViewerRegion
const std::string getHTMLBaseFolder();
void capture360Images();
// <FS:Beq/> make 360 work properly after region crossing/TP
void checkRegion();
boost::signals2::connection mRegionChangeConnection;
// </FS:Beq>
const std::string makeFullPathToJS(const std::string filename);
void writeDataURLHeader(const std::string filename);
void writeDataURLFooter(const std::string filename);

View File

@ -453,32 +453,40 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
}
std::string perm_string;
// <FS:Beq> remove misleading X for export when not in OpenSim
bool isOpenSim {false};
#ifdef OPENSIM
if( LLGridManager::instance().isInOpenSim() )
{
isOpenSim = true;
}
#endif
// </FS:Beq>
perm_string = "B: ";
perm_string += mask_to_string(base_mask);
perm_string += mask_to_string(base_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("BaseMaskDebug")->setValue(perm_string);
getChildView("BaseMaskDebug")->setVisible(TRUE);
perm_string = "O: ";
perm_string += mask_to_string(owner_mask);
perm_string += mask_to_string(owner_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("OwnerMaskDebug")->setValue(perm_string);
getChildView("OwnerMaskDebug")->setVisible(TRUE);
perm_string = "G";
perm_string += overwrite_group ? "*: " : ": ";
perm_string += mask_to_string(group_mask);
perm_string += mask_to_string(group_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("GroupMaskDebug")->setValue(perm_string);
getChildView("GroupMaskDebug")->setVisible(TRUE);
perm_string = "E";
perm_string += overwrite_everyone ? "*: " : ": ";
perm_string += mask_to_string(everyone_mask);
perm_string += mask_to_string(everyone_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("EveryoneMaskDebug")->setValue(perm_string);
getChildView("EveryoneMaskDebug")->setVisible(TRUE);
perm_string = "N";
perm_string += slam_perm ? "*: " : ": ";
perm_string += mask_to_string(next_owner_mask);
perm_string += mask_to_string(next_owner_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("NextMaskDebug")->setValue(perm_string);
getChildView("NextMaskDebug")->setVisible(TRUE);
}

View File

@ -74,6 +74,7 @@
#include "rlvcommon.h"
// [/RLVa:KB]
// <FS:CR> For OpenSim export permisson
#include "llviewernetwork.h" // <FS:Beq/> for gridmanager
#include "lfsimfeaturehandler.h"
#include "llinventoryfunctions.h"
@ -630,7 +631,7 @@ void LLPanelPermissions::refresh()
}
else
{
// FIRE-777: allow batch edit for name and description
// FIRE-777:<EFBFBD>allow batch edit for name and description
// getChild<LLUICtrl>("Object Name")->setValue(LLStringUtil::null);
// LineEditorObjectDesc->setText(LLStringUtil::null);
if (keyboard_focus_view != LineEditorObjectName)
@ -650,7 +651,7 @@ void LLPanelPermissions::refresh()
// figure out the contents of the name, description, & category
BOOL edit_name_desc = FALSE;
// FIRE-777: allow batch edit for name and description
// FIRE-777:<EFBFBD>allow batch edit for name and description
// if (is_one_object && objectp->permModify() && !objectp->isPermanentEnforced())
if (objectp->permModify())
// /FIRE-777
@ -811,20 +812,28 @@ void LLPanelPermissions::refresh()
&next_owner_mask_on,
&next_owner_mask_off);
if (gSavedSettings.getBOOL("DebugPermissions") )
{
// <FS:Beq> remove misleading X for export when not in OpenSim
bool isOpenSim {false};
#ifdef OPENSIM
if( LLGridManager::instance().isInOpenSim() )
{
isOpenSim = true;
}
#endif
// </FS:Beq>
if (valid_base_perms)
{
getChild<LLUICtrl>("B:")->setValue("B: " + mask_to_string(base_mask_on));
getChild<LLUICtrl>("B:")->setValue("B: " + mask_to_string(base_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("B:")->setVisible(TRUE);
getChild<LLUICtrl>("O:")->setValue("O: " + mask_to_string(owner_mask_on));
getChild<LLUICtrl>("O:")->setValue("O: " + mask_to_string(owner_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("O:")->setVisible(TRUE);
getChild<LLUICtrl>("G:")->setValue("G: " + mask_to_string(group_mask_on));
getChild<LLUICtrl>("G:")->setValue("G: " + mask_to_string(group_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("G:")->setVisible(TRUE);
getChild<LLUICtrl>("E:")->setValue("E: " + mask_to_string(everyone_mask_on));
getChild<LLUICtrl>("E:")->setValue("E: " + mask_to_string(everyone_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("E:")->setVisible(TRUE);
getChild<LLUICtrl>("N:")->setValue("N: " + mask_to_string(next_owner_mask_on));
getChild<LLUICtrl>("N:")->setValue("N: " + mask_to_string(next_owner_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("N:")->setVisible(TRUE);
}
else if(!root_selected)
@ -834,15 +843,15 @@ void LLPanelPermissions::refresh()
LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode();
if (node && node->mValid)
{
getChild<LLUICtrl>("B:")->setValue("B: " + mask_to_string( node->mPermissions->getMaskBase()));
getChild<LLUICtrl>("B:")->setValue("B: " + mask_to_string( node->mPermissions->getMaskBase(), isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("B:")->setVisible(TRUE);
getChild<LLUICtrl>("O:")->setValue("O: " + mask_to_string(node->mPermissions->getMaskOwner()));
getChild<LLUICtrl>("O:")->setValue("O: " + mask_to_string(node->mPermissions->getMaskOwner(), isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("O:")->setVisible(TRUE);
getChild<LLUICtrl>("G:")->setValue("G: " + mask_to_string(node->mPermissions->getMaskGroup()));
getChild<LLUICtrl>("G:")->setValue("G: " + mask_to_string(node->mPermissions->getMaskGroup(), isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("G:")->setVisible(TRUE);
getChild<LLUICtrl>("E:")->setValue("E: " + mask_to_string(node->mPermissions->getMaskEveryone()));
getChild<LLUICtrl>("E:")->setValue("E: " + mask_to_string(node->mPermissions->getMaskEveryone(), isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("E:")->setVisible(TRUE);
getChild<LLUICtrl>("N:")->setValue("N: " + mask_to_string(node->mPermissions->getMaskNextOwner()));
getChild<LLUICtrl>("N:")->setValue("N: " + mask_to_string(node->mPermissions->getMaskNextOwner(), isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("N:")->setVisible(TRUE);
}
}
@ -864,7 +873,7 @@ void LLPanelPermissions::refresh()
//if (objectp->permExport()) flag_mask |= PERM_EXPORT; // <FS:CR> OpenSim export permissions
getChild<LLUICtrl>("F:")->setValue("F:" + mask_to_string(flag_mask));
getChild<LLUICtrl>("F:")->setValue("F:" + mask_to_string(flag_mask, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("F:")->setVisible( TRUE);
}
else
@ -910,7 +919,7 @@ void LLPanelPermissions::refresh()
getChildView("checkbox allow everyone copy")->setEnabled(FALSE);
}
// <FS:CR> Opensim export permissions - Codeblock courtesy of Liru Færs.
// <FS:CR> Opensim export permissions - Codeblock courtesy of Liru F<EFBFBD>rs.
// Is this user allowed to toggle export on this object?
if (LFSimFeatureHandler::instance().simSupportsExport()
&& self_owned && mCreatorID == mOwnerID

View File

@ -54,6 +54,7 @@
#include "llexperiencecache.h"
#include "lltrans.h"
#include "llviewerregion.h"
#include "llviewernetwork.h" // <FS:Beq/> for gridmanager
// [RLVa:KB] - Checked: RLVa-2.0.1
#include "rlvactions.h"
#include "rlvcommon.h"
@ -610,27 +611,37 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
std::string perm_string;
// <FS:Beq> remove misleading X for export when not in OpenSim
bool isOpenSim {false};
#ifdef OPENSIM
if( LLGridManager::instance().isInOpenSim() )
{
isOpenSim = true;
}
#endif
// </FS:Beq>
perm_string = "B: ";
perm_string += mask_to_string(base_mask);
perm_string += mask_to_string(base_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("BaseMaskDebug")->setValue(perm_string);
perm_string = "O: ";
perm_string += mask_to_string(owner_mask);
perm_string += mask_to_string(owner_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("OwnerMaskDebug")->setValue(perm_string);
perm_string = "G";
perm_string += overwrite_group ? "*: " : ": ";
perm_string += mask_to_string(group_mask);
perm_string += mask_to_string(group_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("GroupMaskDebug")->setValue(perm_string);
perm_string = "E";
perm_string += overwrite_everyone ? "*: " : ": ";
perm_string += mask_to_string(everyone_mask);
perm_string += mask_to_string(everyone_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("EveryoneMaskDebug")->setValue(perm_string);
perm_string = "N";
perm_string += slam_perm ? "*: " : ": ";
perm_string += mask_to_string(next_owner_mask);
perm_string += mask_to_string(next_owner_mask, isOpenSim); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChild<LLUICtrl>("NextMaskDebug")->setValue(perm_string);
}
else

View File

@ -65,6 +65,7 @@
#include "lltextbase.h"
#include "llstring.h"
#include "lltrans.h"
#include "llviewernetwork.h" // <FS:Beq/> for gridmanager
// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a)
#include "llslurl.h"
#include "rlvhandler.h"
@ -638,21 +639,30 @@ void LLSidepanelTaskInfo::refresh()
if (gSavedSettings.getBOOL("DebugPermissions") )
{
// <FS:Beq> remove misleading X for export when not in OpenSim
bool isOpenSim {false};
#ifdef OPENSIM
if( LLGridManager::instance().isInOpenSim() )
{
isOpenSim = true;
}
#endif
// </FS:Beq>
if (valid_base_perms)
{
getChild<LLUICtrl>("B:")->setValue("B: " + mask_to_string(base_mask_on));
getChild<LLUICtrl>("B:")->setValue("B: " + mask_to_string(base_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("B:")->setVisible( TRUE);
getChild<LLUICtrl>("O:")->setValue("O: " + mask_to_string(owner_mask_on));
getChild<LLUICtrl>("O:")->setValue("O: " + mask_to_string(owner_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("O:")->setVisible( TRUE);
getChild<LLUICtrl>("G:")->setValue("G: " + mask_to_string(group_mask_on));
getChild<LLUICtrl>("G:")->setValue("G: " + mask_to_string(group_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("G:")->setVisible( TRUE);
getChild<LLUICtrl>("E:")->setValue("E: " + mask_to_string(everyone_mask_on));
getChild<LLUICtrl>("E:")->setValue("E: " + mask_to_string(everyone_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("E:")->setVisible( TRUE);
getChild<LLUICtrl>("N:")->setValue("N: " + mask_to_string(next_owner_mask_on));
getChild<LLUICtrl>("N:")->setValue("N: " + mask_to_string(next_owner_mask_on, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("N:")->setVisible( TRUE);
}
@ -662,7 +672,7 @@ void LLSidepanelTaskInfo::refresh()
if (objectp->permCopy()) flag_mask |= PERM_COPY;
if (objectp->permTransfer()) flag_mask |= PERM_TRANSFER;
getChild<LLUICtrl>("F:")->setValue("F:" + mask_to_string(flag_mask));
getChild<LLUICtrl>("F:")->setValue("F:" + mask_to_string(flag_mask, isOpenSim)); // <FS:Beq/> remove misleading X for export when not in OpenSim
getChildView("F:")->setVisible( TRUE);
}
else

View File

@ -1480,49 +1480,85 @@ class LLAdvancedDumpRegionObjectCache : public view_listener_t
}
};
class LLAdvancedInterestListFullUpdate : public view_listener_t
// <FS:Beq> Handle InterestListFullUpdate as a proper state toggle
// class LLAdvancedInterestListFullUpdate : public view_listener_t
// {
// bool handleEvent(const LLSD& userdata)
// {
// LLSD request;
// LLSD body;
// static bool using_360 = false;
// if (using_360)
// {
// body["mode"] = LLSD::String("default");
// }
// else
// {
// body["mode"] = LLSD::String("360");
// }
// using_360 = !using_360;
// if (gAgent.requestPostCapability("InterestList", body, [](const LLSD& response)
// {
// LL_INFOS("Int") <<
// "InterestList capability responded: \n" <<
// ll_pretty_print_sd(response) <<
// LL_ENDL;
// }))
// {
// LL_INFOS("360Capture") <<
// "Successfully posted an InterestList capability request with payload: \n" <<
// ll_pretty_print_sd(body) <<
// LL_ENDL;
// return true;
// }
// else
// {
// LL_INFOS("360Capture") <<
// "Unable to post an InterestList capability request with payload: \n" <<
// ll_pretty_print_sd(body) <<
// LL_ENDL;
// return false;
// }
// }
// };
class LLAdvancedCheckInterestListFullUpdate : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLSD request;
LLSD body;
static bool using_360 = false;
if (using_360)
LLViewerRegion* regionp = gAgent.getRegion();
if (regionp)
{
body["mode"] = LLSD::String("default");
bool current_value = ( regionp->mFullUpdateInUseCount > 0 );
return current_value;
}
else
{
body["mode"] = LLSD::String("360");
}
using_360 = !using_360;
if (gAgent.requestPostCapability("InterestList", body, [](const LLSD& response)
{
LL_INFOS("360Capture") <<
"InterestList capability responded: \n" <<
ll_pretty_print_sd(response) <<
LL_ENDL;
}))
{
LL_INFOS("360Capture") <<
"Successfully posted an InterestList capability request with payload: \n" <<
ll_pretty_print_sd(body) <<
LL_ENDL;
return true;
}
else
{
LL_INFOS("360Capture") <<
"Unable to post an InterestList capability request with payload: \n" <<
ll_pretty_print_sd(body) <<
LL_ENDL;
return false;
}
return false;
}
};
class LLAdvancedToggleInterestListFullUpdate : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLViewerRegion* regionp = gAgent.getRegion();
if (regionp)
{
bool current_value = ( regionp->mFullUpdateInUseCount > 0 );
if(current_value)
{
regionp->useFullUpdateInterestListMode(false, true);
return false;
}
else
{
regionp->useFullUpdateInterestListMode(true);
return true;
}
}
return false;
}
};
// </FS:Beq>
class LLAdvancedBuyCurrencyTest : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@ -12236,7 +12272,12 @@ void initialize_menus()
// Advanced > World
view_listener_t::addMenu(new LLAdvancedDumpScriptedCamera(), "Advanced.DumpScriptedCamera");
view_listener_t::addMenu(new LLAdvancedDumpRegionObjectCache(), "Advanced.DumpRegionObjectCache");
view_listener_t::addMenu(new LLAdvancedInterestListFullUpdate(), "Advanced.InterestListFullUpdate");
// <FS:Beq> Make InterestList a proper stateful toggle
// view_listener_t::addMenu(new LLAdvancedInterestListFullUpdate(), "Advanced.InterestListFullUpdate");
view_listener_t::addMenu(new LLAdvancedCheckInterestListFullUpdate(), "Advanced.CheckInterestListFullUpdate");
view_listener_t::addMenu(new LLAdvancedToggleInterestListFullUpdate(), "Advanced.ToggleInterestListFullUpdate");
// </FS:Beq>
// Advanced > UI
commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser

View File

@ -1728,6 +1728,7 @@ BOOL LLViewerRegion::isViewerCameraStatic()
void LLViewerRegion::killInvisibleObjects(F32 max_time)
{
if(sFSAreaSearchActive){ return; } // <FS:Beq/> FIRE-32668 Area Search improvements
if(!sVOCacheCullingEnabled)
{
return;
@ -3555,6 +3556,53 @@ void LLViewerRegion::logActiveCapabilities() const
log_capabilities(mImpl->mCapabilities);
}
// <FS:Beq> Area Search improvement
void LLViewerRegion::useFullUpdateInterestListMode(bool send_everything, bool force_update)
{
static const char *FSLogTag = "InterestListMode";
U32 previousCount = mFullUpdateInUseCount;
LLSD body;
LL_DEBUGS(FSLogTag) << "useFullUpdateInterestListMode" << " send_everything:" << send_everything << " inUse: " << mFullUpdateInUseCount << LL_ENDL;
if (send_everything)
{
body["mode"] = LLSD::String("360");
mFullUpdateInUseCount++; // we increment irrespective of the actual success as we're really just tracking the attempts.
}
else
{
if(mFullUpdateInUseCount > 0)
{
mFullUpdateInUseCount--; // see above.
}
if(force_update)
{
mFullUpdateInUseCount=0; // when we are forcing the off state then we need to clear the count to zero.
}
body["mode"] = LLSD::String("default");
}
if( force_update || ( send_everything && mFullUpdateInUseCount == 1 ) || ( ( !send_everything ) && mFullUpdateInUseCount == 0 && previousCount != 0) ) // Only send if this is the first enable or last disable.
{
if (gAgent.requestPostCapability("InterestList", body,
[](const LLSD &response)
{
LL_INFOS(FSLogTag) << "InterestList capability responded: \n"
<< ll_pretty_print_sd(response) << LL_ENDL;
}))
{
LL_INFOS(FSLogTag) << "Successfully posted an InterestList capability request with payload: \n"
<< ll_pretty_print_sd(body) << LL_ENDL;
}
else
{
LL_INFOS(FSLogTag) << "Unable to post an InterestList capability request with payload: \n"
<< ll_pretty_print_sd(body) << LL_ENDL;
}
}
LL_DEBUGS(FSLogTag) << "useFullUpdateInterestListMode" << " (AFTER): inUse: " << mFullUpdateInUseCount << LL_ENDL;
}
// </FS:Beq>
LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)
{
if (type < mImpl->mObjectPartition.size() && type < PARTITION_VO_CACHE)

View File

@ -351,7 +351,11 @@ public:
bool dynamicPathfindingEnabled() const;
bool avatarHoverHeightEnabled() const;
// <FS:Beq> Area search improvements
U32 mFullUpdateInUseCount {0};
void clearFullUpdateInterestList(){ LL_DEBUGS("InterestListMode") << "Resetting for previous region" << LL_ENDL; mFullUpdateInUseCount = 0; };
void useFullUpdateInterestListMode(bool full_update, bool force_update=false);
// </FS:Beq>
// </FS:CR>
#ifdef OPENSIM
std::set<std::string> getGods() { return mGodNames; };

View File

@ -383,6 +383,21 @@ void LLVOCacheEntry::updateDebugSettings()
LLMemory::updateMemoryInfo() ;
U32 allocated_mem = LLMemory::getAllocatedMemKB().value();
static const F32 KB_to_MB = 1.f / 1024.f;
// <FS:Beq> FIRE-32688 Area search and other visibility issues
// If this machine has limited RAM, then restore the LL defaults.
// So long as we have at least 8GB of RAM, then we will use our values.
if( LLMemory::getAvailableMemKB() * KB_to_MB < 8096 )
{
if( (U32)low_mem_bound_MB > 768 )
{
gSavedSettings.setU32("SceneLoadLowMemoryBound", 768);
}
if( (U32)high_mem_bound_MB > 2048 )
{
gSavedSettings.setU32("SceneLoadLowMemoryBound", 2048);
}
}
// </FS:Beq>
U32 clamped_memory = llclamp(allocated_mem * KB_to_MB, (F32) low_mem_bound_MB, (F32) high_mem_bound_MB);
const F32 adjust_range = high_mem_bound_MB - low_mem_bound_MB;
const F32 adjust_factor = (high_mem_bound_MB - clamped_memory) / adjust_range; // [0, 1]
@ -404,7 +419,11 @@ void LLVOCacheEntry::updateDebugSettings()
//the number of frames invisible objects stay in memory
static LLCachedControl<U32> inv_obj_time(gSavedSettings,"NonvisibleObjectsInMemoryTime");
static const U32 MIN_FRAMES = 10;
static const U32 MAX_FRAMES = 64;
// <FS:Beq> FIRE-32688 Area search and other visibility
// static const U32 MAX_FRAMES = 64;
// 64 frames for many users now is about a second. Having this as the longest we wait before purging leads to excessively aggressive purging.
static const U32 MAX_FRAMES = 1024;
// </FS:Beq>
const U32 clamped_frames = inv_obj_time ? llclamp((U32) inv_obj_time, MIN_FRAMES, MAX_FRAMES) : MAX_FRAMES; // [10, 64], with zero => 64
sMinFrameRange = MIN_FRAMES + ((clamped_frames - MIN_FRAMES) * adjust_factor);
}

View File

@ -1,17 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_translation_settings" title="Übersetzungseinstellungen für Chats">
<string name="bing_api_key_not_verified">
Bing-AppID nicht verifiziert. Versuchen Sie es erneut.
<string name="azure_api_key_not_verified">
Azure-Service-Identifikator nicht verifiziert. Versuchen Sie es erneut.
</string>
<string name="google_api_key_not_verified">
Google-API-Schlüssel nicht verifiziert. Versuchen Sie es erneut.
</string>
<string name="bing_api_key_verified">
Bing-AppID verifiziert.
<string name="deepl_api_key_not_verified">
DeepL-Authentifizierungsschlüssel nicht verifiziert. Versuchen Sie es erneut.
</string>
<string name="azure_api_key_verified">
Azure-Service-Identifikator verifiziert.
</string>
<string name="google_api_key_verified">
Google-API-Schlüssel verifiziert.
</string>
<string name="deepl_api_key_verified">
DeepL-Authentifizierungsschlüssel verifiziert.
</string>
<check_box label="Maschinenübersetzung beim Chatten aktivieren" name="translate_chat_checkbox"/>
<text name="translate_language_label">
Chat übersetzen in:
@ -39,19 +45,43 @@
Übersetzungsservice auswählen:
</text>
<radio_group name="translation_service_rg">
<radio_item initial_value="bing" label="Bing Translator" name="bing"/>
<radio_item initial_value="google" label="Google Translate" name="google"/>
<radio_item label="Azure Translator" name="bing"/>
<radio_item label="Google Translate" name="google"/>
<radio_item label="DeepL Translator" name="deepl"/>
</radio_group>
<text name="bing_api_key_label">
Bing-[http://www.bing.com/developers/createapp.aspx AppID]:
<text name="google_links_text">
[https://learn.microsoft.com/de-de/azure/cognitive-services/translator/create-translator-resource Einrichtung]
</text>
<button label="Verifizieren" name="verify_bing_api_key_btn"/>
<text name="azure_api_endoint_label">
Endpunkt:
</text>
<text name="azure_api_key_label">
Azure-Key:
</text>
<line_editor default_text="API-Key eingeben &amp; &quot;Verifizieren&quot;" name="azure_api_key"/>
<text name="azure_api_region_label">
Region:
</text>
<line_editor default_text="Optional für globale Dienste" name="azure_api_region"/>
<button label="Verifizieren" name="verify_azure_api_key_btn"/>
<text name="google_api_key_label">
Google-[http://code.google.com/apis/language/translate/v2/getting_started.html#auth API-Schlüssel]:
Google-[http://code.google.com/apis/language/translate/v2/getting_started.html#auth API-Key]:
</text>
<line_editor default_text="API-Key eingeben &amp; &quot;Verifizieren&quot;" name="google_api_key"/>
<button label="Verifizieren" name="verify_google_api_key_btn"/>
<text name="google_links_text">
[http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Statistik]
[http://code.google.com/apis/language/translate/v2/pricing.html Preise] | [https://code.google.com/apis/console Statistik]
</text>
<text name="deepl_api_domain_label">
Endpunkt:
</text>
<text name="deepl_api_key_label">
DeepL-API-Key:
</text>
<line_editor default_text="API-Key eingeben &amp; &quot;Verifizieren&quot;" name="deepl_api_key"/>
<button label="Verifizieren" name="verify_deepl_api_key_btn"/>
<text name="deepl_links_text">
[https://www.deepl.com/pro/select-country?cta=header-prices Preise]
</text>
<button label="OK" name="ok_btn"/>
<button label="Abbrechen" name="cancel_btn"/>

View File

@ -553,7 +553,7 @@
<menu_item_check label="Sonnen-Override für Sim" name="Sim Sun Override"/>
<menu_item_check label="Festgelegtes Wetter" name="Fixed Weather"/>
<menu_item_call label="Regionsobjekt-Cache ausgeben" name="Dump Region Object Cache"/>
<menu_item_call label="Interest-Liste: Vollständiges Update" name="Interest List: Full Update"/>
<menu_item_check label="Interest-Liste: Vollständiges Update" name="Interest List: Full Update"/>
<menu_item_call label="Simulator-Features ausgeben" name="DumpSimFeaturesToChat"/>
</menu>
<menu label="UI" name="UI">

View File

@ -4756,13 +4756,15 @@
function="Advanced.DumpRegionObjectCache" />
</menu_item_call>
<menu_item_call
<menu_item_check
label="Interest List: Full Update"
name="Interest List: Full Update"
shortcut="alt|shift|I">
<menu_item_call.on_click
function="Advanced.InterestListFullUpdate" />
</menu_item_call>
<menu_item_check.on_check
function="Advanced.CheckInterestListFullUpdate" />
<menu_item_check.on_click
function="Advanced.ToggleInterestListFullUpdate" />
</menu_item_check>
<menu_item_call
label="Dump Simulator Features to Nearby Chat"
name="DumpSimFeaturesToChat">

View File

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_translation_settings" title="Paramètres de traduction automatique">
<string name="bing_api_key_not_verified">appID Bing incorrect. Veuillez réessayer.</string>
<string name="google_api_key_not_verified">Google API key incorrecte. Veuillez réessayer.</string>
<string name="bing_api_key_verified">Bing appID vérifié.</string>
<string name="google_api_key_verified">Google API key vérifiée.</string>
<string name="azure_api_key_not_verified">Identifiant du service Azure non vérifié. Statut : [STATUS]. Veuillez vérifier vos paramètres et réessayer.</string>
<string name="google_api_key_not_verified">Clé API Google non vérifiée. Statut : [STATUS]. Veuillez vérifier votre clé et réessayer.</string>
<string name="deepl_api_key_not_verified">Clé DeepL Auth Key non vérifiée. Statut : [STATUS]. Veuillez vérifier votre clé et réessayer.</string>
<string name="azure_api_key_verified">Identifiant du service Azure vérifié.</string>
<string name="google_api_key_verified">Clé Google API vérifiée.</string>
<string name="deepl_api_key_verified">Clé d'API DeepL vérifiée.</string>
<check_box label="Activer la traduction automatique pendant que je discute" name="translate_chat_checkbox"/>
<text name="translate_language_label">Traduire le chat en :</text>
<combo_box name="translate_language_combo">
@ -27,16 +29,31 @@
</combo_box>
<text name="tip">Sélectionnez le service de traduction automatique :</text>
<radio_group name="translation_service_rg">
<radio_item label="Bing Translator" name="bing"/>
<radio_item label="Azure Translator" name="azure"/>
<radio_item label="Google Translate" name="google"/>
<radio_item label="DeepL Translate" name="deepl"/>
</radio_group>
<text name="bing_api_key_label">Bing [http://www.bing.com/developers/createapp.aspx AppID] :</text>
<line_editor default_text="Saisissez votre Bing AppID" name="bing_api_key"/>
<button label="Vérification" name="verify_bing_api_key_btn"/>
<text name="google_links_text">
[https://learn.microsoft.com/en-us/azure/cognitive-services/translator/create-translator-resource Guide]</text>
<text name="azure_api_endoint_label">Point final :</text>
<text name="azure_api_key_label">Clé Azure :</text>
<line_editor default_text="Entrez la clé du traducteur et cliquez sur &quot;Vérifier&quot;" name="azure_api_key"/>
<text name="azure_api_region_label">Région :</text>
<line_editor default_text="Peut être laissé vide pour les services globaux" name="azure_api_region"/>
<button label="Vérifier" name="verify_azure_api_key_btn"/>
<text name="google_api_key_label">Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key] :</text>
<line_editor default_text="Saisissez votre Google API key" name="google_api_key"/>
<button label="Vérification" name="verify_google_api_key_btn"/>
<text name="google_links_text">[http://code.google.com/apis/language/translate/v2/pricing.html Prix] | [https://code.google.com/apis/console Stats] </text>
<text name="deepl_api_domain_label">Point final :</text>
<combo_box name="deepl_api_domain_combo">
<combo_box.item label="DeepL gratuit" name="global"/>
<combo_box.item label="DeepL Pro" name="api-apc"/>
</combo_box>
<text name="deepl_api_key_label">Clé dAPI DeepL :</text>
<line_editor default_text="Entrez la clé de l'API DeepL et cliquez sur &quot;Vérifier&quot;" name="deepl_api_key"/>
<button label="Vérifier" name="verify_deepl_api_key_btn"/>
<text name="deepl_links_text">[https://www.deepl.com/pro/select-country?cta=header-prices Tarifs]</text>
<button label="OK" name="ok_btn"/>
<button label="Annuler" name="cancel_btn"/>
</floater>

View File

@ -494,7 +494,7 @@
<menu_item_check label="Ignorer les paramètres du soleil de la sim" name="Sim Sun Override"/>
<menu_item_check label="Météo fixe" name="Fixed Weather"/>
<menu_item_call label="Vidage de cache d&apos;objets de la région" name="Dump Region Object Cache"/>
<menu_item_call label="Liste d'intérêt : Mise à jour complète" name="Interest List: Full Update"/>
<menu_item_check label="Liste d'intérêt : Mise à jour complète" name="Interest List: Full Update"/>
<menu_item_call label="Envoie les fonctionnalités du simulateur dans le chat local" name="DumpSimFeaturesToChat"/>
</menu>
<menu label="Interface" name="UI">

View File

@ -2597,6 +2597,9 @@ Voulez-vous les jouer ?
Votre corbeille déborde. Cela risque de provoquer des problèmes lors de la connexion.
<usetemplate name="okcancelbuttons" notext="Je viderai la corbeille plus tard" yestext="Vérifier le dossier Corbeille"/>
</notification>
<notification name="InventoryLimitReachedAIS">
Votre inventaire rencontre des problèmes. Veuillez contacter le support de votre grille.
</notification>
<notification name="ConfirmClearBrowserCache">
Êtes-vous certain de vouloir supprimer l&apos;historique de vos visites et recherches ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>

View File

@ -9,12 +9,26 @@
<string name="status_unknown">
Inconnu
</string>
<string name="BadgeBeta" value="Bêta-testeur originel" />
<string name="BadgeBetaLifetime" value="Membre Beta à vie" />
<string name="BadgeLifetime" value="Membre à vie" />
<string name="BadgeLinden" value="Employé(e) de Linden Lab" />
<string name="BadgePremiumLifetime" value="Premium à vie" />
<string name="BadgePremiumPlusLifetime" value="Premium Plus à vie" />
<string name="BadgeTeam" value="membre de [APP_NAME]" />
<string name="payment_update_link_url">
http://www.secondlife.com/account/billing.php?lang=fr
</string>
<string name="partner_edit_link_url">
http://www.secondlife.com/account/partners.php?lang=fr
</string>
<string name="no_partner_text" value="Aucun"/>
<string name="no_group_text" value="Aucun"/>
<string name="FSDev" value="Développeur"/>
<string name="FSSupp" value="Assistance"/>
<string name="FSQualityAssurance" value="Suivi des anomalies"/>
<string name="FSGW" value="Portail"/>
<string name="texture_picker_label" value="Photo du profil" />
<text name="name_label" value="Nom :"/>
<panel name="name_holder">
<text_editor name="complete_name" value="(en cours de chargement...)"/>
@ -37,6 +51,11 @@
<text name="label" value="Date de naissance:"/>
<text_editor name="user_age" value="(en cours de chargement...)"/>
<text name="label2" value="Compte :"/>
<layout_stack name="badgepositioner">
<layout_panel name="badge_layout">
<icon name="badge_icon" tool_tip="Employé(e) Linden Lab" />
</layout_panel>
</layout_stack>
<text name="partner_label" value="Partenaire :"/>
</layout_panel>
</layout_stack>

View File

@ -542,7 +542,7 @@
<menu_item_check label="Domyślne ustawienia otoczenia Regionu" name="Sim Sun Override"/>
<menu_item_check label="Ustalona pogoda" name="Fixed Weather"/>
<menu_item_call label="Zrzut buforu pamięci obiektów regionu" name="Dump Region Object Cache"/>
<menu_item_call label="Interest List: Pełne odświeżenie" name="Interest List: Full Update"/>
<menu_item_check label="Interest List: Pełne odświeżenie" name="Interest List: Full Update"/>
<menu_item_call label="Zrzut właściwości symulatora do czatu w pobliżu" name="DumpSimFeaturesToChat"/>
</menu>
<menu label="Interfejs" name="UI">

View File

@ -9,7 +9,7 @@
<string name="BadgeLinden" value="Pracownik Linden Lab" />
<string name="BadgePremiumLifetime" value="Dożywotni uczestnik Premium" />
<string name="BadgePremiumPlusLifetime" value="Dożywotni uczestnik Premium Plus" />
<string name="BadgeTeam" value="Zespół [APP_NAME]" />
<string name="BadgeTeam" value="Zespół [APP_NAME]a" />
<string name="no_partner_text" value="Brak" />
<string name="no_group_text" value="Brak" />
<string name="FSDev" value=" Programista" />

View File

@ -1,58 +1,90 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_translation_settings" title="Настройки перевода чата">
<string name="bing_api_key_not_verified">
Bing appID не подтвержден. Повторите попытку.
<string name="azure_api_key_not_verified">
Идентификатор службы Azure не подтвержден. Статус: [STATUS]. Проверьте ваши настройки и повторите попытку.
</string>
<string name="google_api_key_not_verified">
Ключ Google API не подтвержден. Повторите попытку.
Ключ API Google не подтвержден. Статус: [STATUS]. Проверьте свой ключ и повторите попытку.
</string>
<string name="bing_api_key_verified">
Bing appID подтвержден.
<string name="deepl_api_key_not_verified">
Ключ API DeepL не подтвержден. Статус: [STATUS]. Проверьте свой ключ и повторите попытку.
</string>
<string name="azure_api_key_verified">
Идентификатор службы Azure подтвержден.
</string>
<string name="google_api_key_verified">
Ключ Google API подтвержден.
Ключ API Google подтвержден.
</string>
<check_box label="Включить машинный перевод при чате" name="translate_chat_checkbox"/>
<string name="deepl_api_key_verified">
Ключ API DeepL подтвержден.
</string>
<check_box label="Включить машинный перевод во время чата" name="translate_chat_checkbox"/>
<text name="translate_language_label">
Переводить чат на:
</text>
<combo_box name="translate_language_combo">
<combo_box.item label="язык системы" name="System Default Language"/>
<combo_box.item label="английский" name="English"/>
<combo_box.item label="датский" name="Danish"/>
<combo_box.item label="немецкий" name="German"/>
<combo_box.item label="испанский" name="Spanish"/>
<combo_box.item label="французский" name="French"/>
<combo_box.item label="итальянский" name="Italian"/>
<combo_box.item label="венгерский" name="Hungarian"/>
<combo_box.item label="нидерландский" name="Dutch"/>
<combo_box.item label="польский" name="Polish"/>
<combo_box.item label="португальский" name="Portugese"/>
<combo_box.item label="русский" name="Russian"/>
<combo_box.item label="турецкий" name="Turkish"/>
<combo_box.item label="украинский" name="Ukrainian"/>
<combo_box.item label="китайский" name="Chinese"/>
<combo_box.item label="японский" name="Japanese"/>
<combo_box.item label="корейский" name="Korean"/>
<combo_box.item label="По умолчанию системы" name="System Default Language"/>
<combo_box.item label="Английский" name="English"/>
<combo_box.item label="Dansk (Датский)" name="Danish"/>
<combo_box.item label="Deutsch (Немецкий)" name="German"/>
<combo_box.item label="Español (Испанский)" name="Spanish"/>
<combo_box.item label="Français (Французский)" name="French"/>
<combo_box.item label="Italiano (Итальянский)" name="Italian"/>
<combo_box.item label="Magyar (Венгерский)" name="Hungarian"/>
<combo_box.item label="Nederlands (Голландский)" name="Dutch"/>
<combo_box.item label="Polski (Польский)" name="Polish"/>
<combo_box.item label="Português (Португальский)" name="Portugese"/>
<combo_box.item label="Русский (Русский)" name="Russian"/>
<combo_box.item label="Türkçe (Турецкий)" name="Turkish"/>
<combo_box.item label="Українська (Украинский)" name="Ukrainian"/>
<combo_box.item label="中文 (正體) (Китайский)" name="Chinese"/>
<combo_box.item label="日本語 (Японский)" name="Japanese"/>
<combo_box.item label="한국어 (Корейский)" name="Korean"/>
</combo_box>
<text name="tip">
Выберите сервис перевода:
</text>
<radio_group name="translation_service_rg">
<radio_item initial_value="bing" label="Bing Translator" name="bing"/>
<radio_item initial_value="google" label="Google Translate" name="google"/>
<radio_item label="Переводчик Azure" name="azure" />
<radio_item label="Переводчик Google" name="google"/>
<radio_item label="Переводчик DeepL" name="deepl"/>
</radio_group>
<text name="bing_api_key_label">
Bing [http://www.bing.com/developers/createapp.aspx AppID]:
<text name="google_links_text">
[https://learn.microsoft.com/en-us/azure/cognitive-services/translator/create-translator-resource Установка]
</text>
<button label="Подтвердить" name="verify_bing_api_key_btn"/>
<text name="azure_api_endoint_label">
Конечная точка:
</text>
<text name="azure_api_key_label">
Ключ Azure:
</text>
<line_editor default_text="Введите ключ Переводчика и нажмите &quot;Проверить&quot;" name="azure_api_key"/>
<text name="azure_api_region_label">
Регион:
</text>
<line_editor default_text="Можно оставить пустым для глобальных служб" name="azure_api_region"/>
<button label="Проверить" name="verify_azure_api_key_btn"/>
<text name="google_api_key_label">
Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Ключ API]:
</text>
<button label="Подтвердить" name="verify_google_api_key_btn"/>
<line_editor default_text="Введите ключ API Google и нажмите &quot;Проверить&quot;" name="google_api_key"/>
<button label="Проверить" name="verify_google_api_key_btn"/>
<text name="google_links_text">
[http://code.google.com/apis/language/translate/v2/pricing.html Цены] | [https://code.google.com/apis/console Статистика]
</text>
<text name="deepl_api_domain_label">
Конечная точка:
</text>
<combo_box name="deepl_api_domain_combo">
<combo_box.item label="DeepL Free" name="global"/>
<combo_box.item label="DeepL Pro" name="api-apc"/>
</combo_box>
<text name="deepl_api_key_label">
API DeepL ключ:
</text>
<line_editor default_text="Введите ключ API DeepL и нажмите &quot;Проверить&quot;" name="deepl_api_key"/>
<button label="Проверить" name="verify_deepl_api_key_btn"/>
<text name="deepl_links_text">[https://www.deepl.com/pro/select-country?cta=header-prices Цены]</text>
<button label="OK" name="ok_btn"/>
<button label="Отмена" name="cancel_btn"/>
</floater>

View File

@ -583,6 +583,7 @@
<menu_item_check label="Перекрытие солнца в симуляторе" name="Sim Sun Override"/>
<menu_item_check label="Фиксированная погода" name="Fixed Weather"/>
<menu_item_call label="Дамп кэша объектов региона" name="Dump Region Object Cache"/>
<menu_item_check label="Список интересов: полное обновление" name="Interest List: Full Update"/>
<menu_item_call label="Дамп возможностей симулятора в общий чат" name="DumpSimFeaturesToChat"/>
</menu>
<menu label="Интерфейс пользователя" name="UI">

View File

@ -2536,6 +2536,9 @@
Ваша корзина переполнена. Это может вызвать проблемы при входе.
<usetemplate name="okcancelbuttons" notext="Я очищу корзину позже" yestext="Очистить корзину сейчас"/>
</notification>
<notification name="InventoryLimitReachedAIS">
В вашем инвентаре возникли проблемы. Пожалуйста, обратитесь в службу поддержки вашей сетки.
</notification>
<notification name="ConfirmClearBrowserCache">
Вы действительно хотите удалить журнал своих перемещений, веб-страниц и поиска?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>

View File

@ -3,6 +3,13 @@
<string name="status_online">В сети</string>
<string name="status_offline">Не в сети</string>
<string name="status_unknown">Неизвестно</string>
<string name="BadgeBeta" value="Оригинальный бета-тестер" />
<string name="BadgeBetaLifetime" value="Участник бета-версии пожизненно" />
<string name="BadgeLifetime" value="Член пожизненно" />
<string name="BadgeLinden" value="Сотрудник лаборатории Линден" />
<string name="BadgePremiumLifetime" value="Премиум пожизненно" />
<string name="BadgePremiumPlusLifetime" value="Премиум Плюс пожизненно" />
<string name="BadgeTeam" value="Член [APP_NAME]" />
<string name="no_partner_text" value="Никто"/>
<string name="no_group_text" value="Никто"/>
<string name="FSDev" value=" Разработчик"/>
@ -31,6 +38,11 @@
<text name="label" value="Возраст:"/>
<text_editor name="user_age" value="(загрузка...)"/>
<text name="label2" value="Аккаунт:"/>
<layout_stack name="badgepositioner">
<layout_panel name="badge_layout">
<icon name="badge_icon" tool_tip="Сотрудник лаборатории Линден"/>
</layout_panel>
</layout_stack>
<text name="partner_label" value="Партнер:"/>
</layout_panel>
</layout_stack>

View File

@ -9,7 +9,7 @@
<string name="BadgeLinden" value="Pracownik Linden Lab" />
<string name="BadgePremiumLifetime" value="Dożywotni uczestnik Premium" />
<string name="BadgePremiumPlusLifetime" value="Dożywotni uczestnik Premium Plus" />
<string name="BadgeTeam" value="Zespół [APP_NAME]" />
<string name="BadgeTeam" value="Zespół [APP_NAME]a" />
<string name="no_partner_text" value="Brak" />
<string name="no_group_text" value="Brak" />
<string name="age_format">

View File

@ -3,6 +3,13 @@
<string name="status_online">В сети</string>
<string name="status_offline">Не в сети</string>
<string name="status_unknown">Неизвестно</string>
<string name="BadgeBeta" value="Оригинальный бета-тестер" />
<string name="BadgeBetaLifetime" value="Участник бета-версии пожизненно" />
<string name="BadgeLifetime" value="Член пожизненно" />
<string name="BadgeLinden" value="Сотрудник лаборатории Линден" />
<string name="BadgePremiumLifetime" value="Премиум пожизненно" />
<string name="BadgePremiumPlusLifetime" value="Премиум Плюс пожизненно" />
<string name="BadgeTeam" value="Член [APP_NAME]" />
<string name="no_partner_text" value="Нет" />
<string name="no_group_text" value="Нет" />
<string name="age_format">