diff --git a/.hgtags b/.hgtags index b0da8b0d987f003ea3e50ff9d9fb28482d18013f..4823c0550472b3c91392eb1c7bd9478a7ffa3766 100755 --- a/.hgtags +++ b/.hgtags @@ -546,3 +546,4 @@ ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release 21b7604680ef6b6ea67f8bebaaa588d6e263bdc1 6.0.1-release a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release 50f0ece62ddb5a244ecb6d00ef5a89d80ad50efa 6.1.1-release +82a89165e5929a6c3073d6cd60a543cb395f147b 6.2.0-release diff --git a/doc/contributions.txt b/doc/contributions.txt index cfc98584bcf8978e231fa73c4f78a580b775fb4a..4e9255925676b127dc7e7a1be3769cbab49d6b7b 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -222,6 +222,7 @@ Ansariel Hiller MAINT-8085 MAINT-8723 SL-10385 + SL-10891 Aralara Rajal Arare Chantilly CHUIBUG-191 diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index a0c87b65ccb4133d7f699eac22aaf6722596a488..c13f39df9bda93e0cc263e72e1e3cc24252840d5 100644 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -169,7 +169,7 @@ const U32 ESTATE_ACCESS_MANAGER_REMOVE = 1U << 9; const U32 ESTATE_ACCESS_NO_REPLY = 1U << 10; const U32 ESTATE_ACCESS_FAILED_BAN_ESTATE_MANAGER = 1U << 11; -const S32 ESTATE_MAX_MANAGERS = 10; +const S32 ESTATE_MAX_MANAGERS = 15; const S32 ESTATE_MAX_ACCESS_IDS = 500; // max for access, banned const S32 ESTATE_MAX_GROUP_IDS = (S32) ESTATE_ACCESS_MAX_ENTRIES_PER_PACKET; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index ee8c445afb0a687796ba6138471f5f9117126e44..f1914ee9c559e54c600f0355ea78e7cfc585d151 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -503,6 +503,13 @@ void LLLineEditor::setCursorToEnd() deselect(); } +void LLLineEditor::resetScrollPosition() +{ + mScrollHPos = 0; + // make sure cursor says in visible range + setCursor(getCursor()); +} + BOOL LLLineEditor::canDeselect() const { return hasSelection(); @@ -1685,42 +1692,37 @@ void LLLineEditor::doDelete() void LLLineEditor::drawBackground() { - F32 alpha = getCurrentTransparency(); - if (mUseBgColor) + bool has_focus = hasFocus(); + LLUIImage* image; + if ( mReadOnly ) + { + image = mBgImageDisabled; + } + else if ( has_focus || mShowImageFocused) { - gl_rect_2d(getLocalRect(), mBgColor % alpha, TRUE); + image = mBgImageFocused; } else { - bool has_focus = hasFocus(); - LLUIImage* image; - if (mReadOnly) - { - image = mBgImageDisabled; - } - else if (has_focus || mShowImageFocused) - { - image = mBgImageFocused; - } - else - { - image = mBgImage; - } + image = mBgImage; + } - if (!image) return; - // optionally draw programmatic border - if (has_focus) - { - LLColor4 tmp_color = gFocusMgr.getFocusColor(); - tmp_color.setAlpha(alpha); - image->drawBorder(0, 0, getRect().getWidth(), getRect().getHeight(), - tmp_color, - gFocusMgr.getFocusFlashWidth()); - } - LLColor4 tmp_color = UI_VERTEX_COLOR; + if (!image) return; + + F32 alpha = getCurrentTransparency(); + + // optionally draw programmatic border + if (has_focus) + { + LLColor4 tmp_color = gFocusMgr.getFocusColor(); tmp_color.setAlpha(alpha); - image->draw(getLocalRect(), tmp_color); + image->drawBorder(0, 0, getRect().getWidth(), getRect().getHeight(), + tmp_color, + gFocusMgr.getFocusFlashWidth()); } + LLColor4 tmp_color = UI_VERTEX_COLOR; + tmp_color.setAlpha(alpha); + image->draw(getLocalRect(), tmp_color); } void LLLineEditor::draw() diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index a711ccefab81c4e5b08fbbc4bde2354a8c17a4c9..aa5779d45f64838e16cbc0fae86a3fab8e6ad1e2 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -210,6 +210,9 @@ class LLLineEditor void setCursor( S32 pos ); void setCursorToEnd(); + // set scroll to earliest position it can reasonable set + void resetScrollPosition(); + // Selects characters 'start' to 'end'. void setSelection(S32 start, S32 end); virtual void getSelectionRange(S32 *position, S32 *length) const; diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index f6831c6d5ec52624829e23fd47223354bb958158..ce3fc29d32721a4b147a7d67548b9dc0280f908d 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -290,6 +290,7 @@ void LLSpinCtrl::forceSetValue(const LLSD& value ) LLF32UICtrl::setValue(value); updateEditor(); + mEditor->resetScrollPosition(); } } @@ -355,7 +356,9 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data ) if( success ) { - updateEditor(); + // We commited and clamped value + // try to display as much as possible + mEditor->resetScrollPosition(); } else { @@ -475,6 +478,7 @@ BOOL LLSpinCtrl::handleKeyHere(KEY key, MASK mask) // text editors don't support revert normally (due to user confusion) // but not allowing revert on a spinner seems dangerous updateEditor(); + mEditor->resetScrollPosition(); mEditor->setFocus(FALSE); return TRUE; } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7739feb41905725847699640877c0eb9b49be494..02b6271e5a8763ce5a42e65256c4fce3745c5b5e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -217,6 +217,7 @@ set(viewer_SOURCE_FILES llfloateravatarpicker.cpp llfloateravatarrendersettings.cpp llfloateravatartextures.cpp + llfloaterbanduration.cpp llfloaterbeacons.cpp llfloaterbigpreview.cpp llfloaterbuildoptions.cpp @@ -841,6 +842,7 @@ set(viewer_HEADER_FILES llfloateravatarpicker.h llfloateravatarrendersettings.h llfloateravatartextures.h + llfloaterbanduration.h llfloaterbeacons.h llfloaterbigpreview.h llfloaterbuildoptions.h diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 6abaeb2f90723ba328101fc117a1f19e93407e47..ca06394388d6b01813d8b1a3da0749e5f73ef661 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.2.0 +6.2.2 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 394df72068958adecd8f0bd14faecebd2ae06f40..fd4c2917d52b5c4443ea85ae6e7d123148bd6d4f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -16413,6 +16413,17 @@ <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> + </map> </map> </llsd> diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index e8da45816858395920ee71e215a748a0ccda5053..4fdb86059286b13d4b12ec5fc665182b40b0dd4d 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -34,101 +34,15 @@ // viewer #include "llagent.h" +#include "llfloaterregioninfo.h" // for invoice id #include "llviewerregion.h" -#include "llcorehttputil.h" - -//========================================================================= -namespace -{ - class LLDispatchEstateUpdateInfo : public LLDispatchHandler - { - public: - LLDispatchEstateUpdateInfo() {} - virtual ~LLDispatchEstateUpdateInfo() {} - virtual bool operator()(const LLDispatcher* dispatcher, const std::string& key, - const LLUUID& invoice, const sparam_t& strings) - { - // key = "estateupdateinfo" - // strings[0] = estate name - // strings[1] = str(owner_id) - // strings[2] = str(estate_id) - // strings[3] = str(estate_flags) - // strings[4] = str((S32)(sun_hour * 1024)) - // strings[5] = str(parent_estate_id) - // strings[6] = str(covenant_id) - // strings[7] = str(covenant_timestamp) - // strings[8] = str(send_to_agent_only) - // strings[9] = str(abuse_email_addr) - - LL_DEBUGS("ESTATEINFOM") << "Received estate update" << LL_ENDL; - - // Update estate info model. - // This will call LLPanelEstateInfo::refreshFromEstate(). - // *TODO: Move estate message handling stuff to llestateinfomodel.cpp. - LLEstateInfoModel::instance().updateEstateInfo(strings); - - return true; - } - }; - - class LLDispatchSetEstateAccess : public LLDispatchHandler - { - public: - LLDispatchSetEstateAccess() {} - virtual ~LLDispatchSetEstateAccess() {} - virtual bool operator()( - const LLDispatcher* dispatcher, const std::string& key, - const LLUUID& invoice, const sparam_t& strings) - { - // key = "setaccess" - // strings[0] = str(estate_id) - // strings[1] = str(packed_access_lists) - // strings[2] = str(num allowed agent ids) - // strings[3] = str(num allowed group ids) - // strings[4] = str(num banned agent ids) - // strings[5] = str(num estate manager agent ids) - // strings[6] = bin(uuid) - // strings[7] = bin(uuid) - // strings[8] = bin(uuid) - // ... - - LLEstateInfoModel::instance().updateAccessInfo(strings); - - return true; - } - - }; - - class LLDispatchSetEstateExperience : public LLDispatchHandler - { - public: - virtual bool operator()(const LLDispatcher* dispatcher, const std::string& key, - const LLUUID& invoice, const sparam_t& strings) - { - // key = "setexperience" - // strings[0] = str(estate_id) - // strings[1] = str(send_to_agent_only) - // strings[2] = str(num blocked) - // strings[3] = str(num trusted) - // strings[4] = str(num allowed) - // strings[8] = bin(uuid) ... - // ... - - LLEstateInfoModel::instance().updateExperienceInfo(strings); - - return true; - } - - }; -} +#include "llcorehttputil.h" -//========================================================================= -LLEstateInfoModel::LLEstateInfoModel(): - mID(0), - mFlags(0), - mSunHour(0), - mRegion(nullptr) +LLEstateInfoModel::LLEstateInfoModel() +: mID(0) +, mFlags(0) +, mSunHour(0) { } @@ -137,52 +51,40 @@ boost::signals2::connection LLEstateInfoModel::setUpdateCallback(const update_si return mUpdateSignal.connect(cb); } -boost::signals2::connection LLEstateInfoModel::setUpdateAccessCallback(const update_flaged_signal_t::slot_type& cb) -{ - return mUpdateAccess.connect(cb); -} - -boost::signals2::connection LLEstateInfoModel::setUpdateExperienceCallback(const update_signal_t::slot_type& cb) -{ - return mUpdateExperience.connect(cb); -} - boost::signals2::connection LLEstateInfoModel::setCommitCallback(const update_signal_t::slot_type& cb) { return mCommitSignal.connect(cb); } -void LLEstateInfoModel::setRegion(LLViewerRegion* region) -{ - if (region != mRegion) - { - mRegion = region; - - if (mRegion) - { - nextInvoice(); - sendEstateOwnerMessage("getinfo", strings_t()); - } - } -} - - -void LLEstateInfoModel::clearRegion() -{ - mRegion = nullptr; -} - void LLEstateInfoModel::sendEstateInfo() { if (!commitEstateInfoCaps()) { // the caps method failed, try the old way - nextInvoice(); + LLFloaterRegionInfo::nextInvoice(); commitEstateInfoDataserver(); } } -void LLEstateInfoModel::updateEstateInfo(const strings_t& strings) +bool LLEstateInfoModel::getUseFixedSun() const { return getFlag(REGION_FLAGS_SUN_FIXED); } +bool LLEstateInfoModel::getIsExternallyVisible() const { return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE); } +bool LLEstateInfoModel::getAllowDirectTeleport() const { return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } +bool LLEstateInfoModel::getDenyAnonymous() const { return getFlag(REGION_FLAGS_DENY_ANONYMOUS); } +bool LLEstateInfoModel::getDenyAgeUnverified() const { return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED); } +bool LLEstateInfoModel::getAllowVoiceChat() const { return getFlag(REGION_FLAGS_ALLOW_VOICE); } +bool LLEstateInfoModel::getAllowAccessOverride() const { return getFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE); } +bool LLEstateInfoModel::getAllowEnvironmentOverride() const { return getFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE); } + +void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); } +void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); } +void LLEstateInfoModel::setAllowDirectTeleport(bool val) { setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, val); } +void LLEstateInfoModel::setDenyAnonymous(bool val) { setFlag(REGION_FLAGS_DENY_ANONYMOUS, val); } +void LLEstateInfoModel::setDenyAgeUnverified(bool val) { setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED, val); } +void LLEstateInfoModel::setAllowVoiceChat(bool val) { setFlag(REGION_FLAGS_ALLOW_VOICE, val); } +void LLEstateInfoModel::setAllowAccessOverride(bool val) { setFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE, val); } +void LLEstateInfoModel::setAllowEnvironmentOverride(bool val) { setFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE, val); } + +void LLEstateInfoModel::update(const strings_t& strings) { // NOTE: LLDispatcher extracts strings with an extra \0 at the // end. If we pass the std::string direct to the UI/renderer @@ -193,10 +95,10 @@ void LLEstateInfoModel::updateEstateInfo(const strings_t& strings) mFlags = strtoul(strings[3].c_str(), NULL, 10); mSunHour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f; - LL_DEBUGS("ESTATEINFOM") << "Received estate info: " + LL_DEBUGS("WindlightSync") << "Received estate info: " << "is_sun_fixed = " << getUseFixedSun() << ", sun_hour = " << getSunHour() << LL_ENDL; - LL_DEBUGS("ESTATEINFOM") << getInfoDump() << LL_ENDL; + LL_DEBUGS() << getInfoDump() << LL_ENDL; // Update region owner. LLViewerRegion* regionp = gAgent.getRegion(); @@ -206,205 +108,20 @@ void LLEstateInfoModel::updateEstateInfo(const strings_t& strings) mUpdateSignal(); } -void LLEstateInfoModel::updateAccessInfo(const strings_t& strings) -{ - S32 index = 1; // skip estate_id - U32 access_flags = strtoul(strings[index++].c_str(), NULL, 10); - S32 num_allowed_agents = strtol(strings[index++].c_str(), NULL, 10); - S32 num_allowed_groups = strtol(strings[index++].c_str(), NULL, 10); - S32 num_banned_agents = strtol(strings[index++].c_str(), NULL, 10); - S32 num_estate_managers = strtol(strings[index++].c_str(), NULL, 10); - - // sanity ckecks - if (num_allowed_agents > 0 - && !(access_flags & ESTATE_ACCESS_ALLOWED_AGENTS)) - { - LL_WARNS("ESTATEINFOM") << "non-zero count for allowed agents, but no corresponding flag" << LL_ENDL; - } - if (num_allowed_groups > 0 - && !(access_flags & ESTATE_ACCESS_ALLOWED_GROUPS)) - { - LL_WARNS("ESTATEINFOM") << "non-zero count for allowed groups, but no corresponding flag" << LL_ENDL; - } - if (num_banned_agents > 0 - && !(access_flags & ESTATE_ACCESS_BANNED_AGENTS)) - { - LL_WARNS("ESTATEINFOM") << "non-zero count for banned agents, but no corresponding flag" << LL_ENDL; - } - if (num_estate_managers > 0 - && !(access_flags & ESTATE_ACCESS_MANAGERS)) - { - LL_WARNS("ESTATEINFOM") << "non-zero count for managers, but no corresponding flag" << LL_ENDL; - } - - // grab the UUID's out of the string fields - if (access_flags & ESTATE_ACCESS_ALLOWED_AGENTS) - { - mAllowedAgents.clear(); - - for (S32 i = 0; i < num_allowed_agents && i < ESTATE_MAX_ACCESS_IDS; i++) - { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - mAllowedAgents.insert(id); - } - } - - if (access_flags & ESTATE_ACCESS_ALLOWED_GROUPS) - { - mAllowedGroups.clear(); - - for (S32 i = 0; i < num_allowed_groups && i < ESTATE_MAX_GROUP_IDS; i++) - { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - mAllowedGroups.insert(id); - } - } - - if (access_flags & ESTATE_ACCESS_BANNED_AGENTS) - { - mBannedAgents.clear(); - - for (S32 i = 0; i < num_banned_agents && i < ESTATE_MAX_ACCESS_IDS; i++) - { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - mBannedAgents.insert(id); - } - } - - if (access_flags & ESTATE_ACCESS_MANAGERS) - { - mEstateManagers.clear(); - - // There should be only ESTATE_MAX_MANAGERS people in the list, but if the database gets more (SL-46107) don't - // truncate the list unless it's really big. Go ahead and show the extras so the user doesn't get confused, - // and they can still remove them. - for (S32 i = 0; i < num_estate_managers && i < (ESTATE_MAX_MANAGERS * 4); i++) - { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - mEstateManagers.insert(id); - } - } - - // Update the buttons which may change based on the list contents but also needs to account for general access features. - mUpdateAccess(access_flags); -} - -void LLEstateInfoModel::updateExperienceInfo(const strings_t& strings) -{ - strings_t::const_iterator it = strings.begin(); - ++it; // U32 estate_id = strtol((*it).c_str(), NULL, 10); - ++it; // U32 send_to_agent_only = strtoul((*(++it)).c_str(), NULL, 10); - - LLUUID id; - S32 num_blocked = strtol((*(it++)).c_str(), NULL, 10); - S32 num_trusted = strtol((*(it++)).c_str(), NULL, 10); - S32 num_allowed = strtol((*(it++)).c_str(), NULL, 10); - - mExperienceAllowed.clear(); - mExperienceTrusted.clear(); - mExperienceBlocked.clear(); - - while (num_blocked-- > 0) - { - memcpy(id.mData, (*(it++)).data(), UUID_BYTES); - mExperienceBlocked.insert(id); - } - - while (num_trusted-- > 0) - { - memcpy(id.mData, (*(it++)).data(), UUID_BYTES); - mExperienceTrusted.insert(id); - } - - while (num_allowed-- > 0) - { - memcpy(id.mData, (*(it++)).data(), UUID_BYTES); - mExperienceAllowed.insert(id); - } - - mUpdateExperience(); -} - void LLEstateInfoModel::notifyCommit() { mCommitSignal(); } -void LLEstateInfoModel::initSingleton() -{ - gMessageSystem->setHandlerFunc("EstateOwnerMessage", &processEstateOwnerRequest); - - // name.assign("setowner"); - // static LLDispatchSetEstateOwner set_owner; - // dispatch.addHandler(name, &set_owner); - - static LLDispatchEstateUpdateInfo estate_update_info; - mDispatch.addHandler("estateupdateinfo", &estate_update_info); - - static LLDispatchSetEstateAccess set_access; - mDispatch.addHandler("setaccess", &set_access); - - static LLDispatchSetEstateExperience set_experience; - mDispatch.addHandler("setexperience", &set_experience); - -} - -void LLEstateInfoModel::sendEstateOwnerMessage(const std::string& request, const strings_t& strings) -{ - if (!mRegion) - { - LL_WARNS("ESTATEINFOM") << "No selected region." << LL_ENDL; - return; - } - LLMessageSystem* msg(gMessageSystem); - LLUUID invoice(LLEstateInfoModel::instance().getLastInvoice()); - - LL_INFOS() << "Sending estate request '" << request << "'" << LL_ENDL; - msg->newMessage("EstateOwnerMessage"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - msg->nextBlock("MethodData"); - msg->addString("Method", request); - msg->addUUID("Invoice", invoice); - if (strings.empty()) - { - msg->nextBlock("ParamList"); - msg->addString("Parameter", NULL); - } - else - { - strings_t::const_iterator it = strings.begin(); - strings_t::const_iterator end = strings.end(); - for (; it != end; ++it) - { - msg->nextBlock("ParamList"); - msg->addString("Parameter", *it); - } - } - msg->sendReliable(mRegion->getHost()); -} - //== PRIVATE STUFF ============================================================ // tries to send estate info using a cap; returns true if it succeeded bool LLEstateInfoModel::commitEstateInfoCaps() { - if (!mRegion) - { - LL_WARNS("ESTATEINFOM") << "Attempt to update estate caps with no anchor region! Don't do that!" << LL_ENDL; - return false; - } - std::string url = mRegion->getCapability("EstateChangeInfo"); + std::string url = gAgent.getRegionCapability("EstateChangeInfo"); if (url.empty()) { - LL_WARNS("ESTATEINFOM") << "No EstateChangeInfo cap from region." << LL_ENDL; // whoops, couldn't find the cap, so bail out return false; } @@ -433,14 +150,13 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url) body["deny_age_unverified"] = getDenyAgeUnverified(); body["allow_voice_chat"] = getAllowVoiceChat(); body["override_public_access"] = getAllowAccessOverride(); - body["override_environment"] = getAllowEnvironmentOverride(); - body["invoice"] = getLastInvoice(); + body["invoice"] = LLFloaterRegionInfo::getLastInvoice(); - LL_DEBUGS("ESTATEINFOM") << "Sending estate caps: " + LL_DEBUGS("WindlightSync") << "Sending estate caps: " << "is_sun_fixed = " << getUseFixedSun() << ", sun_hour = " << getSunHour() << LL_ENDL; - LL_DEBUGS("ESTATEINFOM") << body << LL_ENDL; + LL_DEBUGS() << body << LL_ENDL; LLSD result = httpAdapter->postAndSuspend(httpRequest, url, body); @@ -449,12 +165,12 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url) if (status) { - LL_INFOS("ESTATEINFOM") << "Committed estate info" << LL_ENDL; + LL_INFOS() << "Committed estate info" << LL_ENDL; LLEstateInfoModel::instance().notifyCommit(); } else { - LL_WARNS("ESTATEINFOM") << "Failed to commit estate info " << LL_ENDL; + LL_WARNS() << "Failed to commit estate info " << LL_ENDL; } } @@ -467,15 +183,10 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url) // strings[3] = str((S32)(sun_hour * 1024.f)) void LLEstateInfoModel::commitEstateInfoDataserver() { - if (!mRegion) - { - LL_WARNS("ESTATEINFOM") << "No selected region." << LL_ENDL; - return; - } - LL_DEBUGS("ESTATEINFOM") << "Sending estate info: " + LL_DEBUGS("WindlightSync") << "Sending estate info: " << "is_sun_fixed = " << getUseFixedSun() << ", sun_hour = " << getSunHour() << LL_ENDL; - LL_DEBUGS("ESTATEINFOM") << getInfoDump() << LL_ENDL; + LL_DEBUGS() << getInfoDump() << LL_ENDL; LLMessageSystem* msg = gMessageSystem; msg->newMessage("EstateOwnerMessage"); @@ -486,7 +197,7 @@ void LLEstateInfoModel::commitEstateInfoDataserver() msg->nextBlock("MethodData"); msg->addString("Method", "estatechangeinfo"); - msg->addUUID("Invoice", getLastInvoice()); + msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); msg->nextBlock("ParamList"); msg->addString("Parameter", getName()); @@ -497,7 +208,7 @@ void LLEstateInfoModel::commitEstateInfoDataserver() msg->nextBlock("ParamList"); msg->addString("Parameter", llformat("%d", (S32) (getSunHour() * 1024.0f))); - msg->sendReliable(mRegion->getHost()); + gAgent.sendMessage(); } std::string LLEstateInfoModel::getInfoDump() @@ -513,28 +224,9 @@ std::string LLEstateInfoModel::getInfoDump() dump["deny_age_unverified" ] = getDenyAgeUnverified(); dump["allow_voice_chat" ] = getAllowVoiceChat(); dump["override_public_access"] = getAllowAccessOverride(); - dump["override_environment"] = getAllowEnvironmentOverride(); + dump["override_environment"] = getAllowEnvironmentOverride(); std::stringstream dump_str; dump_str << dump; return dump_str.str(); } - -// static -void LLEstateInfoModel::processEstateOwnerRequest(LLMessageSystem* msg, void**) -{ - // unpack the message - std::string request; - LLUUID invoice; - LLDispatcher::sparam_t strings; - LLDispatcher::unpackMessage(msg, request, invoice, strings); - if (invoice != LLEstateInfoModel::instance().getLastInvoice()) - { - LL_WARNS("ESTATEINFOM") << "Mismatched Estate message: " << request << LL_ENDL; - return; - } - - //dispatch the message - LLEstateInfoModel::instance().mDispatch.dispatch(request, invoice, strings); -} - diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h index 2c89a85500829cd9b485a9dc20933abeddf44734..d6f00c573cf11c619d9ee62917c6bde60d31938e 100644 --- a/indra/newview/llestateinfomodel.h +++ b/indra/newview/llestateinfomodel.h @@ -32,123 +32,78 @@ class LLMessageSystem; #include "llsingleton.h" #include "llcoros.h" #include "lleventcoro.h" -#include "lldispatcher.h" -#include "llregionflags.h" -class LLViewerRegion; /** * Contains estate info, notifies interested parties of its changes. */ class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel> { - LLSINGLETON_C11(LLEstateInfoModel); + LLSINGLETON(LLEstateInfoModel); LOG_CLASS(LLEstateInfoModel); public: - typedef std::vector<std::string> strings_t; - typedef boost::signals2::signal<void()> update_signal_t; - typedef boost::signals2::signal<void(U32)> update_flaged_signal_t; - typedef boost::signals2::connection connection_t; + typedef boost::signals2::signal<void()> update_signal_t; + boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated + boost::signals2::connection setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied - connection_t setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated - connection_t setUpdateAccessCallback(const update_flaged_signal_t::slot_type& cb); - connection_t setUpdateExperienceCallback(const update_signal_t::slot_type& cb); - connection_t setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied - - void setRegion(LLViewerRegion* region); - void clearRegion(); - void sendEstateInfo(); /// send estate info to the simulator + void sendEstateInfo(); /// send estate info to the simulator // getters - bool getUseFixedSun() const { return getFlag(REGION_FLAGS_SUN_FIXED); } - bool getIsExternallyVisible() const { return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE); } - bool getAllowDirectTeleport() const { return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } - bool getDenyAnonymous() const { return getFlag(REGION_FLAGS_DENY_ANONYMOUS); } - bool getDenyAgeUnverified() const { return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED); } - bool getAllowVoiceChat() const { return getFlag(REGION_FLAGS_ALLOW_VOICE); } - bool getAllowAccessOverride() const { return getFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE); } - bool getAllowEnvironmentOverride() const { return getFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE); } - - const std::string& getName() const { return mName; } - const LLUUID& getOwnerID() const { return mOwnerID; } - U32 getID() const { return mID; } - F32 getSunHour() const { return getUseFixedSun() ? mSunHour : 0.f; } + bool getUseFixedSun() const; + bool getIsExternallyVisible() const; + bool getAllowDirectTeleport() const; + bool getDenyAnonymous() const; + bool getDenyAgeUnverified() const; + bool getAllowVoiceChat() const; + bool getAllowAccessOverride() const; + bool getAllowEnvironmentOverride() const; + + const std::string& getName() const { return mName; } + const LLUUID& getOwnerID() const { return mOwnerID; } + U32 getID() const { return mID; } + F32 getSunHour() const { return getUseFixedSun() ? mSunHour : 0.f; } // setters - void setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); } - void setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); } - void setAllowDirectTeleport(bool val) { setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, val); } - void setDenyAnonymous(bool val) { setFlag(REGION_FLAGS_DENY_ANONYMOUS, val); } - void setDenyAgeUnverified(bool val) { setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED, val); } - void setAllowVoiceChat(bool val) { setFlag(REGION_FLAGS_ALLOW_VOICE, val); } - void setAllowAccessOverride(bool val) { setFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE, val); } - void setAllowEnvironmentOverride(bool val) { setFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE, val); } - - void setSunHour(F32 sun_hour) { mSunHour = sun_hour; } - - const uuid_set_t & getAllowedAgents() const { return mAllowedAgents; } - const uuid_set_t & getAllowedGroups() const { return mAllowedGroups; } - const uuid_set_t & getBannedAgents() const { return mBannedAgents; } - const uuid_set_t & getEstateManagers() const { return mEstateManagers; } - - const uuid_set_t & getAllowedExperiences() const { return mExperienceAllowed; } - const uuid_set_t & getTrustedExperiences() const { return mExperienceTrusted; } - const uuid_set_t & getBlockedExperiences() const { return mExperienceBlocked; } - - void sendEstateOwnerMessage(const std::string& request, const strings_t& strings); - - //--------------------------------------------------------------------- - /// refresh model with data from the incoming server message - void updateEstateInfo(const strings_t& strings); - void updateAccessInfo(const strings_t& strings); - void updateExperienceInfo(const strings_t& strings); + void setUseFixedSun(bool val); + void setIsExternallyVisible(bool val); + void setAllowDirectTeleport(bool val); + void setDenyAnonymous(bool val); + void setDenyAgeUnverified(bool val); + void setAllowVoiceChat(bool val); + void setAllowAccessOverride(bool val); + void setAllowEnvironmentOverride(bool val); - const LLUUID & getLastInvoice() { return mRequestInvoice; } - const LLUUID & nextInvoice() { mRequestInvoice.generate(); return mRequestInvoice; } + void setSunHour(F32 sun_hour) { mSunHour = sun_hour; } protected: + typedef std::vector<std::string> strings_t; - void notifyCommit(); + friend class LLDispatchEstateUpdateInfo; - virtual void initSingleton() override; + /// refresh model with data from the incoming server message + void update(const strings_t& strings); + + void notifyCommit(); private: - bool commitEstateInfoCaps(); - void commitEstateInfoDataserver(); - inline bool getFlag(U64 flag) const; - inline void setFlag(U64 flag, bool val); - U64 getFlags() const { return mFlags; } - std::string getInfoDump(); + bool commitEstateInfoCaps(); + void commitEstateInfoDataserver(); + inline bool getFlag(U64 flag) const; + inline void setFlag(U64 flag, bool val); + U64 getFlags() const { return mFlags; } + std::string getInfoDump(); // estate info - std::string mName; /// estate name - LLUUID mOwnerID; /// estate owner id - U32 mID; /// estate id - U64 mFlags; /// estate flags - F32 mSunHour; /// estate sun hour - - uuid_set_t mAllowedAgents; - uuid_set_t mAllowedGroups; - uuid_set_t mBannedAgents; - uuid_set_t mEstateManagers; - - uuid_set_t mExperienceAllowed; - uuid_set_t mExperienceTrusted; - uuid_set_t mExperienceBlocked; - - update_signal_t mUpdateSignal; /// emitted when we receive update from sim - update_flaged_signal_t mUpdateAccess; - update_signal_t mUpdateExperience; - update_signal_t mCommitSignal; /// emitted when our update gets applied to sim - - LLDispatcher mDispatch; - LLUUID mRequestInvoice; - LLViewerRegion* mRegion; - - void commitEstateInfoCapsCoro(std::string url); + std::string mName; /// estate name + LLUUID mOwnerID; /// estate owner id + U32 mID; /// estate id + U64 mFlags; /// estate flags + F32 mSunHour; /// estate sun hour - static void processEstateOwnerRequest(LLMessageSystem* msg, void**); + update_signal_t mUpdateSignal; /// emitted when we receive update from sim + update_signal_t mCommitSignal; /// emitted when our update gets applied to sim + void commitEstateInfoCapsCoro(std::string url); }; inline bool LLEstateInfoModel::getFlag(U64 flag) const diff --git a/indra/newview/llfloaterbanduration.cpp b/indra/newview/llfloaterbanduration.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6ba6c30cab1e9ad6a5d03578c3cd22e2f0213f22 --- /dev/null +++ b/indra/newview/llfloaterbanduration.cpp @@ -0,0 +1,92 @@ +/** +* @file llfloaterbanduration.cpp +* +* $LicenseInfo:firstyear=2004&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2018, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" +#include "llfloaterbanduration.h" + +#include "llfloaterreg.h" +#include "llspinctrl.h" +#include "llradiogroup.h" + +LLFloaterBanDuration::LLFloaterBanDuration(const LLSD& target) + : LLFloater(target) +{ +} + +BOOL LLFloaterBanDuration::postBuild() +{ + childSetAction("ok_btn", boost::bind(&LLFloaterBanDuration::onClickBan, this)); + childSetAction("cancel_btn", boost::bind(&LLFloaterBanDuration::onClickCancel, this)); + + getChild<LLUICtrl>("ban_duration_radio")->setCommitCallback(boost::bind(&LLFloaterBanDuration::onClickRadio, this)); + getChild<LLRadioGroup>("ban_duration_radio")->setSelectedIndex(0); + getChild<LLUICtrl>("ban_hours")->setEnabled(FALSE); + + return TRUE; +} + +LLFloaterBanDuration* LLFloaterBanDuration::show(select_callback_t callback, uuid_vec_t ids) +{ + LLFloaterBanDuration* floater = LLFloaterReg::showTypedInstance<LLFloaterBanDuration>("ban_duration"); + if (!floater) + { + LL_WARNS() << "Cannot instantiate ban duration floater" << LL_ENDL; + return NULL; + } + + floater->mSelectionCallback = callback; + floater->mAvatar_ids = ids; + + return floater; +} + +void LLFloaterBanDuration::onClickRadio() +{ + getChild<LLUICtrl>("ban_hours")->setEnabled(getChild<LLRadioGroup>("ban_duration_radio")->getSelectedIndex() != 0); +} + +void LLFloaterBanDuration::onClickCancel() +{ + closeFloater(); +} + +void LLFloaterBanDuration::onClickBan() +{ + if (mSelectionCallback) + { + S32 time = 0; + if (getChild<LLRadioGroup>("ban_duration_radio")->getSelectedIndex() != 0) + { + LLSpinCtrl* hours_spin = getChild<LLSpinCtrl>("ban_hours"); + if (hours_spin) + { + time = LLDate::now().secondsSinceEpoch() + (hours_spin->getValue().asInteger() * 3600); + } + } + mSelectionCallback(mAvatar_ids, time); + } + closeFloater(); +} + diff --git a/indra/newview/llfloaterbanduration.h b/indra/newview/llfloaterbanduration.h new file mode 100644 index 0000000000000000000000000000000000000000..e8ec7cc669f245e2d0120949928e0696549f09ed --- /dev/null +++ b/indra/newview/llfloaterbanduration.h @@ -0,0 +1,52 @@ +/** +* @file llfloaterbanduration.h +* +* $LicenseInfo:firstyear=2004&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2018, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + + +#ifndef LL_FLOATERBANDURATION_H +#define LL_FLOATERBANDURATION_H + +#include "llfloater.h" + +class LLFloaterBanDuration : public LLFloater +{ + typedef boost::function<void(const uuid_vec_t&, const S32 duration)> select_callback_t; + +public: + LLFloaterBanDuration(const LLSD& target); + BOOL postBuild(); + static LLFloaterBanDuration* show(select_callback_t callback, uuid_vec_t id); + +private: + ~LLFloaterBanDuration() {}; + void onClickBan(); + void onClickCancel(); + void onClickRadio(); + + uuid_vec_t mAvatar_ids; + select_callback_t mSelectionCallback; +}; + +#endif // LL_FLOATERBANDURATION_H + diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index eeb1c17f4bd84ab6903e9ea930e0b31d6db99d74..450f2d6ff14501d71be2a46fbe7c82996417dd88 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -46,6 +46,7 @@ #include "llfloaterreg.h" #include "llfloateravatarpicker.h" #include "llfloaterauction.h" +#include "llfloaterbanduration.h" #include "llfloatergroups.h" #include "llfloaterscriptlimits.h" #include "llavataractions.h" @@ -2546,33 +2547,49 @@ void LLPanelLandAccess::refresh() cit != parcel->mBanList.end(); ++cit) { const LLAccessEntry& entry = (*cit).second; - std::string prefix; + std::string duration; if (entry.mTime != 0) { LLStringUtil::format_map_t args; S32 now = time(NULL); - S32 seconds = entry.mTime - now; + S32 seconds = entry.mTime - now; if (seconds < 0) seconds = 0; - prefix.assign(" ("); - if (seconds >= 120) + + if (seconds >= 7200) { - args["[MINUTES]"] = llformat("%d", (seconds/60)); - std::string buf = parent_floater->getString ("Minutes", args); - prefix.append(buf); + args["[HOURS]"] = llformat("%d", (seconds / 3600)); + duration = parent_floater->getString("Hours", args); + } + else if (seconds >= 3600) + { + duration = "1 " + parent_floater->getString("Hour"); + } + else if (seconds >= 120) + { + args["[MINUTES]"] = llformat("%d", (seconds / 60)); + duration = parent_floater->getString("Minutes", args); } else if (seconds >= 60) { - prefix.append("1 " + parent_floater->getString("Minute")); + duration = "1 " + parent_floater->getString("Minute"); } else { args["[SECONDS]"] = llformat("%d", seconds); - std::string buf = parent_floater->getString ("Seconds", args); - prefix.append(buf); + duration = parent_floater->getString("Seconds", args); } - prefix.append(" " + parent_floater->getString("Remaining") + ") "); } - mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, "", prefix); + else + { + duration = parent_floater->getString("Always"); + } + LLSD item; + item["id"] = entry.mID; + LLSD& columns = item["columns"]; + columns[0]["column"] = "name"; // to be populated later + columns[1]["column"] = "duration"; + columns[1]["value"] = duration; + mListBanned->addElement(item); } mListBanned->sortByName(TRUE); } @@ -2924,7 +2941,7 @@ void LLPanelLandAccess::onClickAddBanned() LLView * button = findChild<LLButton>("add_banned"); LLFloater * root_floater = gFloaterView->getParentFloater(this); LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( - boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), FALSE, FALSE, FALSE, root_floater->getName(), button); + boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), TRUE, FALSE, FALSE, root_floater->getName(), button); if (picker) { root_floater->addDependentFloater(picker); @@ -2934,23 +2951,41 @@ void LLPanelLandAccess::onClickAddBanned() // static void LLPanelLandAccess::callbackAvatarCBBanned(const uuid_vec_t& ids) { - if (!ids.empty()) + LLFloater * root_floater = gFloaterView->getParentFloater(this); + LLFloaterBanDuration* duration_floater = LLFloaterBanDuration::show( + boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned2, this, _1, _2), ids); + if (duration_floater) { - LLUUID id = ids[0]; - LLParcel* parcel = mParcel->getParcel(); - if (parcel && parcel->addToBanList(id, 0)) + root_floater->addDependentFloater(duration_floater); + } +} + +void LLPanelLandAccess::callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 duration) +{ + LLParcel* parcel = mParcel->getParcel(); + if (!parcel) return; + + U32 lists_to_update = 0; + + for (uuid_vec_t::const_iterator it = ids.begin(); it < ids.end(); it++) + { + LLUUID id = *it; + if (parcel->addToBanList(id, duration)) { - U32 lists_to_update = AL_BAN; + lists_to_update |= AL_BAN; // agent was successfully added to ban list // but we also need to check access list to ensure that agent will not be in two lists simultaneously if (parcel->removeFromAccessList(id)) { lists_to_update |= AL_ACCESS; } - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); - refresh(); } } + if (lists_to_update > 0) + { + LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); + refresh(); + } } // static diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 0eea46bc5a357ce50a0c0478cb40cdbffe84f2da..7556a96cbdfdf9e46c4880c1471871bbe1bd3475 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -381,6 +381,7 @@ class LLPanelLandAccess void onClickAddAccess(); void onClickAddBanned(); void callbackAvatarCBBanned(const uuid_vec_t& ids); + void callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 duration); void callbackAvatarCBAccess(const uuid_vec_t& ids); protected: diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index a7887eb9b45e83f97df4e7679b6a170fbdd23d65..bb76af9a3c4432db86ef3ac82ff26a4a29169928 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -51,6 +51,7 @@ #include "llfloateravatarpicker.h" #include "llbutton.h" #include "llcheckboxctrl.h" +#include "llclipboard.h" #include "llcombobox.h" #include "llestateinfomodel.h" #include "llfilepicker.h" @@ -95,17 +96,57 @@ #include "llexperiencecache.h" #include "llpanelexperiences.h" #include "llcorehttputil.h" +#include "llavatarnamecache.h" #include "llenvironment.h" const S32 TERRAIN_TEXTURE_COUNT = 4; const S32 CORNER_COUNT = 4; +const U32 MAX_LISTED_NAMES = 100; + #define TMP_DISABLE_WLES // STORM-1180 ///---------------------------------------------------------------------------- /// Local class declaration ///---------------------------------------------------------------------------- +class LLDispatchEstateUpdateInfo : public LLDispatchHandler +{ +public: + LLDispatchEstateUpdateInfo() {} + virtual ~LLDispatchEstateUpdateInfo() {} + virtual bool operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings); +}; + +class LLDispatchSetEstateAccess : public LLDispatchHandler +{ +public: + LLDispatchSetEstateAccess() {} + virtual ~LLDispatchSetEstateAccess() {} + virtual bool operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings); +}; + +class LLDispatchSetEstateExperience : public LLDispatchHandler +{ +public: + virtual bool operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings); + + LLSD getIDs( sparam_t::const_iterator it, sparam_t::const_iterator end, S32 count ); +}; + + /* void unpack_request_params( LLMessageSystem* msg, @@ -182,6 +223,10 @@ bool estate_dispatch_initialized = false; /// LLFloaterRegionInfo ///---------------------------------------------------------------------------- +//S32 LLFloaterRegionInfo::sRequestSerial = 0; +LLUUID LLFloaterRegionInfo::sRequestInvoice; + + LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed) : LLFloater(seed), mEnvironmentPanel(NULL), @@ -200,6 +245,11 @@ BOOL LLFloaterRegionInfo::postBuild() panel->buildFromFile("panel_region_estate.xml"); mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true)); + panel = new LLPanelEstateAccess; + mInfoPanels.push_back(panel); + panel->buildFromFile("panel_region_access.xml"); + mTab->addTabPanel(panel); + panel = new LLPanelEstateCovenant; mInfoPanels.push_back(panel); panel->buildFromFile("panel_region_covenant.xml"); @@ -238,6 +288,10 @@ BOOL LLFloaterRegionInfo::postBuild() panel->buildFromFile("panel_region_experiences.xml"); mTab->addTabPanel(panel); } + + gMessageSystem->setHandlerFunc( + "EstateOwnerMessage", + &processEstateOwnerRequest); // Request region info when agent region changes. mRegionChangedCallback = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterRegionInfo::onRegionChanged, this)); @@ -260,9 +314,22 @@ void LLFloaterRegionInfo::onOpen(const LLSD& key) disableTabCtrls(); return; } - LLEstateInfoModel::instance().clearRegion(); - requestRegionInfo(); // will cause refreshFromRegion() + refreshFromRegion(gAgent.getRegion()); + requestRegionInfo(); requestMeshRezInfo(); + + if (!mGodLevelChangeSlot.connected()) + { + mGodLevelChangeSlot = gAgent.registerGodLevelChanageListener(boost::bind(&LLFloaterRegionInfo::onGodLevelChange, this, _1)); + } +} + +void LLFloaterRegionInfo::onClose(bool app_quitting) +{ + if (mGodLevelChangeSlot.connected()) + { + mGodLevelChangeSlot.disconnect(); + } } void LLFloaterRegionInfo::onRegionChanged() @@ -273,6 +340,7 @@ void LLFloaterRegionInfo::onRegionChanged() } } +// static void LLFloaterRegionInfo::requestRegionInfo() { LLTabContainer* tab = findChild<LLTabContainer>("region_panels"); @@ -295,6 +363,44 @@ void LLFloaterRegionInfo::requestRegionInfo() gAgent.sendReliableMessage(); } +// static +void LLFloaterRegionInfo::processEstateOwnerRequest(LLMessageSystem* msg,void**) +{ + static LLDispatcher dispatch; + LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info"); + if(!floater) + { + return; + } + + if (!estate_dispatch_initialized) + { + LLPanelEstateInfo::initDispatch(dispatch); + } + + LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); + + // unpack the message + std::string request; + LLUUID invoice; + LLDispatcher::sparam_t strings; + LLDispatcher::unpackMessage(msg, request, invoice, strings); + if(invoice != getLastInvoice()) + { + LL_WARNS() << "Mismatched Estate message: " << request << LL_ENDL; + return; + } + + //dispatch the message + dispatch.dispatch(request, invoice, strings); + + if (panel) + { + panel->updateControls(gAgent.getRegion()); + } +} + + // static void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg) { @@ -435,6 +541,16 @@ LLPanelEstateInfo* LLFloaterRegionInfo::getPanelEstate() return panel; } +// static +LLPanelEstateAccess* LLFloaterRegionInfo::getPanelAccess() +{ + LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info"); + if (!floater) return NULL; + LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels"); + LLPanelEstateAccess* panel = (LLPanelEstateAccess*)tab->getChild<LLPanel>("Access"); + return panel; +} + // static LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant() { @@ -489,6 +605,7 @@ void LLFloaterRegionInfo::disableTabCtrls() tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(FALSE); tab->getChild<LLPanel>("panel_env_info")->setCtrlsEnabled(FALSE); tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(FALSE); + tab->getChild<LLPanel>("Access")->setCtrlsEnabled(FALSE); } void LLFloaterRegionInfo::onTabSelected(const LLSD& param) @@ -541,6 +658,15 @@ void LLFloaterRegionInfo::disableTopButtons() getChildView("top_scripts_btn")->setEnabled(false); } +void LLFloaterRegionInfo::onGodLevelChange(U8 god_level) +{ + LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info"); + if (floater && floater->getVisible()) + { + refreshFromRegion(gAgent.getRegion()); + } +} + ///---------------------------------------------------------------------------- /// Local class implementation ///---------------------------------------------------------------------------- @@ -609,10 +735,43 @@ void LLPanelRegionInfo::updateChild(LLUICtrl* child_ctr) // virtual bool LLPanelRegionInfo::refreshFromRegion(LLViewerRegion* region) { - LLEstateInfoModel::instance().setRegion(region); + if (region) mHost = region->getHost(); return true; } +void LLPanelRegionInfo::sendEstateOwnerMessage( + LLMessageSystem* msg, + const std::string& request, + const LLUUID& invoice, + const strings_t& strings) +{ + LL_INFOS() << "Sending estate request '" << request << "'" << LL_ENDL; + msg->newMessage("EstateOwnerMessage"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used + msg->nextBlock("MethodData"); + msg->addString("Method", request); + msg->addUUID("Invoice", invoice); + if(strings.empty()) + { + msg->nextBlock("ParamList"); + msg->addString("Parameter", NULL); + } + else + { + strings_t::const_iterator it = strings.begin(); + strings_t::const_iterator end = strings.end(); + for(; it != end; ++it) + { + msg->nextBlock("ParamList"); + msg->addString("Parameter", *it); + } + } + msg->sendReliable(mHost); +} + void LLPanelRegionInfo::enableButton(const std::string& btn_name, BOOL enable) { LLView* button = findChildView(btn_name); @@ -746,7 +905,8 @@ void LLPanelRegionGeneralInfo::onKickCommit(const uuid_vec_t& ids) ids[0].toString(buffer); strings.push_back(strings_t::value_type(buffer)); - LLEstateInfoModel::instance().sendEstateOwnerMessage("teleporthomeuser", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "teleporthomeuser", invoice, strings); } } @@ -771,8 +931,9 @@ bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const L gAgent.getID().toString(buffer); strings.push_back(buffer); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); // historical message name - LLEstateInfoModel::instance().sendEstateOwnerMessage("teleporthomeallusers", strings); + sendEstateOwnerMessage(gMessageSystem, "teleporthomeallusers", invoice, strings); } return false; } @@ -811,7 +972,8 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L LLAgentUI::buildFullname(name); strings.push_back(strings_t::value_type(name)); strings.push_back(strings_t::value_type(text)); - LLEstateInfoModel::instance().sendEstateOwnerMessage("simulatormessage", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "simulatormessage", invoice, strings); return false; } @@ -897,7 +1059,8 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate() buffer = llformat("%s", (getChild<LLUICtrl>("allow_parcel_changes_check")->getValue().asBoolean() ? "Y" : "N")); strings.push_back(strings_t::value_type(buffer)); - LLEstateInfoModel::instance().sendEstateOwnerMessage("setregioninfo", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings); } // if we changed access levels, tell user about it @@ -969,7 +1132,8 @@ BOOL LLPanelRegionDebugInfo::sendUpdate() buffer = llformat("%s", (getChild<LLUICtrl>("disable_physics_check")->getValue().asBoolean() ? "Y" : "N")); strings.push_back(buffer); - LLEstateInfoModel::instance().sendEstateOwnerMessage("setregiondebug", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "setregiondebug", invoice, strings); return TRUE; } @@ -1039,7 +1203,9 @@ bool LLPanelRegionDebugInfo::callbackReturn(const LLSD& notification, const LLSD strings.push_back(llformat("%d", flags)); strings.push_back(target_avatar.asString()); - LLEstateInfoModel::instance().sendEstateOwnerMessage("estateobjectreturn", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + + sendEstateOwnerMessage(gMessageSystem, "estateobjectreturn", invoice, strings); } else { @@ -1057,6 +1223,7 @@ void LLPanelRegionDebugInfo::onClickTopColliders(void* data) LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data; strings_t strings; strings.push_back("1"); // one physics step + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects"); if(!instance) return; LLFloaterReg::showInstance("top_objects"); @@ -1066,7 +1233,7 @@ void LLPanelRegionDebugInfo::onClickTopColliders(void* data) self->getChildView("top_colliders_btn")->setEnabled(false); self->getChildView("top_scripts_btn")->setEnabled(false); - LLEstateInfoModel::instance().sendEstateOwnerMessage("colliders", strings); + self->sendEstateOwnerMessage(gMessageSystem, "colliders", invoice, strings); } // static @@ -1075,6 +1242,7 @@ void LLPanelRegionDebugInfo::onClickTopScripts(void* data) LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data; strings_t strings; strings.push_back("6"); // top 5 scripts + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects"); if(!instance) return; LLFloaterReg::showInstance("top_objects"); @@ -1084,7 +1252,7 @@ void LLPanelRegionDebugInfo::onClickTopScripts(void* data) self->getChildView("top_colliders_btn")->setEnabled(false); self->getChildView("top_scripts_btn")->setEnabled(false); - LLEstateInfoModel::instance().sendEstateOwnerMessage("scripts", strings); + self->sendEstateOwnerMessage(gMessageSystem, "scripts", invoice, strings); } // static @@ -1101,16 +1269,19 @@ bool LLPanelRegionDebugInfo::callbackRestart(const LLSD& notification, const LLS strings_t strings; strings.push_back("120"); - LLEstateInfoModel::instance().sendEstateOwnerMessage("restart", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings); return false; } // static void LLPanelRegionDebugInfo::onClickCancelRestart(void* data) { + LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data; strings_t strings; strings.push_back("-1"); - LLEstateInfoModel::instance().sendEstateOwnerMessage("restart", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings); } // static @@ -1275,6 +1446,7 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate() LL_INFOS() << "LLPanelRegionTerrainInfo::sendUpdate" << LL_ENDL; std::string buffer; strings_t strings; + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); // update the model LLRegionInfoModel& region_info = LLRegionInfoModel::instance(); @@ -1283,7 +1455,7 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate() region_info.mTerrainLowerLimit = (F32) getChild<LLUICtrl>("terrain_lower_spin")->getValue().asReal(); // and sync the region with it - region_info.sendRegionTerrain(LLEstateInfoModel::instance().getLastInvoice()); + region_info.sendRegionTerrain(invoice); // ======================================= // Assemble and send texturedetail message @@ -1311,6 +1483,7 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate() LLTextureCtrl* texture_ctrl; std::string id_str; + LLMessageSystem* msg = gMessageSystem; for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i) { @@ -1324,7 +1497,7 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate() strings.push_back(buffer); } } - LLEstateInfoModel::instance().sendEstateOwnerMessage("texturedetail", strings); + sendEstateOwnerMessage(msg, "texturedetail", invoice, strings); strings.clear(); // ======================================== @@ -1337,13 +1510,13 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate() std::string buffer3 = llformat("%d %f %f", i, (F32)getChild<LLUICtrl>(buffer)->getValue().asReal(), (F32)getChild<LLUICtrl>(buffer2)->getValue().asReal()); strings.push_back(buffer3); } - LLEstateInfoModel::instance().sendEstateOwnerMessage("textureheights", strings); + sendEstateOwnerMessage(msg, "textureheights", invoice, strings); strings.clear(); // ======================================== // Send texturecommit message - LLEstateInfoModel::instance().sendEstateOwnerMessage("texturecommit", strings); + sendEstateOwnerMessage(msg, "texturecommit", invoice, strings); return TRUE; } @@ -1383,10 +1556,12 @@ void LLPanelRegionTerrainInfo::onClickDownloadRaw(void* data) std::string filepath = picker.getFirstFile(); gXferManager->expectFileForRequest(filepath); + LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data; strings_t strings; strings.push_back("download filename"); strings.push_back(filepath); - LLEstateInfoModel::instance().sendEstateOwnerMessage("terrain", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); } // static @@ -1401,10 +1576,12 @@ void LLPanelRegionTerrainInfo::onClickUploadRaw(void* data) std::string filepath = picker.getFirstFile(); gXferManager->expectFileForTransfer(filepath); + LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data; strings_t strings; strings.push_back("upload filename"); strings.push_back(filepath); - LLEstateInfoModel::instance().sendEstateOwnerMessage("terrain", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); LLNotificationsUtil::add("RawUploadStarted"); } @@ -1422,7 +1599,8 @@ bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, con strings_t strings; strings.push_back("bake"); - LLEstateInfoModel::instance().sendEstateOwnerMessage("terrain", strings); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); return false; } @@ -1436,129 +1614,28 @@ LLPanelEstateInfo::LLPanelEstateInfo() mEstateID(0) // invalid { LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); - estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this)); estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this)); - - estate_info.setUpdateAccessCallback(boost::bind(&LLPanelEstateInfo::refreshAccessFromEstate, this, _1)); -} - -//--------------------------------------------------------------------------- -// Add/Remove estate access button callbacks -//--------------------------------------------------------------------------- -void LLPanelEstateInfo::onClickAddAllowedAgent() -{ - LLCtrlListInterface *list = childGetListInterface("allowed_avatar_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) - { - //args - - LLSD args; - args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args); - return; - } - accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd"); -} - -void LLPanelEstateInfo::onClickRemoveAllowedAgent() -{ - accessRemoveCore(ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, "EstateAllowedAgentRemove", "allowed_avatar_name_list"); -} - -void LLPanelEstateInfo::onClickAddAllowedGroup() -{ - LLCtrlListInterface *list = childGetListInterface("allowed_group_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["MAX_GROUPS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args); - return; - } - - LLNotification::Params params("ChangeLindenAccess"); - params.functor.function(boost::bind(&LLPanelEstateInfo::addAllowedGroup, this, _1, _2)); - if (isLindenEstate()) - { - LLNotifications::instance().add(params); - } - else - { - LLNotifications::instance().forceResponse(params, 0); - } -} - -bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option != 0) return false; - - LLFloater* parent_floater = gFloaterView->getParentFloater(this); - - LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); - if (widget) - { - widget->removeNoneOption(); - widget->setSelectGroupCallback(boost::bind(&LLPanelEstateInfo::addAllowedGroup2, this, _1)); - if (parent_floater) - { - LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, widget); - widget->setOrigin(new_rect.mLeft, new_rect.mBottom); - parent_floater->addDependentFloater(widget); - } - } - - return false; -} - -void LLPanelEstateInfo::onClickRemoveAllowedGroup() -{ - accessRemoveCore(ESTATE_ACCESS_ALLOWED_GROUP_REMOVE, "EstateAllowedGroupRemove", "allowed_group_name_list"); } -void LLPanelEstateInfo::onClickAddBannedAgent() +// static +void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch) { - LLCtrlListInterface *list = childGetListInterface("banned_avatar_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["MAX_BANNED"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args); - return; - } - accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd"); -} + std::string name; + + name.assign("estateupdateinfo"); + static LLDispatchEstateUpdateInfo estate_update_info; + dispatch.addHandler(name, &estate_update_info); -void LLPanelEstateInfo::onClickRemoveBannedAgent() -{ - accessRemoveCore(ESTATE_ACCESS_BANNED_AGENT_REMOVE, "EstateBannedAgentRemove", "banned_avatar_name_list"); -} + name.assign("setaccess"); + static LLDispatchSetEstateAccess set_access; + dispatch.addHandler(name, &set_access); -// static -void LLPanelEstateInfo::onClickAddEstateManager() -{ - LLCtrlListInterface *list = childGetListInterface("estate_manager_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_MANAGERS) - { // Tell user they can't add more managers - LLSD args; - args["MAX_MANAGER"] = llformat("%d",ESTATE_MAX_MANAGERS); - LLNotificationsUtil::add("MaxManagersOnRegion", args); - } - else - { // Go pick managers to add - accessAddCore(ESTATE_ACCESS_MANAGER_ADD, "EstateManagerAdd"); - } -} + name.assign("setexperience"); + static LLDispatchSetEstateExperience set_experience; + dispatch.addHandler(name, &set_experience); -// static -void LLPanelEstateInfo::onClickRemoveEstateManager() -{ - accessRemoveCore(ESTATE_ACCESS_MANAGER_REMOVE, "EstateManagerRemove", "estate_manager_name_list"); + estate_dispatch_initialized = true; } //--------------------------------------------------------------------------- @@ -1603,7 +1680,7 @@ bool LLPanelEstateInfo::kickUserConfirm(const LLSD& notification, const LLSD& re strings_t strings; strings.push_back(notification["payload"]["agent_id"].asString()); - LLEstateInfoModel::instance().sendEstateOwnerMessage("kickestate", strings); + sendEstateOwnerMessage(gMessageSystem, "kickestate", LLFloaterRegionInfo::getLastInvoice(), strings); break; } default: @@ -1674,11 +1751,13 @@ struct LLEstateAccessChangeInfo LLSD sd; sd["name"] = mDialogName; sd["operation"] = (S32)mOperationFlag; - for (uuid_vec_t::const_iterator it = mAgentOrGroupIDs.begin(); - it != mAgentOrGroupIDs.end(); - ++it) + for (U32 i = 0; i < mAgentOrGroupIDs.size(); ++i) { - sd["allowed_ids"].append(*it); + sd["allowed_ids"].append(mAgentOrGroupIDs[i]); + if (mAgentNames.size() > i) + { + sd["allowed_names"].append(mAgentNames[i].asLLSD()); + } } return sd; } @@ -1686,248 +1765,771 @@ struct LLEstateAccessChangeInfo U32 mOperationFlag; // ESTATE_ACCESS_BANNED_AGENT_ADD, _REMOVE, etc. std::string mDialogName; uuid_vec_t mAgentOrGroupIDs; // List of agent IDs to apply to this change + std::vector<LLAvatarName> mAgentNames; // Optional list of the agent names for notifications }; -// Special case callback for groups, since it has different callback format than names -void LLPanelEstateInfo::addAllowedGroup2(LLUUID id) +// static +void LLPanelEstateInfo::updateEstateOwnerName(const std::string& name) { - LLSD payload; - payload["operation"] = (S32)ESTATE_ACCESS_ALLOWED_GROUP_ADD; - payload["dialog_name"] = "EstateAllowedGroupAdd"; - payload["allowed_ids"].append(id); - - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); - - LLNotification::Params params("EstateAllowedGroupAdd"); - params.payload(payload) - .substitutions(args) - .functor.function(accessCoreConfirm); - if (isLindenEstate()) - { - LLNotifications::instance().forceResponse(params, 0); - } - else + LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); + if (panelp) { - LLNotifications::instance().add(params); + panelp->setOwnerName(name); } } // static -void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const std::string& dialog_name) +void LLPanelEstateInfo::updateEstateName(const std::string& name) { - LLSD payload; - payload["operation"] = (S32)operation_flag; - payload["dialog_name"] = dialog_name; - // agent id filled in after avatar picker - - LLNotification::Params params("ChangeLindenAccess"); - params.payload(payload) - .functor.function(accessAddCore2); - - if (isLindenEstate()) - { - LLNotifications::instance().add(params); - } - else + LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); + if (panelp) { - // same as clicking "OK" - LLNotifications::instance().forceResponse(params, 0); + panelp->getChildRef<LLTextBox>("estate_name").setText(name); } } -// static -bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& response) +void LLPanelEstateInfo::updateControls(LLViewerRegion* region) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option != 0) - { - // abort change - return false; - } + BOOL god = gAgent.isGodlike(); + BOOL owner = (region && (region->getOwner() == gAgent.getID())); + BOOL manager = (region && region->isEstateManager()); + setCtrlsEnabled(god || owner || manager); + + getChildView("apply_btn")->setEnabled(FALSE); - LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]); - //Get parent floater name - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - LLFloater* parent_floater = panel ? gFloaterView->getParentFloater(panel) : NULL; - const std::string& parent_floater_name = parent_floater ? parent_floater->getName() : ""; - - //Determine the button that triggered opening of the avatar picker - //(so that a shadow frustum from the button to the avatar picker can be created) - LLView * button = NULL; - switch(change_info->mOperationFlag) - { - case ESTATE_ACCESS_ALLOWED_AGENT_ADD: - button = panel->findChild<LLButton>("add_allowed_avatar_btn"); - break; - - case ESTATE_ACCESS_BANNED_AGENT_ADD: - button = panel->findChild<LLButton>("add_banned_avatar_btn"); - break; - - case ESTATE_ACCESS_MANAGER_ADD: - button = panel->findChild<LLButton>("add_estate_manager_btn"); - break; - } + getChildView("message_estate_btn")->setEnabled(god || owner || manager); + getChildView("kick_user_from_estate_btn")->setEnabled(god || owner || manager); - // avatar picker yes multi-select, yes close-on-select - LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, (void*)change_info), - TRUE, TRUE, FALSE, parent_floater_name, button); + refresh(); +} - //Allows the closed parent floater to close the child floater (avatar picker) - if (child_floater) - { - parent_floater->addDependentFloater(child_floater); - } +bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region) +{ + updateControls(region); + + // let the parent class handle the general data collection. + bool rv = LLPanelRegionInfo::refreshFromRegion(region); + + // We want estate info. To make sure it works across region + // boundaries and multiple packets, we add a serial number to the + // integers and track against that on update. + strings_t strings; + //integers_t integers; + //LLFloaterRegionInfo::incrementSerial(); + LLFloaterRegionInfo::nextInvoice(); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + //integers.push_back(LLFloaterRegionInfo::());::getPanelEstate(); + + + sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings); + + refresh(); + + return rv; +} + +void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl) +{ + // Ensure appropriate state of the management ui. + updateControls(gAgent.getRegion()); +} + +bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg) +{ + LL_INFOS() << "LLPanelEstateInfo::estateUpdate()" << LL_ENDL; + return false; +} + + +BOOL LLPanelEstateInfo::postBuild() +{ + // set up the callbacks for the generic controls + initCtrl("externally_visible_radio"); + initCtrl("allow_direct_teleport"); + initCtrl("limit_payment"); + initCtrl("limit_age_verified"); + initCtrl("voice_chat_check"); + initCtrl("parcel_access_override"); + + childSetAction("message_estate_btn", boost::bind(&LLPanelEstateInfo::onClickMessageEstate, this)); + childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this)); + + getChild<LLUICtrl>("parcel_access_override")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAccessOverride, this)); + + getChild<LLUICtrl>("externally_visible_radio")->setFocus(TRUE); + + return LLPanelRegionInfo::postBuild(); +} + +void LLPanelEstateInfo::refresh() +{ + // Disable access restriction controls if they make no sense. + bool public_access = ("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); + + getChildView("Only Allow")->setEnabled(public_access); + getChildView("limit_payment")->setEnabled(public_access); + getChildView("limit_age_verified")->setEnabled(public_access); + + // if this is set to false, then the limit fields are meaningless and should be turned off + if (public_access == false) + { + getChild<LLUICtrl>("limit_payment")->setValue(false); + getChild<LLUICtrl>("limit_age_verified")->setValue(false); + } +} + +void LLPanelEstateInfo::refreshFromEstate() +{ + const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + + getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName()); + setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString()); + + getChild<LLUICtrl>("externally_visible_radio")->setValue(estate_info.getIsExternallyVisible() ? "estate_public_access" : "estate_restricted_access"); + getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat()); + getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport()); + getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous()); + getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified()); + getChild<LLUICtrl>("parcel_access_override")->setValue(estate_info.getAllowAccessOverride()); + + // Ensure appriopriate state of the management UI + updateControls(gAgent.getRegion()); + refresh(); +} + +BOOL LLPanelEstateInfo::sendUpdate() +{ + LL_INFOS() << "LLPanelEsateInfo::sendUpdate()" << LL_ENDL; + + LLNotification::Params params("ChangeLindenEstate"); + params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); + + if (isLindenEstate()) + { + // trying to change reserved estate, warn + LLNotifications::instance().add(params); + } + else + { + // for normal estates, just make the change + LLNotifications::instance().forceResponse(params, 0); + } + return TRUE; +} + +bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + switch(option) + { + case 0: + { + LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + + // update model + estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore + estate_info.setIsExternallyVisible("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); + estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean()); + estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean()); + estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()); + estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean()); + estate_info.setAllowAccessOverride(getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()); + // JIGGLYPUFF + //estate_info.setAllowAccessOverride(getChild<LLUICtrl>("")->getValue().asBoolean()); + // send the update to sim + estate_info.sendEstateInfo(); + } + + // we don't want to do this because we'll get it automatically from the sim + // after the spaceserver processes it +// else +// { +// // caps method does not automatically send this info +// LLFloaterRegionInfo::requestRegionInfo(); +// } + break; + case 1: + default: + // do nothing + break; + } + return false; +} + + +/* +// Request = "getowner" +// SParam[0] = "" (empty string) +// IParam[0] = serial +void LLPanelEstateInfo::getEstateOwner() +{ + // TODO -- disable the panel + // and call this function whenever we cross a region boundary + // re-enable when owner matches, and get new estate info + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_EstateOwnerRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + + msg->nextBlockFast(_PREHASH_RequestData); + msg->addStringFast(_PREHASH_Request, "getowner"); + + // we send an empty string so that the variable block is not empty + msg->nextBlockFast(_PREHASH_StringData); + msg->addStringFast(_PREHASH_SParam, ""); + + msg->nextBlockFast(_PREHASH_IntegerData); + msg->addS32Fast(_PREHASH_IParam, LLFloaterRegionInfo::getSerial()); + + gAgent.sendMessage(); +} +*/ + +const std::string LLPanelEstateInfo::getOwnerName() const +{ + return getChild<LLUICtrl>("estate_owner")->getValue().asString(); +} + +void LLPanelEstateInfo::setOwnerName(const std::string& name) +{ + getChild<LLUICtrl>("estate_owner")->setValue(LLSD(name)); +} + +// static +void LLPanelEstateInfo::onClickMessageEstate(void* userdata) +{ + LL_INFOS() << "LLPanelEstateInfo::onClickMessageEstate" << LL_ENDL; + LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2)); +} + +bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + std::string text = response["message"].asString(); + if(option != 0) return false; + if(text.empty()) return false; + LL_INFOS() << "Message to everyone: " << text << LL_ENDL; + strings_t strings; + //integers_t integers; + std::string name; + LLAgentUI::buildFullname(name); + strings.push_back(strings_t::value_type(name)); + strings.push_back(strings_t::value_type(text)); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "instantmessage", invoice, strings); + return false; +} + +void LLPanelEstateInfo::onChangeAccessOverride() +{ + if (!getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()) + { + LLNotificationsUtil::add("EstateParcelAccessOverride"); + } +} + +LLPanelEstateCovenant::LLPanelEstateCovenant() + : + mCovenantID(LLUUID::null), + mAssetStatus(ASSET_ERROR) +{ +} + +// virtual +bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region) +{ + LLTextBox* region_name = getChild<LLTextBox>("region_name_text"); + if (region_name) + { + region_name->setText(region->getName()); + } + + LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); + if (resellable_clause) + { + if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) + { + resellable_clause->setText(getString("can_not_resell")); + } + else + { + resellable_clause->setText(getString("can_resell")); + } + } + + LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); + if (changeable_clause) + { + if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) + { + changeable_clause->setText(getString("can_change")); + } + else + { + changeable_clause->setText(getString("can_not_change")); + } + } + + LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text"); + if (region_maturity) + { + region_maturity->setText(region->getSimAccessString()); + } + + LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); + region_landtype->setText(region->getLocalizedSimProductName()); + + // let the parent class handle the general data collection. + bool rv = LLPanelRegionInfo::refreshFromRegion(region); + LLMessageSystem *msg = gMessageSystem; + msg->newMessage("EstateCovenantRequest"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); + msg->sendReliable(region->getHost()); + return rv; +} + +// virtual +bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg) +{ + LL_INFOS() << "LLPanelEstateCovenant::estateUpdate()" << LL_ENDL; + return true; +} + +// virtual +BOOL LLPanelEstateCovenant::postBuild() +{ + mEstateNameText = getChild<LLTextBox>("estate_name_text"); + mEstateOwnerText = getChild<LLTextBox>("estate_owner_text"); + mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text"); + mEditor = getChild<LLViewerTextEditor>("covenant_editor"); + LLButton* reset_button = getChild<LLButton>("reset_covenant"); + reset_button->setEnabled(gAgent.canManageEstate()); + reset_button->setClickedCallback(LLPanelEstateCovenant::resetCovenantID, NULL); + + return LLPanelRegionInfo::postBuild(); +} + +// virtual +void LLPanelEstateCovenant::updateChild(LLUICtrl* child_ctrl) +{ +} + +// virtual +BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + LLInventoryItem* item = (LLInventoryItem*)cargo_data; + + if (!gAgent.canManageEstate()) + { + *accept = ACCEPT_NO; + return TRUE; + } + + switch(cargo_type) + { + case DAD_NOTECARD: + *accept = ACCEPT_YES_COPY_SINGLE; + if (item && drop) + { + LLSD payload; + payload["item_id"] = item->getUUID(); + LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload, + LLPanelEstateCovenant::confirmChangeCovenantCallback); + } + break; + default: + *accept = ACCEPT_NO; + break; + } + + return TRUE; +} + +// static +bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); + LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); + + if (!item || !self) return false; + + switch(option) + { + case 0: + self->loadInvItem(item); + break; + default: + break; + } + return false; +} + +// static +void LLPanelEstateCovenant::resetCovenantID(void* userdata) +{ + LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback); +} + +// static +bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notification, const LLSD& response) +{ + LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); + if (!self) return false; + + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + switch(option) + { + case 0: + self->loadInvItem(NULL); + break; + default: + break; + } + return false; +} + +void LLPanelEstateCovenant::loadInvItem(LLInventoryItem *itemp) +{ + const BOOL high_priority = TRUE; + if (itemp) + { + gAssetStorage->getInvItemAsset(gAgent.getRegionHost(), + gAgent.getID(), + gAgent.getSessionID(), + itemp->getPermissions().getOwner(), + LLUUID::null, + itemp->getUUID(), + itemp->getAssetUUID(), + itemp->getType(), + onLoadComplete, + (void*)this, + high_priority); + mAssetStatus = ASSET_LOADING; + } + else + { + mAssetStatus = ASSET_LOADED; + setCovenantTextEditor(LLTrans::getString("RegionNoCovenant")); + sendChangeCovenantID(LLUUID::null); + } +} + +// static +void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status) +{ + LL_INFOS() << "LLPanelEstateCovenant::onLoadComplete()" << LL_ENDL; + LLPanelEstateCovenant* panelp = (LLPanelEstateCovenant*)user_data; + if( panelp ) + { + if(0 == status) + { + LLVFile file(vfs, asset_uuid, type, LLVFile::READ); + + S32 file_length = file.getSize(); + + std::vector<char> buffer(file_length+1); + file.read((U8*)&buffer[0], file_length); + // put a EOS at the end + buffer[file_length] = 0; + + if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) ) + { + if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) ) + { + LL_WARNS() << "Problem importing estate covenant." << LL_ENDL; + LLNotificationsUtil::add("ProblemImportingEstateCovenant"); + } + else + { + panelp->sendChangeCovenantID(asset_uuid); + } + } + else + { + // Version 0 (just text, doesn't include version number) + panelp->sendChangeCovenantID(asset_uuid); + } + } + else + { + if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || + LL_ERR_FILE_EMPTY == status) + { + LLNotificationsUtil::add("MissingNotecardAssetID"); + } + else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) + { + LLNotificationsUtil::add("NotAllowedToViewNotecard"); + } + else + { + LLNotificationsUtil::add("UnableToLoadNotecardAsset"); + } - return false; + LL_WARNS() << "Problem loading notecard: " << status << LL_ENDL; + } + panelp->mAssetStatus = ASSET_LOADED; + panelp->setCovenantID(asset_uuid); + } } -// static -void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, void* data) +// key = "estatechangecovenantid" +// strings[0] = str(estate_id) (added by simulator before relay - not here) +// strings[1] = str(covenant_id) +void LLPanelEstateCovenant::sendChangeCovenantID(const LLUUID &asset_id) { - LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data; - if (!change_info) return; - if (ids.empty()) - { - // User didn't select a name. - delete change_info; - change_info = NULL; - return; - } - // User did select a name. - change_info->mAgentOrGroupIDs = ids; - // Can't put estate owner on ban list - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - if (!panel) return; - LLViewerRegion* region = gAgent.getRegion(); - if (!region) return; - - if (change_info->mOperationFlag & ESTATE_ACCESS_ALLOWED_AGENT_ADD) - { - LLCtrlListInterface *list = panel->childGetListInterface("allowed_avatar_name_list"); - int currentCount = (list ? list->getItemCount() : 0); - if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["NUM_ADDED"] = llformat("%d",ids.size()); - args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); - args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); - delete change_info; - return; - } - } - if (change_info->mOperationFlag & ESTATE_ACCESS_BANNED_AGENT_ADD) + if (asset_id != getCovenantID()) { - LLCtrlListInterface *list = panel->childGetListInterface("banned_avatar_name_list"); - int currentCount = (list ? list->getItemCount() : 0); - if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["NUM_ADDED"] = llformat("%d",ids.size()); - args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); - args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); - delete change_info; - return; - } + setCovenantID(asset_id); + + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("EstateOwnerMessage"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used + + msg->nextBlock("MethodData"); + msg->addString("Method", "estatechangecovenantid"); + msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); + + msg->nextBlock("ParamList"); + msg->addString("Parameter", getCovenantID().asString()); + gAgent.sendReliableMessage(); } +} - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); +// virtual +BOOL LLPanelEstateCovenant::sendUpdate() +{ + return TRUE; +} - LLNotification::Params params(change_info->mDialogName); - params.substitutions(args) - .payload(change_info->asLLSD()) - .functor.function(accessCoreConfirm); +std::string LLPanelEstateCovenant::getEstateName() const +{ + return mEstateNameText->getText(); +} - if (isLindenEstate()) +void LLPanelEstateCovenant::setEstateName(const std::string& name) +{ + mEstateNameText->setText(name); +} + +// static +void LLPanelEstateCovenant::updateCovenantText(const std::string& string, const LLUUID& asset_id) +{ + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) { - // just apply to this estate - LLNotifications::instance().forceResponse(params, 0); + panelp->mEditor->setText(string); + panelp->setCovenantID(asset_id); } - else +} + +// static +void LLPanelEstateCovenant::updateEstateName(const std::string& name) +{ + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) { - // ask if this estate or all estates with this owner - LLNotifications::instance().add(params); + panelp->mEstateNameText->setText(name); } } // static -void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name) +void LLPanelEstateCovenant::updateLastModified(const std::string& text) { - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - if (!panel) return; - LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_ctrl_name); - if (!name_list) return; - - std::vector<LLScrollListItem*> list_vector = name_list->getAllSelected(); - if (list_vector.size() == 0) - return; + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) + { + panelp->mLastModifiedText->setText(text); + } +} - LLSD payload; - payload["operation"] = (S32)operation_flag; - payload["dialog_name"] = dialog_name; - - for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin(); - iter != list_vector.end(); - iter++) +// static +void LLPanelEstateCovenant::updateEstateOwnerName(const std::string& name) +{ + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) { - LLScrollListItem *item = (*iter); - payload["allowed_ids"].append(item->getUUID()); + panelp->mEstateOwnerText->setText(name); } - - LLNotification::Params params("ChangeLindenAccess"); - params.payload(payload) - .functor.function(accessRemoveCore2); +} - if (isLindenEstate()) +std::string LLPanelEstateCovenant::getOwnerName() const +{ + return mEstateOwnerText->getText(); +} + +void LLPanelEstateCovenant::setOwnerName(const std::string& name) +{ + mEstateOwnerText->setText(name); +} + +void LLPanelEstateCovenant::setCovenantTextEditor(const std::string& text) +{ + mEditor->setText(text); +} + +// key = "estateupdateinfo" +// strings[0] = estate name +// strings[1] = str(owner_id) +// strings[2] = str(estate_id) +// strings[3] = str(estate_flags) +// strings[4] = str((S32)(sun_hour * 1024)) +// strings[5] = str(parent_estate_id) +// strings[6] = str(covenant_id) +// strings[7] = str(covenant_timestamp) +// strings[8] = str(send_to_agent_only) +// strings[9] = str(abuse_email_addr) +bool LLDispatchEstateUpdateInfo::operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings) +{ + LL_DEBUGS() << "Received estate update" << LL_ENDL; + + // Update estate info model. + // This will call LLPanelEstateInfo::refreshFromEstate(). + // *TODO: Move estate message handling stuff to llestateinfomodel.cpp. + LLEstateInfoModel::instance().update(strings); + + return true; +} + +bool LLDispatchSetEstateAccess::operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (panel && panel->getPendingUpdate()) { - // warn on change linden estate - LLNotifications::instance().add(params); + panel->setPendingUpdate(false); + panel->updateLists(); } - else + return true; +} + +LLSD LLDispatchSetEstateExperience::getIDs( sparam_t::const_iterator it, sparam_t::const_iterator end, S32 count ) +{ + LLSD idList = LLSD::emptyArray(); + LLUUID id; + while(count--> 0) { - // just proceed, as if clicking OK - LLNotifications::instance().forceResponse(params, 0); + memcpy(id.mData, (*(it++)).data(), UUID_BYTES); + idList.append(id); } + return idList; } -// static -bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD& response) +// key = "setexperience" +// strings[0] = str(estate_id) +// strings[1] = str(send_to_agent_only) +// strings[2] = str(num blocked) +// strings[3] = str(num trusted) +// strings[4] = str(num allowed) +// strings[8] = bin(uuid) ... +// ... +bool LLDispatchSetEstateExperience::operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option != 0) + LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences(); + if (!panel) return true; + + sparam_t::const_iterator it = strings.begin(); + ++it; // U32 estate_id = strtol((*it).c_str(), NULL, 10); + ++it; // U32 send_to_agent_only = strtoul((*(++it)).c_str(), NULL, 10); + + LLUUID id; + S32 num_blocked = strtol((*(it++)).c_str(), NULL, 10); + S32 num_trusted = strtol((*(it++)).c_str(), NULL, 10); + S32 num_allowed = strtol((*(it++)).c_str(), NULL, 10); + + LLSD ids = LLSD::emptyMap() + .with("blocked", getIDs(it, strings.end(), num_blocked)) + .with("trusted", getIDs(it + (num_blocked), strings.end(), num_trusted)) + .with("allowed", getIDs(it + (num_blocked+num_trusted), strings.end(), num_allowed)); + + panel->processResponse(ids); + + return true; +} + +BOOL LLPanelRegionExperiences::postBuild() +{ + mAllowed = setupList("panel_allowed", ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE); + mTrusted = setupList("panel_trusted", ESTATE_EXPERIENCE_TRUSTED_ADD, ESTATE_EXPERIENCE_TRUSTED_REMOVE); + mBlocked = setupList("panel_blocked", ESTATE_EXPERIENCE_BLOCKED_ADD, ESTATE_EXPERIENCE_BLOCKED_REMOVE); + + getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(TRUE); + getChild<LLTextBox>("experiences_help_text")->setText(getString("estate_caption")); + getChild<LLTextBox>("trusted_text_help")->setText(getString("trusted_estate_text")); + getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_estate_text")); + getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_estate_text")); + + return LLPanelRegionInfo::postBuild(); +} + +LLPanelExperienceListEditor* LLPanelRegionExperiences::setupList( const char* control_name, U32 add_id, U32 remove_id ) +{ + LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name); + if(child) { - // abort - return false; + child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name)); + child->setMaxExperienceIDs(ESTATE_MAX_EXPERIENCE_IDS); + child->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, add_id, _1)); + child->setRemovedCallback(boost::bind(&LLPanelRegionExperiences::itemChanged, this, remove_id, _1)); } - // If Linden estate, can only apply to "this" estate, not all estates - // owned by NULL. - if (isLindenEstate()) + return child; +} + + +void LLPanelRegionExperiences::processResponse( const LLSD& content ) +{ + if(content.has("default")) { - accessCoreConfirm(notification, response); + mDefaultExperience = content["default"].asUUID(); } - else + + mAllowed->setExperienceIds(content["allowed"]); + mBlocked->setExperienceIds(content["blocked"]); + + LLSD trusted = content["trusted"]; + if(mDefaultExperience.notNull()) { - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); - LLNotificationsUtil::add(notification["payload"]["dialog_name"], - args, - notification["payload"], - accessCoreConfirm); + mTrusted->setStickyFunction(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); + trusted.append(mDefaultExperience); } - return false; + + mTrusted->setExperienceIds(trusted); + + mAllowed->refreshExperienceCounter(); + mBlocked->refreshExperienceCounter(); + mTrusted->refreshExperienceCounter(); + } -// Used for both access add and remove operations, depending on the mOperationFlag -// passed in (ESTATE_ACCESS_BANNED_AGENT_ADD, ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, etc.) +// Used for both access add and remove operations, depending on the flag +// passed in (ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE, etc.) // static -bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& response) +bool LLPanelRegionExperiences::experienceCoreConfirm(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger(); @@ -1944,18 +2546,12 @@ bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& if (iter + 1 != end_it) flags |= ESTATE_ACCESS_NO_REPLY; - const LLUUID id = iter->asUUID(); - if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD) - && region && (region->getOwner() == id)) - { - LLNotificationsUtil::add("OwnerCanNotBeDenied"); - break; - } + const LLUUID id = iter->asUUID(); switch(option) { case 0: // This estate - sendEstateAccessDelta(flags, id); + sendEstateExperienceDelta(flags, id); break; case 1: { @@ -1966,12 +2562,12 @@ bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& || gAgent.isGodlike()) { flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES; - sendEstateAccessDelta(flags, id); + sendEstateExperienceDelta(flags, id); } else if (region->isEstateManager()) { flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; - sendEstateAccessDelta(flags, id); + sendEstateExperienceDelta(flags, id); } break; } @@ -1983,1157 +2579,1120 @@ bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& return false; } -// key = "estateaccessdelta" -// str(estate_id) will be added to front of list by forward_EstateOwnerRequest_to_dataserver -// str[0] = str(agent_id) requesting the change -// str[1] = str(flags) (ESTATE_ACCESS_DELTA_*) -// str[2] = str(agent_id) to add or remove -// static -void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_group_id) -{ - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("EstateOwnerMessage"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - - msg->nextBlock("MethodData"); - msg->addString("Method", "estateaccessdelta"); - msg->addUUID("Invoice", LLEstateInfoModel::instance().getLastInvoice()); - - std::string buf; - gAgent.getID().toString(buf); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); - - buf = llformat("%u", flags); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); - - agent_or_group_id.toString(buf); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); - - - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - - if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | - ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_REMOVE)) - { - - panel->clearAccessLists(); - } - - gAgent.sendReliableMessage(); -} -// static -void LLPanelEstateInfo::updateEstateOwnerName(const std::string& name) +// Send the actual "estateexperiencedelta" message +void LLPanelRegionExperiences::sendEstateExperienceDelta(U32 flags, const LLUUID& experience_id) { - LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); - if (panelp) - { - panelp->setOwnerName(name); - } -} + strings_t str(3, std::string()); + gAgent.getID().toString(str[0]); + str[1] = llformat("%u", flags); + experience_id.toString(str[2]); -// static -void LLPanelEstateInfo::updateEstateName(const std::string& name) -{ - LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); - if (panelp) + LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences(); + if (panel) { - panelp->getChildRef<LLTextBox>("estate_name").setText(name); + panel->sendEstateOwnerMessage(gMessageSystem, "estateexperiencedelta", LLFloaterRegionInfo::getLastInvoice(), str); } } -void LLPanelEstateInfo::updateControls(LLViewerRegion* region) -{ - BOOL god = gAgent.isGodlike(); - BOOL owner = (region && (region->getOwner() == gAgent.getID())); - BOOL manager = (region && region->isEstateManager()); - setCtrlsEnabled(god || owner || manager); - - getChildView("apply_btn")->setEnabled(FALSE); - - BOOL has_allowed_avatar = getChild<LLNameListCtrl>("allowed_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; - BOOL has_allowed_group = getChild<LLNameListCtrl>("allowed_group_name_list")->getFirstSelected() ? TRUE : FALSE; - BOOL has_banned_agent = getChild<LLNameListCtrl>("banned_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; - BOOL has_estate_manager = getChild<LLNameListCtrl>("estate_manager_name_list")->getFirstSelected() ? TRUE : FALSE; - - getChildView("add_allowed_avatar_btn")->setEnabled(god || owner || manager); - getChildView("remove_allowed_avatar_btn")->setEnabled(has_allowed_avatar && (god || owner || manager)); - getChildView("allowed_avatar_name_list")->setEnabled(god || owner || manager); - - getChildView("add_allowed_group_btn")->setEnabled(god || owner || manager); - getChildView("remove_allowed_group_btn")->setEnabled(has_allowed_group && (god || owner || manager) ); - getChildView("allowed_group_name_list")->setEnabled(god || owner || manager); - - // Can't ban people from mainland, orientation islands, etc. because this - // creates much network traffic and server load. - // Disable their accounts in CSR tool instead. - bool linden_estate = isLindenEstate(); - bool enable_ban = (god || owner || manager) && !linden_estate; - getChildView("add_banned_avatar_btn")->setEnabled(enable_ban); - getChildView("remove_banned_avatar_btn")->setEnabled(has_banned_agent && enable_ban); - getChildView("banned_avatar_name_list")->setEnabled(god || owner || manager); - - getChildView("message_estate_btn")->setEnabled(god || owner || manager); - getChildView("kick_user_from_estate_btn")->setEnabled(god || owner || manager); - - // estate managers can't add estate managers - getChildView("add_estate_manager_btn")->setEnabled(god || owner); - getChildView("remove_estate_manager_btn")->setEnabled(has_estate_manager && (god || owner)); - getChildView("estate_manager_name_list")->setEnabled(god || owner); - - refresh(); -} - -bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region) -{ - updateControls(region); - - // let the parent class handle the general data collection. - bool rv = LLPanelRegionInfo::refreshFromRegion(region); - - // We want estate info. To make sure it works across region - // boundaries and multiple packets, we add a serial number to the - // integers and track against that on update. - strings_t strings; - //integers_t integers; - //LLFloaterRegionInfo::incrementSerial(); - //integers.push_back(LLFloaterRegionInfo::());::getPanelEstate(); - - - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - panel->clearAccessLists(); - - LLEstateInfoModel::instance().setRegion(region); - refresh(); +void LLPanelRegionExperiences::infoCallback(LLHandle<LLPanelRegionExperiences> handle, const LLSD& content) +{ + if(handle.isDead()) + return; - return rv; + LLPanelRegionExperiences* floater = handle.get(); + if (floater) + { + floater->processResponse(content); + } } -void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl) +/*static*/ +std::string LLPanelRegionExperiences::regionCapabilityQuery(LLViewerRegion* region, const std::string &cap) { - // Ensure appropriate state of the management ui. - updateControls(gAgent.getRegion()); -} + // region->getHandle() How to get a region * from a handle? -bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg) -{ - LL_INFOS() << "LLPanelEstateInfo::estateUpdate()" << LL_ENDL; - return false; + return region->getCapability(cap); } - -BOOL LLPanelEstateInfo::postBuild() +bool LLPanelRegionExperiences::refreshFromRegion(LLViewerRegion* region) { - // set up the callbacks for the generic controls - initCtrl("externally_visible_radio"); - initCtrl("allow_direct_teleport"); - initCtrl("limit_payment"); - initCtrl("limit_age_verified"); - initCtrl("voice_chat_check"); - initCtrl("parcel_access_override"); - - getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list"); - if (avatar_name_list) - { - avatar_name_list->setCommitOnSelectionChange(TRUE); - avatar_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); - } - - childSetAction("add_allowed_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickAddAllowedAgent, this)); - childSetAction("remove_allowed_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveAllowedAgent, this)); - - getChild<LLUICtrl>("allowed_group_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl* group_name_list = getChild<LLNameListCtrl>("allowed_group_name_list"); - if (group_name_list) - { - group_name_list->setCommitOnSelectionChange(TRUE); - group_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); - } - - getChild<LLUICtrl>("add_allowed_group_btn")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onClickAddAllowedGroup, this)); - childSetAction("remove_allowed_group_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveAllowedGroup, this)); - - getChild<LLUICtrl>("banned_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl* banned_name_list = getChild<LLNameListCtrl>("banned_avatar_name_list"); - if (banned_name_list) - { - banned_name_list->setCommitOnSelectionChange(TRUE); - banned_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); - } - - childSetAction("add_banned_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickAddBannedAgent, this)); - childSetAction("remove_banned_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveBannedAgent, this)); + BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate()); - getChild<LLUICtrl>("estate_manager_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl* manager_name_list = getChild<LLNameListCtrl>("estate_manager_name_list"); - if (manager_name_list) - { - manager_name_list->setCommitOnSelectionChange(TRUE); - manager_name_list->setMaxItemCount(ESTATE_MAX_MANAGERS * 4); // Allow extras for dupe issue - } + mAllowed->loading(); + mAllowed->setReadonly(!allow_modify); + // remove grid-wide experiences + mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID)); + // remove default experience + mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); - childSetAction("add_estate_manager_btn", boost::bind(&LLPanelEstateInfo::onClickAddEstateManager, this)); - childSetAction("remove_estate_manager_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveEstateManager, this)); - childSetAction("message_estate_btn", boost::bind(&LLPanelEstateInfo::onClickMessageEstate, this)); - childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this)); + mBlocked->loading(); + mBlocked->setReadonly(!allow_modify); + // only grid-wide experiences + mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperty, _1, LLExperienceCache::PROPERTY_GRID)); + // but not privileged ones + mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_PRIVILEGED)); + // remove default experience + mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); - getChild<LLUICtrl>("parcel_access_override")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAccessOverride, this)); + mTrusted->loading(); + mTrusted->setReadonly(!allow_modify); - getChild<LLUICtrl>("externally_visible_radio")->setFocus(TRUE); + LLExperienceCache::instance().getRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), + boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); - return LLPanelRegionInfo::postBuild(); + return LLPanelRegionInfo::refreshFromRegion(region); } -void LLPanelEstateInfo::refresh() +LLSD LLPanelRegionExperiences::addIds(LLPanelExperienceListEditor* panel) { - // Disable access restriction controls if they make no sense. - bool public_access = ("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); - - getChildView("Only Allow")->setEnabled(public_access); - getChildView("limit_payment")->setEnabled(public_access); - getChildView("limit_age_verified")->setEnabled(public_access); - - // if this is set to false, then the limit fields are meaningless and should be turned off - if (public_access == false) + LLSD ids; + const uuid_list_t& id_list = panel->getExperienceIds(); + for(uuid_list_t::const_iterator it = id_list.begin(); it != id_list.end(); ++it) { - getChild<LLUICtrl>("limit_payment")->setValue(false); - getChild<LLUICtrl>("limit_age_verified")->setValue(false); + ids.append(*it); } -} - -void LLPanelEstateInfo::refreshFromEstate() -{ - const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); - - getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName()); - setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString()); - - getChild<LLUICtrl>("externally_visible_radio")->setValue(estate_info.getIsExternallyVisible() ? "estate_public_access" : "estate_restricted_access"); - getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat()); - getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport()); - getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous()); - getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified()); - getChild<LLUICtrl>("parcel_access_override")->setValue(estate_info.getAllowAccessOverride()); - - // Ensure appriopriate state of the management UI - updateControls(gAgent.getRegion()); - refresh(); + return ids; } -void LLPanelEstateInfo::refreshAccessFromEstate(U32 flags) +BOOL LLPanelRegionExperiences::sendUpdate() { - const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); - - // grab the UUID's out of the string fields - if (flags & ESTATE_ACCESS_ALLOWED_AGENTS) - { - LLNameListCtrl *allowed_agent_name_list(getChild<LLNameListCtrl>("allowed_avatar_name_list")); - - const uuid_set_t& allowed_agents(estate_info.getAllowedAgents()); - int totalAllowedAgents = allowed_agents.size(); - - if (allowed_agent_name_list) - { - totalAllowedAgents += allowed_agent_name_list->getItemCount(); - } - - LLStringUtil::format_map_t args; - args["[ALLOWEDAGENTS]"] = llformat("%d", totalAllowedAgents); - args["[MAXACCESS]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); - std::string msg = LLTrans::getString("RegionInfoAllowedResidents", args); - getChild<LLUICtrl>("allow_resident_label")->setValue(LLSD(msg)); - - if (allowed_agent_name_list) - { - // Don't sort these as we add them, sort them when we are done. - allowed_agent_name_list->clearSortOrder(); - allowed_agent_name_list->deleteAllItems(); - - for (const LLUUID &id : allowed_agents) - { - allowed_agent_name_list->addNameItem(id); - } - allowed_agent_name_list->sortByName(TRUE); - } - } - - if (flags & ESTATE_ACCESS_ALLOWED_GROUPS) - { - LLNameListCtrl* allowed_group_name_list(getChild<LLNameListCtrl>("allowed_group_name_list")); - const uuid_set_t &allowed_groups(estate_info.getAllowedGroups()); - - LLStringUtil::format_map_t args; - args["[ALLOWEDGROUPS]"] = llformat("%d", allowed_groups.size()); - args["[MAXACCESS]"] = llformat("%d", ESTATE_MAX_GROUP_IDS); - std::string msg = LLTrans::getString("RegionInfoAllowedGroups", args); - getChild<LLUICtrl>("allow_group_label")->setValue(LLSD(msg)); - - if (allowed_group_name_list) - { - // Don't sort these as we add them, sort them when we are done. - allowed_group_name_list->clearSortOrder(); - allowed_group_name_list->deleteAllItems(); - - for (const LLUUID &id: allowed_groups) - { - allowed_group_name_list->addGroupNameItem(id); - } - allowed_group_name_list->sortByName(TRUE); - } - } - - if (flags & ESTATE_ACCESS_BANNED_AGENTS) - { - LLNameListCtrl* banned_agent_name_list(getChild<LLNameListCtrl>("banned_avatar_name_list")); - const uuid_set_t &banned_agents(estate_info.getBannedAgents()); - int totalBannedAgents = banned_agents.size(); + LLViewerRegion* region = gAgent.getRegion(); - if (banned_agent_name_list) - { - totalBannedAgents += banned_agent_name_list->getItemCount(); - } + LLSD content; + content["allowed"]=addIds(mAllowed); + content["blocked"]=addIds(mBlocked); + content["trusted"]=addIds(mTrusted); - LLStringUtil::format_map_t args; - args["[BANNEDAGENTS]"] = llformat("%d", totalBannedAgents); - args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); - std::string msg = LLTrans::getString("RegionInfoBannedResidents", args); - getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg)); + LLExperienceCache::instance().setRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), + content, boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); - if (banned_agent_name_list) - { - // Don't sort these as we add them, sort them when we are done. - banned_agent_name_list->clearSortOrder(); - - for (const LLUUID &id: banned_agents) - { - banned_agent_name_list->addNameItem(id); - } - banned_agent_name_list->sortByName(TRUE); - } - } + return TRUE; +} - if (flags & ESTATE_ACCESS_MANAGERS) - { - LLNameListCtrl* estate_manager_name_list(getChild<LLNameListCtrl>("estate_manager_name_list")); - const uuid_set_t &estate_mgrs(estate_info.getEstateManagers()); +void LLPanelRegionExperiences::itemChanged( U32 event_type, const LLUUID& id ) +{ + std::string dialog_name; + switch (event_type) + { + case ESTATE_EXPERIENCE_ALLOWED_ADD: + dialog_name = "EstateAllowedExperienceAdd"; + break; - LLStringUtil::format_map_t args; - args["[ESTATEMANAGERS]"] = llformat("%d", estate_mgrs.size()); - args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); - std::string msg = LLTrans::getString("RegionInfoEstateManagers", args); - getChild<LLUICtrl>("estate_manager_label")->setValue(LLSD(msg)); + case ESTATE_EXPERIENCE_ALLOWED_REMOVE: + dialog_name = "EstateAllowedExperienceRemove"; + break; - if (estate_manager_name_list) - { - // Don't sort these as we add them, sort them when we are done. - estate_manager_name_list->clearSortOrder(); - estate_manager_name_list->deleteAllItems(); // Clear existing entries - - // There should be only ESTATE_MAX_MANAGERS people in the list, but if the database gets more (SL-46107) don't - // truncate the list unless it's really big. Go ahead and show the extras so the user doesn't get confused, - // and they can still remove them. - for (const LLUUID &id : estate_mgrs) - { - estate_manager_name_list->addNameItem(id); - } - estate_manager_name_list->sortByName(TRUE); - } - } + case ESTATE_EXPERIENCE_TRUSTED_ADD: + dialog_name = "EstateTrustedExperienceAdd"; + break; - // Update the buttons which may change based on the list contents but also needs to account for general access features. - updateControls(gAgent.getRegion()); -} + case ESTATE_EXPERIENCE_TRUSTED_REMOVE: + dialog_name = "EstateTrustedExperienceRemove"; + break; + case ESTATE_EXPERIENCE_BLOCKED_ADD: + dialog_name = "EstateBlockedExperienceAdd"; + break; -namespace -{ - LLSD set_to_llsdarray(const uuid_set_t &values) - { - LLSD result(LLSD::emptyArray()); + case ESTATE_EXPERIENCE_BLOCKED_REMOVE: + dialog_name = "EstateBlockedExperienceRemove"; + break; - for (const LLUUID &id : values) - { - result.append(id); - } - return result; - } -} + default: + return; + } -BOOL LLPanelEstateInfo::sendUpdate() -{ - LL_INFOS() << "LLPanelEsateInfo::sendUpdate()" << LL_ENDL; + LLSD payload; + payload["operation"] = (S32)event_type; + payload["dialog_name"] = dialog_name; + payload["allowed_ids"].append(id); - LLNotification::Params params("ChangeLindenEstate"); - params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); - if (isLindenEstate()) + LLNotification::Params params(dialog_name); + params.payload(payload) + .substitutions(args) + .functor.function(LLPanelRegionExperiences::experienceCoreConfirm); + if (LLPanelEstateInfo::isLindenEstate()) { - // trying to change reserved estate, warn - LLNotifications::instance().add(params); + LLNotifications::instance().forceResponse(params, 0); } else { - // for normal estates, just make the change - LLNotifications::instance().forceResponse(params, 0); + LLNotifications::instance().add(params); } - return TRUE; + + onChangeAnything(); } -bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response) + +LLPanelEstateAccess::LLPanelEstateAccess() +: LLPanelRegionInfo(), mPendingUpdate(false) +{} + +BOOL LLPanelEstateAccess::postBuild() { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - switch(option) + getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list"); + if (avatar_name_list) { - case 0: - { - LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + avatar_name_list->setCommitOnSelectionChange(TRUE); + avatar_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); + } - // update model - estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore - estate_info.setIsExternallyVisible("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); - estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean()); - estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean()); - estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()); - estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean()); - estate_info.setAllowAccessOverride(getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()); - // send the update to sim - estate_info.sendEstateInfo(); - } + getChild<LLUICtrl>("allowed_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onAllowedSearchEdit, this, _2)); + childSetAction("add_allowed_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickAddAllowedAgent, this)); + childSetAction("remove_allowed_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveAllowedAgent, this)); + childSetAction("copy_allowed_list_btn", boost::bind(&LLPanelEstateAccess::onClickCopyAllowedList, this)); - // we don't want to do this because we'll get it automatically from the sim - // after the spaceserver processes it -// else -// { -// // caps method does not automatically send this info -// LLFloaterRegionInfo::requestRegionInfo(); -// } - break; - case 1: - default: - // do nothing - break; + getChild<LLUICtrl>("allowed_group_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl* group_name_list = getChild<LLNameListCtrl>("allowed_group_name_list"); + if (group_name_list) + { + group_name_list->setCommitOnSelectionChange(TRUE); + group_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); } - return false; -} - -/* -// Request = "getowner" -// SParam[0] = "" (empty string) -// IParam[0] = serial -void LLPanelEstateInfo::getEstateOwner() -{ - // TODO -- disable the panel - // and call this function whenever we cross a region boundary - // re-enable when owner matches, and get new estate info - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_EstateOwnerRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + getChild<LLUICtrl>("allowed_group_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onAllowedGroupsSearchEdit, this, _2)); + getChild<LLUICtrl>("add_allowed_group_btn")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onClickAddAllowedGroup, this)); + childSetAction("remove_allowed_group_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveAllowedGroup, this)); + childSetAction("copy_allowed_group_list_btn", boost::bind(&LLPanelEstateAccess::onClickCopyAllowedGroupList, this)); - msg->nextBlockFast(_PREHASH_RequestData); - msg->addStringFast(_PREHASH_Request, "getowner"); + getChild<LLUICtrl>("banned_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl* banned_name_list = getChild<LLNameListCtrl>("banned_avatar_name_list"); + if (banned_name_list) + { + banned_name_list->setCommitOnSelectionChange(TRUE); + banned_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); + } - // we send an empty string so that the variable block is not empty - msg->nextBlockFast(_PREHASH_StringData); - msg->addStringFast(_PREHASH_SParam, ""); + getChild<LLUICtrl>("banned_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onBannedSearchEdit, this, _2)); + childSetAction("add_banned_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickAddBannedAgent, this)); + childSetAction("remove_banned_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveBannedAgent, this)); + childSetAction("copy_banned_list_btn", boost::bind(&LLPanelEstateAccess::onClickCopyBannedList, this)); - msg->nextBlockFast(_PREHASH_IntegerData); - msg->addS32Fast(_PREHASH_IParam, LLFloaterRegionInfo::getSerial()); + getChild<LLUICtrl>("estate_manager_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl* manager_name_list = getChild<LLNameListCtrl>("estate_manager_name_list"); + if (manager_name_list) + { + manager_name_list->setCommitOnSelectionChange(TRUE); + manager_name_list->setMaxItemCount(ESTATE_MAX_MANAGERS * 4); // Allow extras for dupe issue + } - gAgent.sendMessage(); -} -*/ + childSetAction("add_estate_manager_btn", boost::bind(&LLPanelEstateAccess::onClickAddEstateManager, this)); + childSetAction("remove_estate_manager_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveEstateManager, this)); -const std::string LLPanelEstateInfo::getOwnerName() const -{ - return getChild<LLUICtrl>("estate_owner")->getValue().asString(); + return TRUE; } -void LLPanelEstateInfo::setOwnerName(const std::string& name) +void LLPanelEstateAccess::updateControls(LLViewerRegion* region) { - getChild<LLUICtrl>("estate_owner")->setValue(LLSD(name)); -} + BOOL god = gAgent.isGodlike(); + BOOL owner = (region && (region->getOwner() == gAgent.getID())); + BOOL manager = (region && region->isEstateManager()); + BOOL enable_cotrols = god || owner || manager; + setCtrlsEnabled(enable_cotrols); + + BOOL has_allowed_avatar = getChild<LLNameListCtrl>("allowed_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; + BOOL has_allowed_group = getChild<LLNameListCtrl>("allowed_group_name_list")->getFirstSelected() ? TRUE : FALSE; + BOOL has_banned_agent = getChild<LLNameListCtrl>("banned_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; + BOOL has_estate_manager = getChild<LLNameListCtrl>("estate_manager_name_list")->getFirstSelected() ? TRUE : FALSE; -void LLPanelEstateInfo::clearAccessLists() -{ - LLNameListCtrl* name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list"); - if (name_list) - { - name_list->deleteAllItems(); - } + getChildView("add_allowed_avatar_btn")->setEnabled(enable_cotrols); + getChildView("remove_allowed_avatar_btn")->setEnabled(has_allowed_avatar && enable_cotrols); + getChildView("allowed_avatar_name_list")->setEnabled(enable_cotrols); - name_list = getChild<LLNameListCtrl>("banned_avatar_name_list"); - if (name_list) - { - name_list->deleteAllItems(); - } - updateControls(gAgent.getRegion()); -} + getChildView("add_allowed_group_btn")->setEnabled(enable_cotrols); + getChildView("remove_allowed_group_btn")->setEnabled(has_allowed_group && enable_cotrols); + getChildView("allowed_group_name_list")->setEnabled(enable_cotrols); -// static -void LLPanelEstateInfo::onClickMessageEstate(void* userdata) -{ - LL_INFOS() << "LLPanelEstateInfo::onClickMessageEstate" << LL_ENDL; - LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2)); -} + // Can't ban people from mainland, orientation islands, etc. because this + // creates much network traffic and server load. + // Disable their accounts in CSR tool instead. + bool linden_estate = LLPanelEstateInfo::isLindenEstate(); + bool enable_ban = enable_cotrols && !linden_estate; + getChildView("add_banned_avatar_btn")->setEnabled(enable_ban); + getChildView("remove_banned_avatar_btn")->setEnabled(has_banned_agent && enable_ban); + getChildView("banned_avatar_name_list")->setEnabled(enable_cotrols); -bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - std::string text = response["message"].asString(); - if(option != 0) return false; - if(text.empty()) return false; - LL_INFOS() << "Message to everyone: " << text << LL_ENDL; - strings_t strings; - //integers_t integers; - std::string name; - LLAgentUI::buildFullname(name); - strings.push_back(strings_t::value_type(name)); - strings.push_back(strings_t::value_type(text)); + // estate managers can't add estate managers + getChildView("add_estate_manager_btn")->setEnabled(god || owner); + getChildView("remove_estate_manager_btn")->setEnabled(has_estate_manager && (god || owner)); + getChildView("estate_manager_name_list")->setEnabled(god || owner); - LLEstateInfoModel::instance().sendEstateOwnerMessage("instantmessage", strings); - return false; + if (enable_cotrols != mCtrlsEnabled) + { + mCtrlsEnabled = enable_cotrols; + updateLists(); // update the lists on the agent's access level change + } } -void LLPanelEstateInfo::onChangeAccessOverride() +//--------------------------------------------------------------------------- +// Add/Remove estate access button callbacks +//--------------------------------------------------------------------------- +void LLPanelEstateAccess::onClickAddAllowedAgent() { - if (!getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()) + LLCtrlListInterface *list = childGetListInterface("allowed_avatar_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) { - LLNotificationsUtil::add("EstateParcelAccessOverride"); + //args + + LLSD args; + args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args); + return; } + accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd"); } -LLPanelEstateCovenant::LLPanelEstateCovenant() - : - mCovenantID(LLUUID::null), - mAssetStatus(ASSET_ERROR) +void LLPanelEstateAccess::onClickRemoveAllowedAgent() { + accessRemoveCore(ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, "EstateAllowedAgentRemove", "allowed_avatar_name_list"); } -// virtual -bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region) +void LLPanelEstateAccess::onClickAddAllowedGroup() { - LLTextBox* region_name = getChild<LLTextBox>("region_name_text"); - if (region_name) + LLCtrlListInterface *list = childGetListInterface("allowed_group_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) { - region_name->setText(region->getName()); + LLSD args; + args["MAX_GROUPS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args); + return; } - LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); - if (resellable_clause) + LLNotification::Params params("ChangeLindenAccess"); + params.functor.function(boost::bind(&LLPanelEstateAccess::addAllowedGroup, this, _1, _2)); + if (LLPanelEstateInfo::isLindenEstate()) { - if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) - { - resellable_clause->setText(getString("can_not_resell")); - } - else - { - resellable_clause->setText(getString("can_resell")); - } + LLNotifications::instance().add(params); } - - LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); - if (changeable_clause) + else + { + LLNotifications::instance().forceResponse(params, 0); + } +} + +bool LLPanelEstateAccess::addAllowedGroup(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) return false; + + LLFloater* parent_floater = gFloaterView->getParentFloater(this); + + LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); + if (widget) { - if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) - { - changeable_clause->setText(getString("can_change")); - } - else + widget->removeNoneOption(); + widget->setSelectGroupCallback(boost::bind(&LLPanelEstateAccess::addAllowedGroup2, this, _1)); + if (parent_floater) { - changeable_clause->setText(getString("can_not_change")); + LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, widget); + widget->setOrigin(new_rect.mLeft, new_rect.mBottom); + parent_floater->addDependentFloater(widget); } } - LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text"); - if (region_maturity) + return false; +} + +void LLPanelEstateAccess::onClickRemoveAllowedGroup() +{ + accessRemoveCore(ESTATE_ACCESS_ALLOWED_GROUP_REMOVE, "EstateAllowedGroupRemove", "allowed_group_name_list"); +} + +void LLPanelEstateAccess::onClickAddBannedAgent() +{ + LLCtrlListInterface *list = childGetListInterface("banned_avatar_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) { - region_maturity->setText(region->getSimAccessString()); + LLSD args; + args["MAX_BANNED"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args); + return; } - - LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); - region_landtype->setText(region->getLocalizedSimProductName()); - - // let the parent class handle the general data collection. - bool rv = LLPanelRegionInfo::refreshFromRegion(region); - LLMessageSystem *msg = gMessageSystem; - msg->newMessage("EstateCovenantRequest"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->sendReliable(region->getHost()); - return rv; + accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd"); } -// virtual -bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg) +void LLPanelEstateAccess::onClickRemoveBannedAgent() { - LL_INFOS() << "LLPanelEstateCovenant::estateUpdate()" << LL_ENDL; - return true; + accessRemoveCore(ESTATE_ACCESS_BANNED_AGENT_REMOVE, "EstateBannedAgentRemove", "banned_avatar_name_list"); } - -// virtual -BOOL LLPanelEstateCovenant::postBuild() -{ - mEstateNameText = getChild<LLTextBox>("estate_name_text"); - mEstateOwnerText = getChild<LLTextBox>("estate_owner_text"); - mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text"); - mEditor = getChild<LLViewerTextEditor>("covenant_editor"); - LLButton* reset_button = getChild<LLButton>("reset_covenant"); - reset_button->setEnabled(gAgent.canManageEstate()); - reset_button->setClickedCallback(LLPanelEstateCovenant::resetCovenantID, NULL); - return LLPanelRegionInfo::postBuild(); +void LLPanelEstateAccess::onClickCopyAllowedList() +{ + copyListToClipboard("allowed_avatar_name_list"); } -// virtual -void LLPanelEstateCovenant::updateChild(LLUICtrl* child_ctrl) +void LLPanelEstateAccess::onClickCopyAllowedGroupList() { + copyListToClipboard("allowed_group_name_list"); } -// virtual -BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) +void LLPanelEstateAccess::onClickCopyBannedList() { - LLInventoryItem* item = (LLInventoryItem*)cargo_data; + copyListToClipboard("banned_avatar_name_list"); +} - if (!gAgent.canManageEstate()) - { - *accept = ACCEPT_NO; - return TRUE; +// static +void LLPanelEstateAccess::onClickAddEstateManager() +{ + LLCtrlListInterface *list = childGetListInterface("estate_manager_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_MANAGERS) + { // Tell user they can't add more managers + LLSD args; + args["MAX_MANAGER"] = llformat("%d", ESTATE_MAX_MANAGERS); + LLNotificationsUtil::add("MaxManagersOnRegion", args); + } + else + { // Go pick managers to add + accessAddCore(ESTATE_ACCESS_MANAGER_ADD, "EstateManagerAdd"); } +} - switch(cargo_type) +// static +void LLPanelEstateAccess::onClickRemoveEstateManager() +{ + accessRemoveCore(ESTATE_ACCESS_MANAGER_REMOVE, "EstateManagerRemove", "estate_manager_name_list"); +} + + +// Special case callback for groups, since it has different callback format than names +void LLPanelEstateAccess::addAllowedGroup2(LLUUID id) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (panel) { - case DAD_NOTECARD: - *accept = ACCEPT_YES_COPY_SINGLE; - if (item && drop) + LLNameListCtrl* group_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list"); + LLScrollListItem* item = group_list->getNameItemByAgentId(id); + if (item) { - LLSD payload; - payload["item_id"] = item->getUUID(); - LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload, - LLPanelEstateCovenant::confirmChangeCovenantCallback); + LLSD args; + args["GROUP"] = item->getColumn(0)->getValue().asString(); + LLNotificationsUtil::add("GroupIsAlreadyInList", args); + return; } - break; - default: - *accept = ACCEPT_NO; - break; } + + LLSD payload; + payload["operation"] = (S32)ESTATE_ACCESS_ALLOWED_GROUP_ADD; + payload["dialog_name"] = "EstateAllowedGroupAdd"; + payload["allowed_ids"].append(id); - return TRUE; -} - -// static -bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); - LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); - - if (!item || !self) return false; + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); - switch(option) + LLNotification::Params params("EstateAllowedGroupAdd"); + params.payload(payload) + .substitutions(args) + .functor.function(accessCoreConfirm); + if (LLPanelEstateInfo::isLindenEstate()) { - case 0: - self->loadInvItem(item); - break; - default: - break; + LLNotifications::instance().forceResponse(params, 0); + } + else + { + LLNotifications::instance().add(params); } - return false; } // static -void LLPanelEstateCovenant::resetCovenantID(void* userdata) +void LLPanelEstateAccess::accessAddCore(U32 operation_flag, const std::string& dialog_name) { - LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback); + LLSD payload; + payload["operation"] = (S32)operation_flag; + payload["dialog_name"] = dialog_name; + // agent id filled in after avatar picker + + LLNotification::Params params("ChangeLindenAccess"); + params.payload(payload) + .functor.function(accessAddCore2); + + if (LLPanelEstateInfo::isLindenEstate()) + { + LLNotifications::instance().add(params); + } + else + { + // same as clicking "OK" + LLNotifications::instance().forceResponse(params, 0); + } } // static -bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notification, const LLSD& response) +bool LLPanelEstateAccess::accessAddCore2(const LLSD& notification, const LLSD& response) { - LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); - if (!self) return false; - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - switch(option) + if (option != 0) { - case 0: - self->loadInvItem(NULL); + // abort change + return false; + } + + LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]); + //Get parent floater name + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + LLFloater* parent_floater = panel ? gFloaterView->getParentFloater(panel) : NULL; + const std::string& parent_floater_name = parent_floater ? parent_floater->getName() : ""; + + //Determine the button that triggered opening of the avatar picker + //(so that a shadow frustum from the button to the avatar picker can be created) + LLView * button = NULL; + switch (change_info->mOperationFlag) + { + case ESTATE_ACCESS_ALLOWED_AGENT_ADD: + button = panel->findChild<LLButton>("add_allowed_avatar_btn"); break; - default: + + case ESTATE_ACCESS_BANNED_AGENT_ADD: + button = panel->findChild<LLButton>("add_banned_avatar_btn"); break; - } - return false; -} -void LLPanelEstateCovenant::loadInvItem(LLInventoryItem *itemp) -{ - const BOOL high_priority = TRUE; - if (itemp) - { - gAssetStorage->getInvItemAsset(gAgent.getRegionHost(), - gAgent.getID(), - gAgent.getSessionID(), - itemp->getPermissions().getOwner(), - LLUUID::null, - itemp->getUUID(), - itemp->getAssetUUID(), - itemp->getType(), - onLoadComplete, - (void*)this, - high_priority); - mAssetStatus = ASSET_LOADING; + case ESTATE_ACCESS_MANAGER_ADD: + button = panel->findChild<LLButton>("add_estate_manager_btn"); + break; } - else + + // avatar picker yes multi-select, yes close-on-select + LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateAccess::accessAddCore3, _1, _2, (void*)change_info), + TRUE, TRUE, FALSE, parent_floater_name, button); + + //Allows the closed parent floater to close the child floater (avatar picker) + if (child_floater) { - mAssetStatus = ASSET_LOADED; - setCovenantTextEditor(LLTrans::getString("RegionNoCovenant")); - sendChangeCovenantID(LLUUID::null); + parent_floater->addDependentFloater(child_floater); } + + return false; } // static -void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status) +void LLPanelEstateAccess::accessAddCore3(const uuid_vec_t& ids, std::vector<LLAvatarName> names, void* data) { - LL_INFOS() << "LLPanelEstateCovenant::onLoadComplete()" << LL_ENDL; - LLPanelEstateCovenant* panelp = (LLPanelEstateCovenant*)user_data; - if( panelp ) + LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data; + if (!change_info) return; + if (ids.empty()) { - if(0 == status) - { - LLVFile file(vfs, asset_uuid, type, LLVFile::READ); - - S32 file_length = file.getSize(); + // User didn't select a name. + delete change_info; + change_info = NULL; + return; + } + // User did select a name. + change_info->mAgentOrGroupIDs = ids; + // Can't put estate owner on ban list + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLViewerRegion* region = gAgent.getRegion(); + if (!region) return; - std::vector<char> buffer(file_length+1); - file.read((U8*)&buffer[0], file_length); - // put a EOS at the end - buffer[file_length] = 0; + if (change_info->mOperationFlag & ESTATE_ACCESS_ALLOWED_AGENT_ADD) + { + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list"); + int currentCount = (name_list ? name_list->getItemCount() : 0); + if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) + { + LLSD args; + args["NUM_ADDED"] = llformat("%d", ids.size()); + args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); + args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); + delete change_info; + return; + } - if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) ) + uuid_vec_t ids_allowed; + std::vector<LLAvatarName> names_allowed; + std::string already_allowed; + bool single = true; + for (U32 i = 0; i < ids.size(); ++i) + { + LLScrollListItem* item = name_list->getNameItemByAgentId(ids[i]); + if (item) { - if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) ) - { - LL_WARNS() << "Problem importing estate covenant." << LL_ENDL; - LLNotificationsUtil::add("ProblemImportingEstateCovenant"); - } - else + if (!already_allowed.empty()) { - panelp->sendChangeCovenantID(asset_uuid); + already_allowed += ", "; + single = false; } + already_allowed += item->getColumn(0)->getValue().asString(); } else { - // Version 0 (just text, doesn't include version number) - panelp->sendChangeCovenantID(asset_uuid); + ids_allowed.push_back(ids[i]); + names_allowed.push_back(names[i]); } } - else + if (!already_allowed.empty()) { - if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || - LL_ERR_FILE_EMPTY == status) + LLSD args; + args["AGENT"] = already_allowed; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); + LLNotificationsUtil::add(single ? "AgentIsAlreadyInList" : "AgentsAreAlreadyInList", args); + if (ids_allowed.empty()) { - LLNotificationsUtil::add("MissingNotecardAssetID"); + delete change_info; + return; } - else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) + } + change_info->mAgentOrGroupIDs = ids_allowed; + change_info->mAgentNames = names_allowed; + } + if (change_info->mOperationFlag & ESTATE_ACCESS_BANNED_AGENT_ADD) + { + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list"); + LLNameListCtrl* em_list = panel->getChild<LLNameListCtrl>("estate_manager_name_list"); + int currentCount = (name_list ? name_list->getItemCount() : 0); + if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) + { + LLSD args; + args["NUM_ADDED"] = llformat("%d", ids.size()); + args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); + args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); + delete change_info; + return; + } + + uuid_vec_t ids_allowed; + std::vector<LLAvatarName> names_allowed; + std::string already_banned; + std::string em_ban; + bool single = true; + for (U32 i = 0; i < ids.size(); ++i) + { + bool is_allowed = true; + LLScrollListItem* em_item = em_list->getNameItemByAgentId(ids[i]); + if (em_item) { - LLNotificationsUtil::add("NotAllowedToViewNotecard"); + if (!em_ban.empty()) + { + em_ban += ", "; + } + em_ban += em_item->getColumn(0)->getValue().asString(); + is_allowed = false; } - else + + LLScrollListItem* item = name_list->getNameItemByAgentId(ids[i]); + if (item) { - LLNotificationsUtil::add("UnableToLoadNotecardAsset"); + if (!already_banned.empty()) + { + already_banned += ", "; + single = false; + } + already_banned += item->getColumn(0)->getValue().asString(); + is_allowed = false; } - LL_WARNS() << "Problem loading notecard: " << status << LL_ENDL; + if (is_allowed) + { + ids_allowed.push_back(ids[i]); + names_allowed.push_back(names[i]); + } } - panelp->mAssetStatus = ASSET_LOADED; - panelp->setCovenantID(asset_uuid); + if (!em_ban.empty()) + { + LLSD args; + args["AGENT"] = em_ban; + LLNotificationsUtil::add("ProblemBanningEstateManager", args); + if (ids_allowed.empty()) + { + delete change_info; + return; + } + } + if (!already_banned.empty()) + { + LLSD args; + args["AGENT"] = already_banned; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); + LLNotificationsUtil::add(single ? "AgentIsAlreadyInList" : "AgentsAreAlreadyInList", args); + if (ids_allowed.empty()) + { + delete change_info; + return; + } + } + change_info->mAgentOrGroupIDs = ids_allowed; + change_info->mAgentNames = names_allowed; } -} - -// key = "estatechangecovenantid" -// strings[0] = str(estate_id) (added by simulator before relay - not here) -// strings[1] = str(covenant_id) -void LLPanelEstateCovenant::sendChangeCovenantID(const LLUUID &asset_id) -{ - if (asset_id != getCovenantID()) - { - setCovenantID(asset_id); - - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("EstateOwnerMessage"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - msg->nextBlock("MethodData"); - msg->addString("Method", "estatechangecovenantid"); - msg->addUUID("Invoice", LLEstateInfoModel::instance().getLastInvoice()); + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); + LLNotification::Params params(change_info->mDialogName); + params.substitutions(args) + .payload(change_info->asLLSD()) + .functor.function(accessCoreConfirm); - msg->nextBlock("ParamList"); - msg->addString("Parameter", getCovenantID().asString()); - gAgent.sendReliableMessage(); + if (LLPanelEstateInfo::isLindenEstate()) + { + // just apply to this estate + LLNotifications::instance().forceResponse(params, 0); + } + else + { + // ask if this estate or all estates with this owner + LLNotifications::instance().add(params); } } -// virtual -BOOL LLPanelEstateCovenant::sendUpdate() +// static +void LLPanelEstateAccess::accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name) { - return TRUE; -} + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_ctrl_name); + if (!name_list) return; -std::string LLPanelEstateCovenant::getEstateName() const -{ - return mEstateNameText->getText(); -} + std::vector<LLScrollListItem*> list_vector = name_list->getAllSelected(); + if (list_vector.size() == 0) + return; -void LLPanelEstateCovenant::setEstateName(const std::string& name) -{ - mEstateNameText->setText(name); -} + LLSD payload; + payload["operation"] = (S32)operation_flag; + payload["dialog_name"] = dialog_name; -// static -void LLPanelEstateCovenant::updateCovenantText(const std::string& string, const LLUUID& asset_id) -{ - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) + for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin(); + iter != list_vector.end(); + iter++) { - panelp->mEditor->setText(string); - panelp->setCovenantID(asset_id); + LLScrollListItem *item = (*iter); + payload["allowed_ids"].append(item->getUUID()); } -} -// static -void LLPanelEstateCovenant::updateEstateName(const std::string& name) -{ - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) - { - panelp->mEstateNameText->setText(name); - } -} + LLNotification::Params params("ChangeLindenAccess"); + params.payload(payload) + .functor.function(accessRemoveCore2); -// static -void LLPanelEstateCovenant::updateLastModified(const std::string& text) -{ - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) + if (LLPanelEstateInfo::isLindenEstate()) { - panelp->mLastModifiedText->setText(text); + // warn on change linden estate + LLNotifications::instance().add(params); } -} - -// static -void LLPanelEstateCovenant::updateEstateOwnerName(const std::string& name) -{ - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) + else { - panelp->mEstateOwnerText->setText(name); + // just proceed, as if clicking OK + LLNotifications::instance().forceResponse(params, 0); } } -std::string LLPanelEstateCovenant::getOwnerName() const -{ - return mEstateOwnerText->getText(); -} - -void LLPanelEstateCovenant::setOwnerName(const std::string& name) -{ - mEstateOwnerText->setText(name); -} - -void LLPanelEstateCovenant::setCovenantTextEditor(const std::string& text) -{ - mEditor->setText(text); -} - -BOOL LLPanelRegionExperiences::postBuild() -{ - mAllowed = setupList("panel_allowed", ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE); - mTrusted = setupList("panel_trusted", ESTATE_EXPERIENCE_TRUSTED_ADD, ESTATE_EXPERIENCE_TRUSTED_REMOVE); - mBlocked = setupList("panel_blocked", ESTATE_EXPERIENCE_BLOCKED_ADD, ESTATE_EXPERIENCE_BLOCKED_REMOVE); - - getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(TRUE); - getChild<LLTextBox>("experiences_help_text")->setText(getString("estate_caption")); - getChild<LLTextBox>("trusted_text_help")->setText(getString("trusted_estate_text")); - getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_estate_text")); - getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_estate_text")); - - LLEstateInfoModel::instance().setUpdateExperienceCallback(boost::bind(&LLPanelRegionExperiences::refreshExperiencesFromEstate, this)); - - return LLPanelRegionInfo::postBuild(); -} - -LLPanelExperienceListEditor* LLPanelRegionExperiences::setupList( const char* control_name, U32 add_id, U32 remove_id ) +// static +bool LLPanelEstateAccess::accessRemoveCore2(const LLSD& notification, const LLSD& response) { - LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name); - if(child) + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) { - child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name)); - child->setMaxExperienceIDs(ESTATE_MAX_EXPERIENCE_IDS); - child->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, add_id, _1)); - child->setRemovedCallback(boost::bind(&LLPanelRegionExperiences::itemChanged, this, remove_id, _1)); + // abort + return false; } - return child; -} - - -void LLPanelRegionExperiences::processResponse( const LLSD& content ) -{ - if(content.has("default")) + // If Linden estate, can only apply to "this" estate, not all estates + // owned by NULL. + if (LLPanelEstateInfo::isLindenEstate()) { - mDefaultExperience = content["default"].asUUID(); + accessCoreConfirm(notification, response); } - - mAllowed->setExperienceIds(content["allowed"]); - mBlocked->setExperienceIds(content["blocked"]); - - LLSD trusted = content["trusted"]; - if(mDefaultExperience.notNull()) + else { - mTrusted->setStickyFunction(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); - trusted.append(mDefaultExperience); + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); + LLNotificationsUtil::add(notification["payload"]["dialog_name"], + args, + notification["payload"], + accessCoreConfirm); } - - mTrusted->setExperienceIds(trusted); - - mAllowed->refreshExperienceCounter(); - mBlocked->refreshExperienceCounter(); - mTrusted->refreshExperienceCounter(); - -} - -void LLPanelRegionExperiences::refreshExperiencesFromEstate() -{ - const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); - - LLSD ids = LLSDMap("blocked", set_to_llsdarray(estate_info.getBlockedExperiences())) - ("trusted", set_to_llsdarray(estate_info.getTrustedExperiences())) - ("allowed", set_to_llsdarray(estate_info.getAllowedExperiences())); - - processResponse(ids); + return false; } - -// Used for both access add and remove operations, depending on the flag -// passed in (ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE, etc.) +// Used for both access add and remove operations, depending on the mOperationFlag +// passed in (ESTATE_ACCESS_BANNED_AGENT_ADD, ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, etc.) // static -bool LLPanelRegionExperiences::experienceCoreConfirm(const LLSD& notification, const LLSD& response) +bool LLPanelEstateAccess::accessCoreConfirm(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger(); + U32 flags = originalFlags; LLViewerRegion* region = gAgent.getRegion(); - - LLSD::array_const_iterator end_it = notification["payload"]["allowed_ids"].endArray(); - for (LLSD::array_const_iterator iter = notification["payload"]["allowed_ids"].beginArray(); - iter != end_it; - iter++) + if (option == 2) // cancel + { + return false; + } + else if (option == 1) + { + // All estates, either than I own or manage for this owner. + // This will be verified on simulator. JC + if (!region) return false; + if (region->getOwner() == gAgent.getID() + || gAgent.isGodlike()) + { + flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES; + } + else if (region->isEstateManager()) + { + flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; + } + } + + std::string names; + U32 listed_names = 0; + for (U32 i = 0; i < notification["payload"]["allowed_ids"].size(); ++i) { - U32 flags = originalFlags; - if (iter + 1 != end_it) + if (i + 1 != notification["payload"]["allowed_ids"].size()) + { flags |= ESTATE_ACCESS_NO_REPLY; + } + else + { + flags &= ~ESTATE_ACCESS_NO_REPLY; + } - const LLUUID id = iter->asUUID(); - switch(option) + const LLUUID id = notification["payload"]["allowed_ids"][i].asUUID(); + if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD) + && region && (region->getOwner() == id)) { - case 0: - // This estate - sendEstateExperienceDelta(flags, id); - break; - case 1: + LLNotificationsUtil::add("OwnerCanNotBeDenied"); + break; + } + + sendEstateAccessDelta(flags, id); + + if ((flags & (ESTATE_ACCESS_ALLOWED_GROUP_ADD | ESTATE_ACCESS_ALLOWED_GROUP_REMOVE)) == 0) + { + // fill the name list for confirmation + if (listed_names < MAX_LISTED_NAMES) { - // All estates, either than I own or manage for this owner. - // This will be verified on simulator. JC - if (!region) break; - if (region->getOwner() == gAgent.getID() - || gAgent.isGodlike()) + if (!names.empty()) { - flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES; - sendEstateExperienceDelta(flags, id); + names += ", "; } - else if (region->isEstateManager()) + if (!notification["payload"]["allowed_names"][i]["display_name"].asString().empty()) { - flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; - sendEstateExperienceDelta(flags, id); + names += notification["payload"]["allowed_names"][i]["display_name"].asString(); } - break; + else + { //try to get an agent name from cache + LLAvatarName av_name; + if (LLAvatarNameCache::get(id, &av_name)) + { + names += av_name.getCompleteName(); + } + } + } - case 2: - default: - break; + listed_names++; } } - return false; -} - + if (listed_names > MAX_LISTED_NAMES) + { + LLSD args; + args["EXTRA_COUNT"] = llformat("%d", listed_names - MAX_LISTED_NAMES); + names += " " + LLTrans::getString("AndNMore", args); + } -// Send the actual "estateexperiencedelta" message -void LLPanelRegionExperiences::sendEstateExperienceDelta(U32 flags, const LLUUID& experience_id) -{ - strings_t str(3, std::string()); - gAgent.getID().toString(str[0]); - str[1] = llformat("%u", flags); - experience_id.toString(str[2]); + if (!names.empty()) // show the conirmation + { + LLSD args; + args["AGENT"] = names; - LLEstateInfoModel::instance().sendEstateOwnerMessage("estateexperiencedelta", str); -} + if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE)) + { + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); + } + else if (flags & (ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_REMOVE)) + { + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); + } + if (flags & ESTATE_ACCESS_APPLY_TO_ALL_ESTATES) + { + args["ESTATE"] = LLTrans::getString("RegionInfoAllEstates"); + } + else if (flags & ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES) + { + args["ESTATE"] = LLTrans::getString("RegionInfoManagedEstates"); + } + else + { + args["ESTATE"] = LLTrans::getString("RegionInfoThisEstate"); + } -void LLPanelRegionExperiences::infoCallback(LLHandle<LLPanelRegionExperiences> handle, const LLSD& content) -{ - if(handle.isDead()) - return; + bool single = (listed_names == 1); + if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_ADD)) + { + LLNotificationsUtil::add(single ? "AgentWasAddedToList" : "AgentsWereAddedToList", args); + } + else if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | ESTATE_ACCESS_BANNED_AGENT_REMOVE)) + { + LLNotificationsUtil::add(single ? "AgentWasRemovedFromList" : "AgentsWereRemovedFromList", args); + } + } - LLPanelRegionExperiences* floater = handle.get(); - if (floater) + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (panel) { - floater->processResponse(content); + panel->setPendingUpdate(true); } -} - -/*static*/ -std::string LLPanelRegionExperiences::regionCapabilityQuery(LLViewerRegion* region, const std::string &cap) -{ - // region->getHandle() How to get a region * from a handle? - return region->getCapability(cap); + return false; } -bool LLPanelRegionExperiences::refreshFromRegion(LLViewerRegion* region) +// key = "estateaccessdelta" +// str(estate_id) will be added to front of list by forward_EstateOwnerRequest_to_dataserver +// str[0] = str(agent_id) requesting the change +// str[1] = str(flags) (ESTATE_ACCESS_DELTA_*) +// str[2] = str(agent_id) to add or remove +// static +void LLPanelEstateAccess::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_group_id) { - BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate()); + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("EstateOwnerMessage"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - mAllowed->loading(); - mAllowed->setReadonly(!allow_modify); - // remove grid-wide experiences - mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID)); - // remove default experience - mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); + msg->nextBlock("MethodData"); + msg->addString("Method", "estateaccessdelta"); + msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); - mBlocked->loading(); - mBlocked->setReadonly(!allow_modify); - // only grid-wide experiences - mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperty, _1, LLExperienceCache::PROPERTY_GRID)); - // but not privileged ones - mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_PRIVILEGED)); - // remove default experience - mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); + std::string buf; + gAgent.getID().toString(buf); + msg->nextBlock("ParamList"); + msg->addString("Parameter", buf); - mTrusted->loading(); - mTrusted->setReadonly(!allow_modify); + buf = llformat("%u", flags); + msg->nextBlock("ParamList"); + msg->addString("Parameter", buf); - LLExperienceCache::instance().getRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), - boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); + agent_or_group_id.toString(buf); + msg->nextBlock("ParamList"); + msg->addString("Parameter", buf); - return LLPanelRegionInfo::refreshFromRegion(region); + gAgent.sendReliableMessage(); } -LLSD LLPanelRegionExperiences::addIds(LLPanelExperienceListEditor* panel) +void LLPanelEstateAccess::updateChild(LLUICtrl* child_ctrl) { - LLSD ids; - const uuid_list_t& id_list = panel->getExperienceIds(); - for(uuid_list_t::const_iterator it = id_list.begin(); it != id_list.end(); ++it) + // Ensure appropriate state of the management ui. + updateControls(gAgent.getRegion()); +} + +void LLPanelEstateAccess::updateLists() +{ + std::string cap_url = gAgent.getRegionCapability("EstateAccess"); + if (!cap_url.empty()) { - ids.append(*it); + LLCoros::instance().launch("LLFloaterRegionInfo::requestEstateGetAccessCoro", boost::bind(LLPanelEstateAccess::requestEstateGetAccessCoro, cap_url)); } - return ids; } - -BOOL LLPanelRegionExperiences::sendUpdate() +void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url) { - LLViewerRegion* region = gAgent.getRegion(); - - LLSD content; + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestEstateGetAccessoCoro", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - content["allowed"]=addIds(mAllowed); - content["blocked"]=addIds(mBlocked); - content["trusted"]=addIds(mTrusted); + LLSD result = httpAdapter->getAndSuspend(httpRequest, url); - LLExperienceCache::instance().setRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), - content, boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - return TRUE; -} + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + + LLNameListCtrl* allowed_agent_name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list"); + if (allowed_agent_name_list && result.has("AllowedAgents")) + { + LLStringUtil::format_map_t args; + args["[ALLOWEDAGENTS]"] = llformat("%d", result["AllowedAgents"].size()); + args["[MAXACCESS]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + std::string msg = LLTrans::getString("RegionInfoAllowedResidents", args); + panel->getChild<LLUICtrl>("allow_resident_label")->setValue(LLSD(msg)); + + allowed_agent_name_list->clearSortOrder(); + allowed_agent_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["AllowedAgents"].beginArray(); it != result["AllowedAgents"].endArray(); ++it) + { + LLUUID id = (*it)["id"].asUUID(); + allowed_agent_name_list->addNameItem(id); + } + allowed_agent_name_list->sortByName(TRUE); + } -void LLPanelRegionExperiences::itemChanged( U32 event_type, const LLUUID& id ) -{ - std::string dialog_name; - switch (event_type) + LLNameListCtrl* banned_agent_name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list"); + if (banned_agent_name_list && result.has("BannedAgents")) { - case ESTATE_EXPERIENCE_ALLOWED_ADD: - dialog_name = "EstateAllowedExperienceAdd"; - break; + LLStringUtil::format_map_t args; + args["[BANNEDAGENTS]"] = llformat("%d", result["BannedAgents"].size()); + args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + std::string msg = LLTrans::getString("RegionInfoBannedResidents", args); + panel->getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg)); - case ESTATE_EXPERIENCE_ALLOWED_REMOVE: - dialog_name = "EstateAllowedExperienceRemove"; - break; + banned_agent_name_list->clearSortOrder(); + banned_agent_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["BannedAgents"].beginArray(); it != result["BannedAgents"].endArray(); ++it) + { + LLSD item; + item["id"] = (*it)["id"].asUUID(); + LLSD& columns = item["columns"]; - case ESTATE_EXPERIENCE_TRUSTED_ADD: - dialog_name = "EstateTrustedExperienceAdd"; - break; + columns[0]["column"] = "name"; // to be populated later - case ESTATE_EXPERIENCE_TRUSTED_REMOVE: - dialog_name = "EstateTrustedExperienceRemove"; - break; + columns[1]["column"] = "last_login_date"; + columns[1]["value"] = (*it)["last_login_date"].asString().substr(0, 16); // cut the seconds - case ESTATE_EXPERIENCE_BLOCKED_ADD: - dialog_name = "EstateBlockedExperienceAdd"; - break; + std::string ban_date = (*it)["ban_date"].asString(); + columns[2]["column"] = "ban_date"; + columns[2]["value"] = ban_date[0] != '0' ? ban_date.substr(0, 16) : LLTrans::getString("na"); // server returns the "0000-00-00 00:00:00" date in case it doesn't know it - case ESTATE_EXPERIENCE_BLOCKED_REMOVE: - dialog_name = "EstateBlockedExperienceRemove"; - break; + columns[3]["column"] = "bannedby"; + LLUUID banning_id = (*it)["banning_id"].asUUID(); + LLAvatarName av_name; + if (banning_id.isNull()) + { + columns[3]["value"] = LLTrans::getString("na"); + } + else if (LLAvatarNameCache::get(banning_id, &av_name)) + { + columns[3]["value"] = av_name.getCompleteName(); //TODO: fetch the name if it wasn't cached + } - default: - return; + banned_agent_name_list->addElement(item); + } + banned_agent_name_list->sortByName(TRUE); } - LLSD payload; - payload["operation"] = (S32)event_type; - payload["dialog_name"] = dialog_name; - payload["allowed_ids"].append(id); + LLNameListCtrl* allowed_group_name_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list"); + if (allowed_group_name_list && result.has("AllowedGroups")) + { + LLStringUtil::format_map_t args; + args["[ALLOWEDGROUPS]"] = llformat("%d", result["AllowedGroups"].size()); + args["[MAXACCESS]"] = llformat("%d", ESTATE_MAX_GROUP_IDS); + std::string msg = LLTrans::getString("RegionInfoAllowedGroups", args); + panel->getChild<LLUICtrl>("allow_group_label")->setValue(LLSD(msg)); - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); + allowed_group_name_list->clearSortOrder(); + allowed_group_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["AllowedGroups"].beginArray(); it != result["AllowedGroups"].endArray(); ++it) + { + LLUUID id = (*it)["id"].asUUID(); + allowed_group_name_list->addGroupNameItem(id); + } + allowed_group_name_list->sortByName(TRUE); + } - LLNotification::Params params(dialog_name); - params.payload(payload) - .substitutions(args) - .functor.function(LLPanelRegionExperiences::experienceCoreConfirm); - if (LLPanelEstateInfo::isLindenEstate()) + LLNameListCtrl* estate_manager_name_list = panel->getChild<LLNameListCtrl>("estate_manager_name_list"); + if (estate_manager_name_list && result.has("Managers")) { - LLNotifications::instance().forceResponse(params, 0); + LLStringUtil::format_map_t args; + args["[ESTATEMANAGERS]"] = llformat("%d", result["Managers"].size()); + args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); + std::string msg = LLTrans::getString("RegionInfoEstateManagers", args); + panel->getChild<LLUICtrl>("estate_manager_label")->setValue(LLSD(msg)); + + estate_manager_name_list->clearSortOrder(); + estate_manager_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["Managers"].beginArray(); it != result["Managers"].endArray(); ++it) + { + LLUUID id = (*it)["agent_id"].asUUID(); + estate_manager_name_list->addNameItem(id); + } + estate_manager_name_list->sortByName(TRUE); + } + + + panel->updateControls(gAgent.getRegion()); +} + +//--------------------------------------------------------------------------- +// Access lists search +//--------------------------------------------------------------------------- +void LLPanelEstateAccess::onAllowedSearchEdit(const std::string& search_string) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* allowed_agent_name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list"); + searchAgent(allowed_agent_name_list, search_string); +} + +void LLPanelEstateAccess::onAllowedGroupsSearchEdit(const std::string& search_string) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* allowed_group_name_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list"); + searchAgent(allowed_group_name_list, search_string); +} + +void LLPanelEstateAccess::onBannedSearchEdit(const std::string& search_string) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* banned_agent_name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list"); + searchAgent(banned_agent_name_list, search_string); +} + +void LLPanelEstateAccess::searchAgent(LLNameListCtrl* listCtrl, const std::string& search_string) +{ + if (!listCtrl) return; + + if (!search_string.empty()) + { + listCtrl->setSearchColumn(0); // name column + listCtrl->selectItemByPrefix(search_string, FALSE); } else { - LLNotifications::instance().add(params); + listCtrl->deselectAllItems(TRUE); } +} - onChangeAnything(); +void LLPanelEstateAccess::copyListToClipboard(std::string list_name) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_name); + if (!name_list) return; + + std::vector<LLScrollListItem*> list_vector = name_list->getAllData(); + if (list_vector.size() == 0) return; + + LLSD::String list_to_copy; + for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin(); + iter != list_vector.end(); + iter++) + { + LLScrollListItem *item = (*iter); + if (item) + { + list_to_copy += item->getColumn(0)->getValue().asString(); + } + if (std::next(iter) != list_vector.end()) + { + list_to_copy += "\n"; + } + } + + LLClipboard::instance().copyToClipboard(utf8str_to_wstring(list_to_copy), 0, list_to_copy.length()); +} + +bool LLPanelEstateAccess::refreshFromRegion(LLViewerRegion* region) +{ + updateLists(); + return LLPanelRegionInfo::refreshFromRegion(region); } //========================================================================= diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index e4687fff0c27485cf5159c00c23adc3ef22a7d0b..0dda13cdc51cdb56090701e12d0b8e0b76a5a9e4 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -29,6 +29,7 @@ #define LL_LLFLOATERREGIONINFO_H #include <vector> +#include "llagent.h" #include "llassettype.h" #include "llfloater.h" #include "llhost.h" @@ -64,6 +65,7 @@ class LLPanelEstateCovenant; class LLPanelExperienceListEditor; class LLPanelExperiences; class LLPanelRegionExperiences; +class LLPanelEstateAccess; class LLPanelRegionEnvironment; class LLEventTimer; @@ -75,15 +77,21 @@ class LLFloaterRegionInfo : public LLFloater /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(bool app_quitting); /*virtual*/ BOOL postBuild(); + static void processEstateOwnerRequest(LLMessageSystem* msg, void**); + // get and process region info if necessary. static void processRegionInfo(LLMessageSystem* msg); + static const LLUUID& getLastInvoice() { return sRequestInvoice; } + static void nextInvoice() { sRequestInvoice.generate(); } //static S32 getSerial() { return sRequestSerial; } //static void incrementSerial() { sRequestSerial++; } static LLPanelEstateInfo* getPanelEstate(); + static LLPanelEstateAccess* getPanelAccess(); static LLPanelEstateCovenant* getPanelCovenant(); static LLPanelRegionTerrainInfo* getPanelRegionTerrain(); static LLPanelRegionExperiences* getPanelExperiences(); @@ -103,20 +111,22 @@ class LLFloaterRegionInfo : public LLFloater LLFloaterRegionInfo(const LLSD& seed); ~LLFloaterRegionInfo(); - - protected: void onTabSelected(const LLSD& param); void disableTabCtrls(); void refreshFromRegion(LLViewerRegion* region); + void onGodLevelChange(U8 god_level); // member data LLTabContainer* mTab; typedef std::vector<LLPanelRegionInfo*> info_panels_t; info_panels_t mInfoPanels; LLPanelRegionEnvironment *mEnvironmentPanel; + //static S32 sRequestSerial; // serial # of last EstateOwnerRequest + static LLUUID sRequestInvoice; private: + LLAgent::god_level_change_slot_t mGodLevelChangeSlot; boost::signals2::connection mRegionChangedCallback; }; @@ -152,6 +162,15 @@ class LLPanelRegionInfo : public LLPanel typedef std::vector<std::string> strings_t; //typedef std::vector<U32> integers_t; + void sendEstateOwnerMessage( + LLMessageSystem* msg, + const std::string& request, + const LLUUID& invoice, + const strings_t& strings); + + + // member data + LLHost mHost; }; ///////////////////////////////////////////////////////////////////////////// @@ -253,9 +272,12 @@ class LLPanelRegionTerrainInfo : public LLPanelRegionInfo }; ///////////////////////////////////////////////////////////////////////////// + class LLPanelEstateInfo : public LLPanelRegionInfo { public: + static void initDispatch(LLDispatcher& dispatch); + void onChangeFixedSun(); void onChangeUseGlobalTime(); void onChangeAccessOverride(); @@ -265,35 +287,11 @@ class LLPanelEstateInfo : public LLPanelRegionInfo void onClickEditDayCycle(); void onClickEditDayCycleHelp(); - void onClickAddAllowedAgent(); - void onClickRemoveAllowedAgent(); - void onClickAddAllowedGroup(); - void onClickRemoveAllowedGroup(); - void onClickAddBannedAgent(); - void onClickRemoveBannedAgent(); - void onClickAddEstateManager(); - void onClickRemoveEstateManager(); void onClickKickUser(); - // Group picker callback is different, can't use core methods below - bool addAllowedGroup(const LLSD& notification, const LLSD& response); - void addAllowedGroup2(LLUUID id); - - // Core methods for all above add/remove button clicks - static void accessAddCore(U32 operation_flag, const std::string& dialog_name); - static bool accessAddCore2(const LLSD& notification, const LLSD& response); - static void accessAddCore3(const uuid_vec_t& ids, void* data); - - static void accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name); - static bool accessRemoveCore2(const LLSD& notification, const LLSD& response); - // used for both add and remove operations - static bool accessCoreConfirm(const LLSD& notification, const LLSD& response); bool kickUserConfirm(const LLSD& notification, const LLSD& response); - // Send the actual EstateOwnerRequest "estateaccessdelta" message - static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id); - void onKickUserCommit(const uuid_vec_t& ids); static void onClickMessageEstate(void* data); bool onMessageCommit(const LLSD& notification, const LLSD& response); @@ -315,7 +313,6 @@ class LLPanelEstateInfo : public LLPanelRegionInfo virtual void refresh(); void refreshFromEstate(); - void refreshAccessFromEstate(U32 flags); static bool isLindenEstate(); @@ -330,7 +327,6 @@ class LLPanelEstateInfo : public LLPanelRegionInfo void commitEstateAccess(); void commitEstateManagers(); - void clearAccessLists(); BOOL checkSunHourSlider(LLUICtrl* child_ctrl); U32 mEstateID; @@ -418,7 +414,7 @@ class LLPanelRegionExperiences : public LLPanelRegionInfo void sendPurchaseRequest()const; void processResponse( const LLSD& content ); private: - void refreshExperiencesFromEstate(); + void refreshRegionExperiences(); static std::string regionCapabilityQuery(LLViewerRegion* region, const std::string &cap); @@ -433,4 +429,66 @@ class LLPanelRegionExperiences : public LLPanelRegionInfo LLUUID mDefaultExperience; }; + +class LLPanelEstateAccess : public LLPanelRegionInfo +{ + LOG_CLASS(LLPanelEstateAccess); + +public: + LLPanelEstateAccess(); + + virtual BOOL postBuild(); + virtual void updateChild(LLUICtrl* child_ctrl); + + void updateControls(LLViewerRegion* region); + void updateLists(); + + void setPendingUpdate(bool pending) { mPendingUpdate = pending; } + bool getPendingUpdate() { return mPendingUpdate; } + + virtual bool refreshFromRegion(LLViewerRegion* region); + +private: + void onClickAddAllowedAgent(); + void onClickRemoveAllowedAgent(); + void onClickCopyAllowedList(); + void onClickAddAllowedGroup(); + void onClickRemoveAllowedGroup(); + void onClickCopyAllowedGroupList(); + void onClickAddBannedAgent(); + void onClickRemoveBannedAgent(); + void onClickCopyBannedList(); + void onClickAddEstateManager(); + void onClickRemoveEstateManager(); + void onAllowedSearchEdit(const std::string& search_string); + void onAllowedGroupsSearchEdit(const std::string& search_string); + void onBannedSearchEdit(const std::string& search_string); + + // Group picker callback is different, can't use core methods below + bool addAllowedGroup(const LLSD& notification, const LLSD& response); + void addAllowedGroup2(LLUUID id); + + // Core methods for all above add/remove button clicks + static void accessAddCore(U32 operation_flag, const std::string& dialog_name); + static bool accessAddCore2(const LLSD& notification, const LLSD& response); + static void accessAddCore3(const uuid_vec_t& ids, std::vector<LLAvatarName> names, void* data); + + static void accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name); + static bool accessRemoveCore2(const LLSD& notification, const LLSD& response); + + // used for both add and remove operations + static bool accessCoreConfirm(const LLSD& notification, const LLSD& response); + + // Send the actual EstateOwnerRequest "estateaccessdelta" message + static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id); + + static void requestEstateGetAccessCoro(std::string url); + + void searchAgent(LLNameListCtrl* listCtrl, const std::string& search_string); + void copyListToClipboard(std::string list_name); + + bool mPendingUpdate; + BOOL mCtrlsEnabled; +}; + #endif diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index fe75ab8e5094d11b1f253f4b2d2481436ae2944b..62e0e2d077142da7a51e12472a9c84c1c330ba2b 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -32,6 +32,7 @@ #include "llavatarnamecache.h" #include "llcachename.h" +#include "llfloater.h" #include "llfloaterreg.h" #include "llinventory.h" #include "llscrolllistitem.h" @@ -212,7 +213,10 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) BOOL handled = FALSE; S32 column_index = getColumnIndexFromOffset(x); LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y)); - if (hit_item + LLFloater* floater = gFloaterView->getParentFloater(this); + if (floater + && floater->isFrontmost() + && hit_item && column_index == mNameColumnIndex) { // ...this is the column with the avatar name @@ -313,8 +317,19 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow( switch(name_item.target) { case GROUP: - gCacheName->getGroupName(id, fullname); - // fullname will be "nobody" if group not found + if (!gCacheName->getGroupName(id, fullname)) + { + avatar_name_cache_connection_map_t::iterator it = mGroupNameCacheConnections.find(id); + if (it != mGroupNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mGroupNameCacheConnections.erase(it); + } + mGroupNameCacheConnections[id] = gCacheName->getGroup(id, boost::bind(&LLNameListCtrl::onGroupNameCache, this, _1, _2, item->getHandle())); + } break; case SPECIAL: // just use supplied name @@ -415,6 +430,20 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id) } } +// public +LLScrollListItem* LLNameListCtrl::getNameItemByAgentId(const LLUUID& agent_id) +{ + for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++) + { + LLScrollListItem* item = *it; + if (item && item->getUUID() == agent_id) + { + return item; + } + } + return NULL; +} + void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, @@ -479,6 +508,31 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id, dirtyColumns(); } +void LLNameListCtrl::onGroupNameCache(const LLUUID& group_id, const std::string name, LLHandle<LLNameListItem> item) +{ + avatar_name_cache_connection_map_t::iterator it = mGroupNameCacheConnections.find(group_id); + if (it != mGroupNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mGroupNameCacheConnections.erase(it); + } + + LLNameListItem* list_item = item.get(); + if (list_item && list_item->getUUID() == group_id) + { + LLScrollListCell* cell = list_item->getColumn(mNameColumnIndex); + if (cell) + { + cell->setValue(name); + setNeedsSort(); + } + } + + dirtyColumns(); +} void LLNameListCtrl::updateColumns(bool force_update) { diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 677b49e66764bb163e2703a41033520720798527..ef0be135e618e1c2b9473553700332eead2ef1d7 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -154,6 +154,8 @@ class LLNameListCtrl void removeNameItem(const LLUUID& agent_id); + LLScrollListItem* getNameItemByAgentId(const LLUUID& agent_id); + // LLView interface /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, @@ -171,6 +173,7 @@ class LLNameListCtrl private: void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false); void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item); + void onGroupNameCache(const LLUUID& group_id, const std::string name, LLHandle<LLNameListItem> item); private: S32 mNameColumnIndex; @@ -179,6 +182,7 @@ class LLNameListCtrl bool mShortNames; // display name only, no SLID typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t; avatar_name_cache_connection_map_t mAvatarNameCacheConnections; + avatar_name_cache_connection_map_t mGroupNameCacheConnections; S32 mPendingLookupsRemaining; namelist_complete_signal_t mNameListCompleteSignal; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 756dafe2706b705059d60b671fe11d55a135f1d5..07f100ca5581a1d6c3b5f33cc43158f76a8bd2e6 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -40,6 +40,7 @@ #include "llfloateravatarpicker.h" #include "llfloateravatarrendersettings.h" #include "llfloateravatartextures.h" +#include "llfloaterbanduration.h" #include "llfloaterbigpreview.h" #include "llfloaterbeacons.h" #include "llfloaterbuildoptions.h" @@ -199,6 +200,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("avatar_render_settings", "floater_avatar_render_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarRenderSettings>); LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>); + LLFloaterReg::add("ban_duration", "floater_ban_duration.xml", &LLFloaterReg::build<LLFloaterBanDuration>); LLFloaterReg::add("beacons", "floater_beacons.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBeacons>); LLFloaterReg::add("bulk_perms", "floater_bulk_perms.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBulkPermission>); LLFloaterReg::add("buy_currency", "floater_buy_currency.xml", &LLFloaterBuyCurrency::buildFloater); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index a7151c4d1bce812de8a291564384e8a6151081a9..226283e1b27628df30427cb267c71ff5654385f0 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3072,7 +3072,7 @@ void LLViewerObject::unlinkControlAvatar() if (mControlAvatar) { mControlAvatar->markForDeath(); - mControlAvatar->mRootVolp = NULL; + mControlAvatar->mRootVolp = NULL; mControlAvatar = NULL; } } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 1c4f7c7b4d47555cd6407bce3bc6cbb770bf921a..4c9e57f0b40a85d0fe5f78bb23f1803a331268cf 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -2893,6 +2893,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("DispatchRegionInfo"); capabilityNames.append("DirectDelivery"); capabilityNames.append("EnvironmentSettings"); + capabilityNames.append("EstateAccess"); capabilityNames.append("EstateChangeInfo"); capabilityNames.append("EventQueueGet"); capabilityNames.append("ExtEnvironment"); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 996d14080584e31d9d4a22311cb5fa55e6dacba0..6bb161aa4b3fc9f1bf41251d97ffcb0415512615 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1779,6 +1779,16 @@ LLViewerWindow::LLViewerWindow(const Params& p) LLCoordScreen scr; mWindow->getSize(&scr); + // Reset UI scale factor on first run if OS's display scaling is not 100% + if (gSavedSettings.getBOOL("ResetUIScaleOnFirstRun")) + { + if (mWindow->getSystemUISize() != 1.f) + { + gSavedSettings.setF32("UIScaleFactor", 1.f); + } + gSavedSettings.setBOOL("ResetUIScaleOnFirstRun", FALSE); + } + // Get the real window rect the window was created with (since there are various OS-dependent reasons why // the size of a window or fullscreen context may have been adjusted slightly...) F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize(); diff --git a/indra/newview/skins/default/xui/de/floater_auction.xml b/indra/newview/skins/default/xui/de/floater_auction.xml index 8ededff319a83f9e4a16aa474c2e89b5ab01f8c4..4a0b136235b88ded5e9d5c3c437af0d09ff6e2bd 100644 --- a/indra/newview/skins/default/xui/de/floater_auction.xml +++ b/indra/newview/skins/default/xui/de/floater_auction.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="LINDEN LAND VERKAUF STARTEN"> +<floater name="floater_auction" title="LINDEN-LANDVERKAUF STARTEN"> <floater.string name="already for sale"> Parzellen, die bereits zum Verkauf stehen, können nicht auktioniert werden. </floater.string> <check_box initial_value="true" label="Gelben Auswahlrahmen einschließen" name="fence_check"/> - <button label="Foto" label_selected="Foto" name="snapshot_btn"/> + <button label="Screenshot" label_selected="Screenshot" name="snapshot_btn"/> <button label="An jeden verkaufen" label_selected="An jeden verkaufen" name="sell_to_anyone_btn"/> <button label="Einstellungen löschen" label_selected="Einstellungen löschen" name="reset_parcel_btn"/> <button label="Auktion beginnen" label_selected="Auktion beginnen" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 563d179d4ca8a52413e08ca8df82a82ca2252f7f..2382434682136c28044e3947d769082ebad9654a 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -198,6 +198,7 @@ <combo_box.item label="Objekt bezahlen" name="Payobject"/> <combo_box.item label="Öffnen" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Keine" name="None"/> </combo_box> <check_box label="Zum Verkauf:" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index b4d5b968034a5eb6a8e089c56fd40026a0d85595..c24b7fb5d5ba66de8217c4dfbf0d9e3b99e3e28d 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="Kamerasteuerungen..." name="Camera Controls"/> <menu label="Bewegung" name="Movement"> <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_call label="Aufstehen" name="Stand up"/> <menu_item_check label="Fliegen" name="Fly"/> <menu_item_check label="Immer rennen" name="Always Run"/> <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index e14419efb1d53ffe34051fd45bd01bfd7df66b12..1b4696b615c70176d1ac5469aa1fcf6326eb9a0b 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -1584,6 +1584,30 @@ Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 un <notification name="ProblemAddingEstateManagerBanned"> Verbannter Einwohner kann nicht zur Grundbesitzverwalterliste hinzugefügt werden. </notification> + <notification name="ProblemBanningEstateManager"> + Grundbesitzverwalter [AGENT] kann nicht zur Bannliste hinzugefügt werden. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> befindet sich bereits auf der Liste der zulässigen Gruppen. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] befindet sich bereits auf Ihrer [LIST_TYPE]-Liste. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] befinden sich bereits auf Ihrer [LIST_TYPE]-Liste. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] wurde der [LIST_TYPE]-Liste von [ESTATE] hinzugefügt. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] wurden zur [LIST_TYPE]-Liste von [ESTATE] hinzugefügt. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] wurden von der [LIST_TYPE]-Liste von [ESTATE] entfernt. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] wurden von der [LIST_TYPE]-Liste von [ESTATE] entfernt. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind. </notification> @@ -3181,16 +3205,22 @@ Klicken Sie auf 'Akzeptieren ', um dem Chat beizutreten, oder auf &a Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden. </notification> <notification name="VoiceEffectsExpired"> - Ein oder mehrere Ihrer Voice-Morph-Abos ist/sind abgelaufen. -[[URL] Hier klicken], um Ihr Abo zu erneuern. + Ein oder mehrere Ihrer Voice-Morph-Abos sind abgelaufen. +[[URL] Klicken Sie hier], um Ihr Abo zu erneuern. + +Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen. </notification> <notification name="VoiceEffectsExpiredInUse"> - Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet. -[[URL] Hier klicken], um Ihr Abo zu erneuern. + Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet. +[[URL] Klicken Sie hier], um Ihr Abo zu erneuern. + +Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen. </notification> <notification name="VoiceEffectsWillExpire"> - Ein oder mehrere Ihrer Voice-Morph-Abos werden in weniger als [INTERVAL] Tagen ablaufen. -[[URL] Hier klicken], um Ihr Abo zu erneuern. + Ein oder mehrere Ihrer Voice-Morph-Abos laufen in weniger als [INTERVAL] Tagen ab. +[[URL] Klicken Sie hier], um Ihr Abo zu erneuern. + +Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen. </notification> <notification name="VoiceEffectsNew"> Neue Voice-Morph-Effekte sind erhältlich! @@ -3242,6 +3272,9 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt. <notification name="SnapshotToComputerFailed"> Fehler beim Speichern des Bildes unter [PATH]: Zu wenig Speicherplatz auf dem Medium. [NEED_MEMORY]KB werden benötigt, es stehen jedoch nur [FREE_MEMORY]KB zur Verfügung. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Fehler beim Speichern des Bildes unter [PATH]: Verzeichnis nicht vorhanden. + </notification> <notification name="PresetNotSaved"> Fehler beim Speichern der Voreinstellung [NAME]. </notification> diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index 32c9598edfe0ac71a94765c7a1040a0e337218a0..287f55a127e5900314b99ab522e27ffa9363a280 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=de</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=de + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Benutzername" name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Anmelden" name="connect_btn"/> <check_box label="Details speichern" name="remember_check"/> - <text name="forgot_password_text">Kennwort vergessen</text> + <text name="forgot_password_text"> + Kennwort vergessen + </text> <combo_box label="Grid auswählen" name="server_combo"/> + <text name="sign_up_text"> + Registrieren + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_login_first.xml b/indra/newview/skins/default/xui/de/panel_login_first.xml index 44637d5159766321fb929887c2c772dc0b2ee265..038001157e811f138cd10c2ad11585e5eba32e69 100644 --- a/indra/newview/skins/default/xui/de/panel_login_first.xml +++ b/indra/newview/skins/default/xui/de/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=de </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Kennwort vergessen </text> + <text name="sign_up_text"> + Registrieren + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/de/panel_region_access.xml b/indra/newview/skins/default/xui/de/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ebc4867fb81f72af256f2ab0adcf84ae5c76ecb --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Zugang" name="Access"> + <tab_container name="tabs"> + <panel label="GRUNDBESITZVERWALTER" name="estate_managers_panel"> + <text name="estate_manager_label"> + Grundbesitzverwalter: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Name" name="name"/> + </name_list> + <button label="Hinzufügen..." name="add_estate_manager_btn"/> + <button label="Entfernen..." name="remove_estate_manager_btn"/> + </panel> + <panel label="ZULÄSSIG" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Zulässige Agenten suchen" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Immer zugelassen: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Name" name="name"/> + </name_list> + <button label="Hinzufügen..." name="add_allowed_avatar_btn"/> + <button label="Entfernen..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="ZULÄSSIGE GRUPPEN" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Zulässige Gruppen Suchen" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Immer zugelassene Gruppen: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Name" name="name"/> + </name_list> + <button label="Hinzufügen..." name="add_allowed_group_btn"/> + <button label="Entfernen..." name="remove_allowed_group_btn"/> + </panel> + <panel label="VERBANNT" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Verbannte Agenten suchen" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Immer verbannt: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Name" name="name"/> + <columns label="Letztes Login-Datum" name="last_login_date"/> + <columns label="Datum der Verbannung" name="ban_date"/> + <columns label="Verbannt von" name="bannedby"/> + </name_list> + <button label="Hinzufügen..." name="add_banned_avatar_btn"/> + <button label="Entfernen..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_region_estate.xml b/indra/newview/skins/default/xui/de/panel_region_estate.xml index dd8a562cb79e066bfbae2406846a74d645f3f5a9..b713dd58d02f1b6c92de8145887dc1cd51baf371 100644 --- a/indra/newview/skins/default/xui/de/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/de/panel_region_estate.xml @@ -16,7 +16,7 @@ (unbekannt) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Nur nachstehend aufgelistete Einwohner und Gruppen zulassen" name="estate_restricted_access"/> + <radio_item label="Nur Einwohner und Gruppen zulassen, die im Reiter "Zugang" aufgelistet sind." name="estate_restricted_access"/> <radio_item label="Alle Besucher zugelassen" name="estate_public_access"/> </radio_group> <check_box label="Muss 18+ sein" name="limit_age_verified" tool_tip="Nur Einwohner, die mindestens 18 Jahre alt sind, können diesen Grundbesitz betreten. Weitere Informationen finden Sie unter [SUPPORT_SITE]."/> @@ -26,7 +26,7 @@ <check_box label="Direktteleport zulassen" name="allow_direct_teleport"/> <button label="Ãœbernehmen" name="apply_btn"/> <text name="estate_manager_label"> - Grundbesitzverwalter: + Grundbesitzsverwalter: </text> <text name="allow_resident_label"> Immer zugelassen: diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml index c30611c66c09d3f5fcaf39d569a2e8eb3331d56b..c8cd49995642cf89432c00aaab722378ec6b2648 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Objektprofil"> - <panel.string name="text deed continued">Ãœbertragung</panel.string> - <panel.string name="text deed">Ãœbertragung</panel.string> - <panel.string name="text modify info 1">Sie können dieses Objekt bearbeiten.</panel.string> - <panel.string name="text modify info 2">Sie können diese Objekte bearbeiten.</panel.string> - <panel.string name="text modify info 3">Sie können dieses Objekt nicht bearbeiten.</panel.string> - <panel.string name="text modify info 4">Sie können diese Objekte nicht bearbeiten.</panel.string> - <panel.string name="text modify info 5">Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden</panel.string> - <panel.string name="text modify info 6">Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden</panel.string> - <panel.string name="text modify warning">Diese Objekt verfügt über verknüpfte Teile</panel.string> - <panel.string name="Cost Default">Preis: L$</panel.string> - <panel.string name="Cost Total">Summenpreis: L$</panel.string> - <panel.string name="Cost Per Unit">Stückpreis: L$</panel.string> - <panel.string name="Cost Mixed">Mischpreis</panel.string> - <panel.string name="Sale Mixed">Mischverkauf</panel.string> + <panel.string name="text deed continued"> + Ãœbertragung + </panel.string> + <panel.string name="text deed"> + Ãœbertragung + </panel.string> + <panel.string name="text modify info 1"> + Sie können dieses Objekt bearbeiten. + </panel.string> + <panel.string name="text modify info 2"> + Sie können diese Objekte bearbeiten. + </panel.string> + <panel.string name="text modify info 3"> + Sie können dieses Objekt nicht bearbeiten. + </panel.string> + <panel.string name="text modify info 4"> + Sie können diese Objekte nicht bearbeiten. + </panel.string> + <panel.string name="text modify info 5"> + Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden + </panel.string> + <panel.string name="text modify info 6"> + Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden + </panel.string> + <panel.string name="text modify warning"> + Diese Objekt verfügt über verknüpfte Teile + </panel.string> + <panel.string name="Cost Default"> + Preis: L$ + </panel.string> + <panel.string name="Cost Total"> + Summenpreis: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Stückpreis: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mischpreis + </panel.string> + <panel.string name="Sale Mixed"> + Mischverkauf + </panel.string> <text name="title" value="Objektprofil"/> <text name="where" value="(Inworld)"/> <panel label="" name="properties_panel"> - <text name="Name:">Name:</text> - <text name="Description:">Beschreibung:</text> - <text name="CreatorNameLabel">Ersteller:</text> - <text name="Owner:">Eigentümer:</text> - <text name="Group_label">Gruppe:</text> + <text name="Name:"> + Name: + </text> + <text name="Description:"> + Beschreibung: + </text> + <text name="CreatorNameLabel"> + Ersteller: + </text> + <text name="Owner:"> + Eigentümer: + </text> + <text name="Group_label"> + Gruppe: + </text> <button name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/> <name_box initial_value="Wird geladen..." name="Group Name Proxy"/> <button label="Ãœbertragung" label_selected="Ãœbertragung" name="button deed" tool_tip="Eine Ãœbertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/> - <text name="label click action">Bei Linksklick:</text> + <text name="label click action"> + Bei Linksklick: + </text> <combo_box name="clickaction"> <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/> <combo_box.item label="Auf Objekt setzen" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="Objekt bezahlen" name="Payobject"/> <combo_box.item label="Öffnen" name="Open"/> <combo_box.item label="Zoomen" name="Zoom"/> + <combo_box.item label="Keine" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Sie können dieses Objekt bearbeiten.</text> - <text name="Anyone can:">Jeder:</text> + <text name="perm_modify"> + Sie können dieses Objekt bearbeiten. + </text> + <text name="Anyone can:"> + Jeder: + </text> <check_box label="Kopieren" name="checkbox allow everyone copy"/> <check_box label="Bewegen" name="checkbox allow everyone move"/> - <text name="GroupLabel">Gruppe:</text> + <text name="GroupLabel"> + Gruppe: + </text> <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Ãœbereignen, um Rollenbeschränkungen zu aktivieren."/> - <text name="NextOwnerLabel">Nächster Eigentümer:</text> + <text name="NextOwnerLabel"> + Nächster Eigentümer: + </text> <check_box label="Bearbeiten" name="checkbox next owner can modify"/> <check_box label="Kopieren" name="checkbox next owner can copy"/> <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="Preis: L$" name="Edit Cost"/> <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/> - <text name="pathfinding_attributes_label">Pathfinding-Attribute:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Pathfinding-Attribute: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Öffnen" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index f80b1ee1ec880be4f5de1ab243d4ce8945bbc55f..7b292674c46c9394b3639d20f5efb332929762d8 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -2240,6 +2240,18 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo <string name="RegionInfoListTypeBannedAgents"> Immer verbannt </string> + <string name="RegionInfoAllEstates"> + alle Grundbesitze + </string> + <string name="RegionInfoManagedEstates"> + verwaltete Grundbesitze + </string> + <string name="RegionInfoThisEstate"> + dieser Grundbesitz + </string> + <string name="AndNMore"> + und [EXTRA_COUNT] weitere + </string> <string name="ScriptLimitsParcelScriptMemory"> Parzellenskript-Speicher </string> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 37c4e3ff8d5c3853c59d9e43e0358a690e84c323..48f80c4d725e845597d4acae8edc3e7a16cd5e55 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -21,6 +21,14 @@ name="maturity_icon_adult"> "Parcel_R_Dark" </floater.string> + <floater.string + name="Hours"> + [HOURS] hrs. + </floater.string> + <floater.string + name="Hour"> + hr. + </floater.string> <floater.string name="Minutes"> [MINUTES] min. @@ -37,6 +45,10 @@ name="Remaining"> remaining </floater.string> + <floater.string + name="Always"> + Always + </floater.string> <tab_container follows="all" halign="left" @@ -2063,19 +2075,29 @@ Only large parcels can be listed in search. name="BanCheck" top="0" width="200"> - Always banned ([COUNT], max [MAX]) + Banned ([COUNT], max [MAX]) </text> <name_list column_padding="0" follows="top|bottom" - heading_height="14" + heading_height="16" height="125" layout="topleft" left="0" multi_select="true" + draw_heading="true" name="BannedList" tool_tip="([LISTED] listed, [MAX] max)" - width="230" /> + width="230"> + <columns + label="Name" + name="name" + width="155" /> + <columns + label="Duration" + name="duration" + width="75" /> + </name_list> <button follows="bottom" height="23" diff --git a/indra/newview/skins/default/xui/en/floater_ban_duration.xml b/indra/newview/skins/default/xui/en/floater_ban_duration.xml new file mode 100644 index 0000000000000000000000000000000000000000..5562f288774f8533e1499485c1e438fdf7b785db --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_ban_duration.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_minimize="false" + can_tear_off="false" + can_resize="false" + can_drag_on_left="false" + can_close="true" + height="150" + layout="topleft" + name="ban_duration" + title="Ban duration" + single_instance="true" + width="180"> + <text + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left="15" + name="duration_textbox" + top="10" + width="75"> + Ban duration: + </text> + + <radio_group + draw_border="false" + enabled="true" + follows="left|top" + height="40" + left="20" + mouse_opaque="true" + name="ban_duration_radio" + tab_stop="true" + width="200"> + <radio_item + type="string" + follows="left|top" + height="20" + width="200" + label="Always" + name="always_radio"> + Always + </radio_item> + <radio_item + type="string" + follows="left|top" + height="20" + width="200" + label="Temporary" + name="temporary_radio"> + Temporary + </radio_item> + </radio_group> + + <spinner + allow_digits_only="true" + decimal_digits="0" + follows="left|top" + height="20" + increment="1" + max_val="8766" + min_val="1" + initial_val="1" + name="ban_hours" + top_delta="50" + left="40" + width="60"/> + <text + type="string" + length="1" + follows="left|top" + height="15" + left_delta="70" + name="hours_textbox" + top_delta="5" + width="75"> + hours. + </text> + + <button + follows="left|top" + height="23" + label="Ok" + left="15" + name="ok_btn" + top_delta="30" + width="75"> + </button> + <button + follows="left|top" + height="23" + label="Cancel" + left_pad="0" + name="cancel_btn" + top_delta="0" + width="75"> + </button> +</floater> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 42b1a1ec1beff6c2708a0a8fcf78a939bbc62b57..931e44b319feeb0633143574f098c6199c777361 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3815,6 +3815,62 @@ Can't add estate owner to estate 'Banned Resident' list. type="alertmodal"> Unable to add banned resident to estate manager list. </notification> + + <notification + icon="alertmodal.tga" + name="ProblemBanningEstateManager" + type="alertmodal"> +Unable to add estate manager [AGENT] to banned list. + </notification> + + <notification + icon="alertmodal.tga" + name="GroupIsAlreadyInList" + type="alertmodal"> +<nolink>[GROUP]</nolink> is already in the Allowed Groups list. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentIsAlreadyInList" + type="alertmodal"> +[AGENT] is already in your [LIST_TYPE] list. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentsAreAlreadyInList" + type="alertmodal"> +[AGENT] are already in your [LIST_TYPE] list. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentWasAddedToList" + type="alertmodal"> +[AGENT] was added to [LIST_TYPE] list of [ESTATE]. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentsWereAddedToList" + type="alertmodal"> +[AGENT] were added to [LIST_TYPE] list of [ESTATE]. + + </notification> + <notification + icon="alertmodal.tga" + name="AgentWasRemovedFromList" + type="alertmodal"> +[AGENT] was removed from [LIST_TYPE] list of [ESTATE]. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentsWereRemovedFromList" + type="alertmodal"> +[AGENT] were removed from [LIST_TYPE] list of [ESTATE]. + </notification> <notification icon="alertmodal.tga" @@ -4616,7 +4672,8 @@ Add to allowed list for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateAllowedAgentRemove" - type="alert"> + type="alertmodal"> + <unique/> Remove from allowed list for this estate only or for [ALL_ESTATES]? <tag>confirm</tag> <usetemplate @@ -4645,7 +4702,8 @@ Add to group allowed list for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateAllowedGroupRemove" - type="alert"> + type="alertmodal"> + <unique/> Remove from group allowed list for this estate only or [ALL_ESTATES]? <tag>group</tag> <tag>confirm</tag> @@ -4674,8 +4732,9 @@ Deny access for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateBannedAgentRemove" - type="alert"> -Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]? + type="alertmodal"> + <unique/> +Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]? <tag>confirm</tag> <usetemplate canceltext="Cancel" @@ -4702,7 +4761,8 @@ Add estate manager for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateManagerRemove" - type="alert"> + type="alertmodal"> + <unique/> Remove estate manager for this estate only or for [ALL_ESTATES]? <tag>confirm</tag> <usetemplate diff --git a/indra/newview/skins/default/xui/en/panel_region_access.xml b/indra/newview/skins/default/xui/en/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..4be073195b7c4dda226a2fead884374e700e9d93 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_region_access.xml @@ -0,0 +1,421 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="true" + follows="top|left" + height="510" + help_topic="panel_region_access_tab" + label="Access" + layout="topleft" + left="0" + name="Access" + top="320" + width="530"> + + +<tab_container + bottom="-10" + follows="all" + layout="topleft" + left="3" + name="tabs" + tab_min_width="70" + tab_height="30" + tab_position="top" + top="10" + halign="center" + right="-5"> + +<!-- ============================= ESTATE MANAGERS tab ====================== --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="ESTATE MANAGERS" + layout="topleft" + left="0" + help_topic="estate_managers_tab" + name="estate_managers_panel" + right="-1" + top="0"> + <text + type="string" + length="1" + bottom="34" + follows="left|top" + height="20" + layout="topleft" + name="estate_manager_label" + top_pad="10" + left="10" + width="200"> + Estate Managers: + </text> + <!-- Estate Managers box --> + <view_border + bevel_style="none" + follows="top|left" + height="400" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="400" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="estate_manager_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="498" /> + </name_list> + <!-- Estate Managers buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_estate_manager_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_estate_manager_btn" + left_pad="6" + width="114" /> + </panel> + + +<!-- ================================ ALLOWED tab =========================== --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="ALLOWED" + layout="topleft" + left="0" + help_topic="allowed_tab" + name="allowed_panel" + right="-1" + top="0"> + <panel + follows="left|top|right" + height="27" + label="top_panel" + layout="topleft" + left="0" + name="allowed_search_panel" + right="-1" + top="0"> + <filter_editor + follows="left|top|right" + height="23" + layout="topleft" + left="6" + label="Search allowed agents" + max_length_chars="300" + name="allowed_search_input" + text_color="Black" + text_pad_left="10" + top="4" + width="440" /> + <button + follows="left|top" + height="23" + label="Copy" + layout="topleft" + left_pad="10" + name="copy_allowed_list_btn" + width="40" /> + </panel> + <text + type="string" + length="1" + bottom="34" + follows="left|top" + height="20" + layout="topleft" + name="allow_resident_label" + top_pad="10" + left="10" + width="200"> + Always allowed: + </text> + <!-- Always allowed box --> + <view_border + bevel_style="none" + follows="top|left" + height="370" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="370" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="allowed_avatar_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="498" /> + </name_list> + <!-- Always allowed buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_allowed_avatar_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_allowed_avatar_btn" + left_pad="6" + width="114" /> + </panel> + + <!-- ============================= ALLOWED GROUPS tab ======================= --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="ALLOWED GROUPS" + layout="topleft" + left="0" + help_topic="allowed_groups_tab" + name="allowed_groups_panel" + right="-1" + top="0"> + <panel + follows="left|top|right" + height="27" + label="top_panel" + layout="topleft" + left="0" + name="allowed_group_search_panel" + right="-1" + top="0"> + <filter_editor + follows="left|top|right" + height="23" + layout="topleft" + left="6" + label="Search allowed groups" + max_length_chars="300" + name="allowed_group_search_input" + text_color="Black" + text_pad_left="10" + top="4" + width="440" /> + <button + follows="left|top" + height="23" + label="Copy" + layout="topleft" + left_pad="10" + name="copy_allowed_group_list_btn" + width="40" /> + </panel> + <text + type="string" + length="1" + follows="left|top" + height="20" + layout="topleft" + left="10" + name="allow_group_label" + top_pad="10" + width="200"> + Groups always allowed: + </text> + <!-- Groups always allowed box --> + <view_border + bevel_style="none" + follows="top|left" + height="370" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="370" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="allowed_group_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="498" /> + </name_list> + <!-- Groups always allowed buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_allowed_group_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_allowed_group_btn" + left_pad="6" + top_delta="0" + width="114" /> + </panel> + + <!-- ================================ BANNED tab ============================ --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="BANNED" + layout="topleft" + left="0" + help_topic="banned_tab" + name="banned_panel" + right="-1" + top="0"> + <panel + follows="left|top|right" + height="27" + label="top_panel" + layout="topleft" + left="0" + name="banned_search_panel" + right="-1" + top="0"> + <filter_editor + follows="left|top|right" + height="23" + layout="topleft" + left="6" + label="Search banned agents" + max_length_chars="300" + name="banned_search_input" + text_color="Black" + text_pad_left="10" + top="4" + width="440" /> + <button + follows="left|top" + height="23" + label="Copy" + layout="topleft" + left_pad="10" + name="copy_banned_list_btn" + width="40" /> + </panel> + <text + type="string" + length="1" + follows="left|top" + height="20" + layout="topleft" + left="10" + name="ban_resident_label" + top_pad="10" + width="200"> + Always banned: + </text> + <!-- Always banned box --> + <view_border + bevel_style="none" + follows="top|left" + height="370" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="370" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="banned_avatar_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="140" /> + <columns + label="Last login date" + name="last_login_date" + width="100" /> + <columns + label="Date banned" + name="ban_date" + width="100" /> + <columns + label="Banned by" + name="bannedby" + width="140" /> + </name_list> + <!-- Always banned buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_banned_avatar_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_banned_avatar_btn" + left_pad="6" + top_delta="0" + width="114" /> + </panel> + + +</tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index a0c1dd0be6872f1d82c41ef68324727e08500cad..9b9c870c49f384ebd8a41ef55652b567df02232a 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -82,7 +82,7 @@ <view_border bevel_style="none" follows="top|left" - height="105" + height="185" layout="topleft" left="10" top_pad="5" @@ -96,7 +96,7 @@ width="200"> <radio_item height="16" - label="Allow only residents and groups listed below" + label="Allow only residents and groups listed on the Access tab" layout="topleft" name="estate_restricted_access" /> <radio_item @@ -137,10 +137,10 @@ height="18" label="Allow Voice Chat" layout="topleft" - left="290" + left="20" name="voice_chat_check" - top_delta="-78" - width="200" /> + top_pad="2" + width="240" /> <check_box height="18" label="Allow Direct Teleport" @@ -148,7 +148,7 @@ left_delta="0" name="allow_direct_teleport" top_pad="2" - width="80" /> + width="240" /> <button enabled="false" follows="left|top" @@ -156,215 +156,9 @@ label="Apply" layout="topleft" name="apply_btn" - top_pad="30" - left_delta="0" - width="97" /> - - <text - type="string" - length="1" - bottom="34" - follows="left|top" - height="20" - layout="topleft" - name="estate_manager_label" - top_pad="25" - left="10" - width="200"> - Estate Managers: - </text> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="280" - name="allow_resident_label" - top_delta="0" - width="200"> - Always allowed: - </text> - - <!-- Estate Managers box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="10" - top_pad="-5" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" - left_delta="0" - multi_select="true" - name="estate_manager_name_list" - top_delta="0" - width="235" /> - - <!-- Always allowed box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="280" - top_delta="0" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" - left_delta="0" - multi_select="true" - name="allowed_avatar_name_list" - top_delta="0" - width="235" /> - - <!-- Estate Managers buttons --> - <button - follows="left|top" - height="23" - label="Add..." - layout="topleft" - left="10" - name="add_estate_manager_btn" - top_pad="6" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_estate_manager_btn" - left_pad="6" - width="114" /> - - <!-- Always allowed buttons --> - <button - follows="left|top" - height="23" - left="280" - label="Add..." - layout="topleft" - name="add_allowed_avatar_btn" - top_delta="0" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_allowed_avatar_btn" - left_pad="6" - top_delta="0" - width="114" /> - - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="10" - name="allow_group_label" top_pad="10" - width="200"> - Groups always allowed: - </text> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="280" - name="ban_resident_label" - top_delta="0" - width="200"> - Always banned: - </text> - - <!-- Groups always allowed box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="10" - top_pad="-5" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" left_delta="0" - multi_select="true" - name="allowed_group_name_list" - top_delta="0" - width="235" /> - - <!-- Always banned box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="280" - top_delta="0" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" - left_delta="0" - multi_select="true" - name="banned_avatar_name_list" - top_delta="0" - width="235" /> - - <!-- Groups always allowed buttons --> - <button - follows="left|top" - height="23" - label="Add..." - layout="topleft" - left="10" - name="add_allowed_group_btn" - top_pad="6" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_allowed_group_btn" - left_pad="6" - top_delta="0" - width="114" /> - - <!-- Always banned buttons --> - <button - follows="left|top" - height="23" - label="Add..." - layout="topleft" - left="280" - name="add_banned_avatar_btn" - top_delta="0" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_banned_avatar_btn" - top_delta="0" - left_pad="6" - width="114" /> + width="97" /> <button follows="left|top" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 71133f582fc20e7f8fcdd23ee3d370c6ee92f24e..12edeb3ce92904e617f9098231d6556703160add 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -315,17 +315,6 @@ Please try logging in again in a minute.</string> <string name="BUTTON_DOCK">Dock</string> <string name="BUTTON_HELP">Show Help</string> - <!-- ToolTips for notecards --> - <string name="TooltipNotecardNotAllowedTypeDrop"> -Items of this type can't be attached -to notecards on this region. - </string> - <string name="TooltipNotecardOwnerRestrictedDrop"> -Only items with unrestricted -'next owner' permissions -"can be attached to notecards. - </string> - <!-- searching - generic --> <string name="Searching">Searching...</string> <string name="NoneFound">None found.</string> @@ -378,11 +367,6 @@ Error in upload request. Please visit http://secondlife.com/support for help fixing this problem. </string> - <!-- Settings errors --> - <string name="SettingValidationError">Validation failed for importing settings [NAME]</string> - <string name="SettingImportFileError">Could not open file [FILE]</string> - <string name="SettingParseFileError">Could not open file [FILE]</string> - <string name="SettingTranslateError">Could not translate legacy windlight [NAME]</string> <!-- Asset Type human readable names: these will replace variable [TYPE] in notification FailedToFindWearable* --> <!-- Will also replace [OBJECTTYPE] in notifications: UserGiveItem, ObjectGiveItem --> <string name="texture">texture</string> @@ -409,10 +393,9 @@ http://secondlife.com/support for help fixing this problem. <string name="simstate">simstate</string> <string name="favorite">favorite</string> <string name="symbolic link">link</string> - <string name="settings blob">settings</string> - <string name="symbolic folder link">folder link</string> - <string name="mesh">mesh</string> - + <string name="symbolic folder link">folder link</string> + <string name="mesh">mesh</string> + <!-- llvoavatar. Displayed in the avatar chat bubble --> <string name="AvatarEditingAppearance">(Editing Appearance)</string> <string name="AvatarAway">Away</string> @@ -536,7 +519,6 @@ http://secondlife.com/support for help fixing this problem. <string name="ManageEstateSilently">Manage your estates silently</string> <string name="ChangeYourDefaultAnimations">Change your default animations</string> <string name="ForceSitAvatar">Force your avatar to sit</string> - <string name="ChangeEnvSettings">Change your environment settings</string> <string name="NotConnected">Not Connected</string> <string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name --> @@ -2676,6 +2658,10 @@ If you continue to receive this message, please contact Second Life support for <string name="RegionInfoBannedResidents">Always banned: ([BANNEDAGENTS], max [MAXBANNED])</string> <string name="RegionInfoListTypeAllowedAgents">Always allowed</string> <string name="RegionInfoListTypeBannedAgents">Always banned</string> + <string name="RegionInfoAllEstates">all estates</string> + <string name="RegionInfoManagedEstates">managed estates</string> + <string name="RegionInfoThisEstate">this estate</string> + <string name="AndNMore">and [EXTRA_COUNT] more</string> <!-- script limits floater --> <string name="ScriptLimitsParcelScriptMemory">Parcel Script Memory</string> diff --git a/indra/newview/skins/default/xui/es/floater_auction.xml b/indra/newview/skins/default/xui/es/floater_auction.xml index 6faf19dbb570d83830305500ca0904e38d156b65..cbafe92cdfa1ca46d034f88229c2684f3001559d 100644 --- a/indra/newview/skins/default/xui/es/floater_auction.xml +++ b/indra/newview/skins/default/xui/es/floater_auction.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_auction" title="COMENZAR LA VENTA DE TERRENO LINDEN"> <floater.string name="already for sale"> - No puede subastar parcelas que ya están en venta. + No puedes ofertar en parcelas que ya están en venta. </floater.string> - <check_box initial_value="true" label="Incluir la valla amarilla de selección" name="fence_check"/> + <check_box initial_value="true" label="Incluir la cerca de selección amarilla" name="fence_check"/> <button label="Foto" label_selected="Foto" name="snapshot_btn"/> <button label="Vender a cualquiera" label_selected="Vender a cualquiera" name="sell_to_anyone_btn"/> - <button label="Limpiar las configuraciones" label_selected="Limpiar las configuraciones" name="reset_parcel_btn"/> + <button label="Borrar las configuraciones" label_selected="Borrar las configuraciones" name="reset_parcel_btn"/> <button label="Comenzar subasta" label_selected="Comenzar subasta" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index d95b2e41afebea01b85291321bfa710acf90ce85..57475b2f53df4a42409793dfc0e8aaa2845bf525 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -178,6 +178,7 @@ <combo_box.item label="Pagar al objeto" name="Payobject"/> <combo_box.item label="Abrirlo" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Ninguno" name="None"/> </combo_box> <check_box label="En venta:" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 4f407e4b1a7cdfdc3a98243a9637307670aa4566..2467f7785b52472b7fae8f3564688626399320f5 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="Controles de la cámara..." name="Camera Controls"/> <menu label="Movimiento" name="Movement"> <menu_item_call label="Sentarte" name="Sit Down Here"/> + <menu_item_call label="Levantarme" name="Stand up"/> <menu_item_check label="Volar" name="Fly"/> <menu_item_check label="Correr siempre" name="Always Run"/> <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> @@ -281,6 +282,7 @@ <menu_item_check label="Formas del fÃsico" name="Physics Shapes"/> <menu_item_check label="Actualizar el tipo" name="Update Type"/> <menu_item_check label="Información sobre el nivel de detalle" name="LOD Info"/> + <menu_item_check label="Recuento de triángulo" name="Triangle Count"/> <menu_item_check label="Crear cola" name="Build Queue"/> <menu_item_check label="PartÃculas" name="Particles"/> <menu_item_check label="Articulaciones" name="Joints"/> @@ -355,6 +357,7 @@ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/> <menu_item_check label="Mostrar los huesos" name="Show Bones"/> <menu_item_check label="Display Agent Target" name="Display Agent Target"/> + <menu_item_check label="Mostrar las medidas impostoras" name="Show Impostor Extents"/> <menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/> </menu> <menu_item_check label="HTTP Textures" name="HTTP Textures"/> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 8ba8144cb62f49827e78877d39f90108d6abb74e..46bfa00296fb5d70f1ca3a6b8d86e1c446f00075 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -1574,6 +1574,30 @@ Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE]. <notification name="ProblemAddingEstateManagerBanned"> No se puede añadir un residente expulsado a la lista de administradores de estado. </notification> + <notification name="ProblemBanningEstateManager"> + No fue posible agregar al administrador de estado [AGENT] a la lista de prohibidos. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> ya está en la lista de Grupos autorizados. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] ya está en tu lista [LIST_TYPE]. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] ya está en tu lista [LIST_TYPE]. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] fue añadido a la lista [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] fueron añadidos a la lista [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] fue eliminado de la lista [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] fueron eliminados de la lista [LIST_TYPE] de [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma. </notification> @@ -3164,16 +3188,22 @@ Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar a Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz. </notification> <notification name="VoiceEffectsExpired"> - Una o más de las transformaciones de voz a las que estás suscrito han caducado. -[Pulsa aquà [URL]] para renovar la suscripción. + Una o más de las transformaciones de voz a las que estás suscrito han caducado. +[[URL] Pulsa aquÃ] para renovar la suscripción. + +Si eres un miembro Premium [[PREMIUM_URL] pulsa aquÃ] para recibir tu beneficio de transformación de voz. </notification> <notification name="VoiceEffectsExpiredInUse"> - La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal. -[Pulsa aquà [URL]] para renovar la suscripción. + La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal. +[[URL] Pulsa aquÃ] para renovar la suscripción. + +Si eres un miembro Premium [[PREMIUM_URL] pulsa aquÃ] para recibir tu beneficio de transformación de voz. </notification> <notification name="VoiceEffectsWillExpire"> - Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] dÃas. -[Pulsa aquà [URL]] para renovar la suscripción. + Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] dÃas. +[[URL] Pulsa aquÃ] para renovar la suscripción + +Si eres un miembro Premium [[PREMIUM_URL] pulsa aquÃ] para recibir tu beneficio de transformación de voz. </notification> <notification name="VoiceEffectsNew"> Están disponibles nuevas transformaciones de voz. @@ -3225,6 +3255,9 @@ Por tu seguridad, serán bloqueadas durante unos segundos. <notification name="SnapshotToComputerFailed"> Error al guardar la foto en [PATH]: Disco lleno. Se requieren [NEED_MEMORY]KB pero solo hay [FREE_MEMORY]KB libres. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Error al guardar la foto en [PATH]: El directorio no existe. + </notification> <notification name="PresetNotSaved"> Error al guardar el valor predefinido [NAME]. </notification> diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml index 5300fce153171b3eccbd31263bae4863d9fcba26..f79d3b94222a1cfe2fa6b028d1c92b8348457c1a 100644 --- a/indra/newview/skins/default/xui/es/panel_login.xml +++ b/indra/newview/skins/default/xui/es/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=es</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=es + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nombre de usuario" name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Iniciar sesión" name="connect_btn"/> <check_box label="Recordarme" name="remember_check"/> - <text name="forgot_password_text">Contraseña olvidada</text> + <text name="forgot_password_text"> + Contraseña olvidada + </text> <combo_box label="Seleccionar cuadrÃcula" name="server_combo"/> + <text name="sign_up_text"> + RegÃstrate + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_login_first.xml b/indra/newview/skins/default/xui/es/panel_login_first.xml index 7787c6526f13088b549b13ebd80fd965eeaeac4a..ccb685835191db3b6f4fdfdf5eb4eb33a0c21500 100644 --- a/indra/newview/skins/default/xui/es/panel_login_first.xml +++ b/indra/newview/skins/default/xui/es/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=es </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Contraseña olvidada </text> + <text name="sign_up_text"> + RegÃstrate + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/es/panel_region_access.xml b/indra/newview/skins/default/xui/es/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..3177aa2ab24f154053c60954b7be2ab030add4c6 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Acceso" name="Access"> + <tab_container name="tabs"> + <panel label="ADMINISTRADORES DE ESTADO" name="estate_managers_panel"> + <text name="estate_manager_label"> + Administradores de estado: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nombre" name="name"/> + </name_list> + <button label="Añadir..." name="add_estate_manager_btn"/> + <button label="Quitar..." name="remove_estate_manager_btn"/> + </panel> + <panel label="PERMITIDO" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Buscar agentes autorizados" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Siempre autorizado: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nombre" name="name"/> + </name_list> + <button label="Añadir..." name="add_allowed_avatar_btn"/> + <button label="Quitar..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GRUPOS AUTORIZADOS:" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Buscar grupos autorizados" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Grupos siempre autorizados: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nombre" name="name"/> + </name_list> + <button label="Añadir..." name="add_allowed_group_btn"/> + <button label="Quitar..." name="remove_allowed_group_btn"/> + </panel> + <panel label="PROHIBIDO" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Buscar agentes prohibidos" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Siempre prohibido: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nombre" name="name"/> + <columns label="Última fecha de inicio de sesión" name="last_login_date"/> + <columns label="Fecha de prohibición" name="ban_date"/> + <columns label="Prohibido por" name="bannedby"/> + </name_list> + <button label="Añadir..." name="add_banned_avatar_btn"/> + <button label="Quitar..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_region_estate.xml b/indra/newview/skins/default/xui/es/panel_region_estate.xml index ae62976486d11642e79696633f62a74b35fe4aa1..4cfbffb887b4cab85e26aef37712546166b7863d 100644 --- a/indra/newview/skins/default/xui/es/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml @@ -16,7 +16,7 @@ (desconocido) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Permitir únicamente a los residentes y grupos indicados a continuación" name="estate_restricted_access"/> + <radio_item label="Permitir únicamente a los residentes y grupos indicados en la pestaña Acceso" name="estate_restricted_access"/> <radio_item label="Cualquiera puede visitar" name="estate_public_access"/> </radio_group> <check_box label="Debe ser mayor de 18" name="limit_age_verified" tool_tip="Para poder acceder a este estado, los Residentes deben ser mayores de 18 años. Para más información, consulta [SUPPORT_SITE]."/> diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml index b9c8139f1615b1176632cd328127127af4985c43..2032edfb3a28606e75abadd4289c9796590c74dd 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Perfil del objeto"> - <panel.string name="text deed continued">Transferir</panel.string> - <panel.string name="text deed">Transferir</panel.string> - <panel.string name="text modify info 1">Puedes modificar este objeto</panel.string> - <panel.string name="text modify info 2">Puedes modificar estos objetos</panel.string> - <panel.string name="text modify info 3">No puedes modificar este objeto</panel.string> - <panel.string name="text modify info 4">No puedes modificar estos objetos</panel.string> - <panel.string name="text modify info 5">No se puede modificar este objeto a través del lÃmite de una región</panel.string> - <panel.string name="text modify info 6">No se pueden modificar estos objetos a través del lÃmite de una región</panel.string> - <panel.string name="text modify warning">Este objeto tiene partes enlazadas</panel.string> - <panel.string name="Cost Default">Precio: L$</panel.string> - <panel.string name="Cost Total">Precio total: L$</panel.string> - <panel.string name="Cost Per Unit">Price Per: L$</panel.string> - <panel.string name="Cost Mixed">Mixed Price</panel.string> - <panel.string name="Sale Mixed">Mixed Sale</panel.string> + <panel.string name="text deed continued"> + Transferir + </panel.string> + <panel.string name="text deed"> + Transferir + </panel.string> + <panel.string name="text modify info 1"> + Puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Puedes modificar estos objetos + </panel.string> + <panel.string name="text modify info 3"> + No puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + No puedes modificar estos objetos + </panel.string> + <panel.string name="text modify info 5"> + No se puede modificar este objeto a través del lÃmite de una región + </panel.string> + <panel.string name="text modify info 6"> + No se pueden modificar estos objetos a través del lÃmite de una región + </panel.string> + <panel.string name="text modify warning"> + Este objeto tiene partes enlazadas + </panel.string> + <panel.string name="Cost Default"> + Precio: L$ + </panel.string> + <panel.string name="Cost Total"> + Precio total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Price Per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mixed Price + </panel.string> + <panel.string name="Sale Mixed"> + Mixed Sale + </panel.string> <text name="title" value="Perfil del objeto"/> <text name="where" value="(En el mundo)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nombre:</text> - <text name="Description:">Descripción:</text> - <text name="CreatorNameLabel">Creador:</text> - <text name="Owner:">Propietario:</text> - <text name="Group_label">Grupo:</text> + <text name="Name:"> + Nombre: + </text> + <text name="Description:"> + Descripción: + </text> + <text name="CreatorNameLabel"> + Creador: + </text> + <text name="Owner:"> + Propietario: + </text> + <text name="Group_label"> + Grupo: + </text> <button name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/> <name_box initial_value="Cargando..." name="Group Name Proxy"/> <button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/> - <text name="label click action">Pulsa para:</text> + <text name="label click action"> + Pulsa para: + </text> <combo_box name="clickaction"> <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/> <combo_box.item label="Sentarme en el objeto" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="Pagar el objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Ninguno" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Puedes modificar este objeto</text> - <text name="Anyone can:">Cualquiera:</text> + <text name="perm_modify"> + Puedes modificar este objeto + </text> + <text name="Anyone can:"> + Cualquiera: + </text> <check_box label="Copiar" name="checkbox allow everyone copy"/> <check_box label="Mover" name="checkbox allow everyone move"/> - <text name="GroupLabel">Grupo:</text> + <text name="GroupLabel"> + Grupo: + </text> <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/> - <text name="NextOwnerLabel">Próximo propietario:</text> + <text name="NextOwnerLabel"> + Próximo propietario: + </text> <check_box label="Modificar" name="checkbox next owner can modify"/> <check_box label="Copiar" name="checkbox next owner can copy"/> <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="Precio: L$" name="Edit Cost"/> <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Permitir que la gente vea este objeto en los resultados de la búsqueda"/> - <text name="pathfinding_attributes_label">Atributos de pathfinding:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Atributos de pathfinding: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Abrir" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index a6bda0dabe5fb5af5821ce8ac1d73bbd12319023..5b1f26e3d4f2db88f78172caaabb7ba55d6b9055 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -2217,6 +2217,18 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia <string name="RegionInfoListTypeBannedAgents"> Siempre prohibido </string> + <string name="RegionInfoAllEstates"> + todos los estados + </string> + <string name="RegionInfoManagedEstates"> + estados administrados + </string> + <string name="RegionInfoThisEstate"> + este estado + </string> + <string name="AndNMore"> + y [EXTRA_COUNT] más + </string> <string name="ScriptLimitsParcelScriptMemory"> Memoria de los scripts de la parcela </string> diff --git a/indra/newview/skins/default/xui/fr/floater_auction.xml b/indra/newview/skins/default/xui/fr/floater_auction.xml index 6cef2a3591872ada1303487bc41203e3853c1b2e..b1bd2cdd2ff3223acde09d576eaf5bfeb1957035 100644 --- a/indra/newview/skins/default/xui/fr/floater_auction.xml +++ b/indra/newview/skins/default/xui/fr/floater_auction.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="COMMENCER LA VENTE DE TERRAINS LINDEN"> +<floater name="floater_auction" title="COMMENCER LA VENTE DES TERRAINS LINDEN"> <floater.string name="already for sale"> Vous ne pouvez pas mettre aux enchères des parcelles déjà en vente. </floater.string> - <check_box initial_value="true" label="Inclure le marquage de sélection jaune" name="fence_check"/> - <button label="Capture d'écran" label_selected="Capture d'écran" name="snapshot_btn" width="110"/> - <button label="Vendre à n'importe qui" label_selected="Vendre à n'importe qui" name="sell_to_anyone_btn"/> + <check_box initial_value="true" label="Inclure la cloison jaune de sélection" name="fence_check"/> + <button label="Photo" label_selected="Photo" name="snapshot_btn" width="110"/> + <button label="Vendre à n’importe qui" label_selected="Vendre à n’importe qui" name="sell_to_anyone_btn"/> <button label="Effacer les paramètres" label_selected="Effacer les paramètres" name="reset_parcel_btn"/> <button label="Commencer les enchères" label_selected="Commencer les enchères" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 90c2bde6f40730492b15b135a3c4c4022713ac68..2d4bafff2d031e16c95a9428a86832bee1180c7b 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -198,6 +198,7 @@ <combo_box.item label="Payer l'objet" name="Payobject"/> <combo_box.item label="Ouvrir" name="Open"/> <combo_box.item label="Zoomer" name="Zoom"/> + <combo_box.item label="Aucun" name="None"/> </combo_box> <check_box label="À vendre :" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 185820fb6339b8406658684289475c69be15b6e2..49cbd0df4777f18f98d0eedab44a0e84ea9bcc7c 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="Contrôles de la caméra..." name="Camera Controls"/> <menu label="Déplacement" name="Movement"> <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_call label="Se lever" name="Stand up"/> <menu_item_check label="Voler" name="Fly"/> <menu_item_check label="Toujours courir" name="Always Run"/> <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> @@ -296,6 +297,7 @@ <menu_item_check label="Zone de texture" name="Texture Area"/> <menu_item_check label="Zone de face" name="Face Area"/> <menu_item_check label="Infos sur le niveau de détail" name="LOD Info"/> + <menu_item_check label="Nombre de triangles" name="Triangle Count"/> <menu_item_check label="File d'attente pour la construction" name="Build Queue"/> <menu_item_check label="Lumières" name="Lights"/> <menu_item_check label="Particules" name="Particles"/> @@ -408,6 +410,7 @@ <menu_item_check label="Afficher le squelette de collision" name="Show Collision Skeleton"/> <menu_item_check label="Voir les os" name="Show Bones"/> <menu_item_check label="Afficher la cible de l'avatar" name="Display Agent Target"/> + <menu_item_check label="Afficher les étendues d'imposteur" name="Show Impostor Extents"/> <menu_item_call label="Dump Attachments" name="Dump Attachments"/> <menu_item_call label="Débogage des textures des avatars" name="Debug Avatar Textures"/> <menu_item_call label="Dump Local Textures" name="Dump Local Textures"/> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 7fbea9c0ae70f65d76a89e0b8cf8a3a1c8467542..67d0421c67700a8a0ca6fcd3feaef8d1fa6752be 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -1567,6 +1567,30 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. <notification name="ProblemAddingEstateManagerBanned"> Impossible d’ajouter un résident banni à la liste des gérants de domaine. </notification> + <notification name="ProblemBanningEstateManager"> + Impossible d'ajouter le gérant de domaine à la liste interdite. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> est déjà dans la liste des groupes autorisés. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] est déjà dans votre liste [LIST_TYPE]. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] sont déjà dans votre liste [LIST_TYPE]. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] a été ajouté à la liste [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] ont été ajoutéq à la liste [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] a été supprimé de la liste [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] ont été supprimés de la liste [LIST_TYPE] de [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Impossible de changer d'apparence jusqu'à ce que les habits et la silhouette soient chargés. </notification> @@ -3165,16 +3189,22 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore Échec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté(e) au chat vocal près de vous. </notification> <notification name="VoiceEffectsExpired"> - Au moins l'un des effets de voix auxquels vous êtes abonné a expiré. -[[URL] Cliquez ici] pour renouveler votre abonnement. + Au moins l'un des effets de voix auxquels vous êtes abonné a expiré. +[[URL] Cliquez ici] pour renouveler votre abonnement. + +Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix. </notification> <notification name="VoiceEffectsExpiredInUse"> L'effet de voix actif a expiré. Vos paramètres de voix normaux ont été rétablis. -[[URL] Cliquez ici] pour renouveler votre abonnement. +[[URL] Cliquez ici] pour renouveler votre abonnement. + +Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix. </notification> <notification name="VoiceEffectsWillExpire"> - Au moins l'un de vos effets de voix expirera dans moins de [INTERVAL] jours. -[[URL] Cliquez ici] pour renouveler votre abonnement. + Au moins l'un de vos effets de voix expirera dans moins de [INTERVAL] jours. +[[URL] Cliquez ici] pour renouveler votre abonnement. + +Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix. </notification> <notification name="VoiceEffectsNew"> De nouveaux effets de voix sont disponibles ! @@ -3226,6 +3256,9 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité. <notification name="SnapshotToComputerFailed"> Échec d’enregistrement de la photo dans [PATH] : Le disque est plein. [NEED_MEMORY]KB est nécessaire mais l'espace libre est de seulement [FREE_MEMORY]KB. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Échec d’enregistrement de la photo dans [PATH] : Le répertoire n'existe pas. + </notification> <notification name="PresetNotSaved"> Erreur d’enregistrement du préréglage [NAME]. </notification> diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index 2b8249c8a95a2495347190810e8e9cecf32a451c..a4f0ff7061378fec83df375592b6dc208996b9e2 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=fr</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=fr + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nom d'utilisateur" name="username_combo" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/> @@ -11,8 +16,13 @@ </combo_box> <button label="Connexion" name="connect_btn"/> <check_box label="Mémoriser mes informations" name="remember_check"/> - <text name="forgot_password_text">Mot de passe oublié</text> - <combo_box label="Sélectionner la grille" name="server_combo" left_pad="20"/> + <text name="forgot_password_text"> + Mot de passe oublié + </text> + <combo_box label="Sélectionner la grille" left_pad="20" name="server_combo"/> + <text name="sign_up_text"> + S'inscrire + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_login_first.xml b/indra/newview/skins/default/xui/fr/panel_login_first.xml index 9534ac7b83e4082fb41addf5141c40a4dbab5be7..8f40d0230ce904cf28fbad2d646679752338f8dc 100644 --- a/indra/newview/skins/default/xui/fr/panel_login_first.xml +++ b/indra/newview/skins/default/xui/fr/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=fr </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -10,10 +13,13 @@ <combo_box label="Nom d'utilisateur" name="username_combo" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/> <line_editor label="Mot de passe" name="password_edit"/> <button label="Connexion" name="connect_btn"/> - <check_box label="Mémoriser mes informations" name="remember_check" font="SansSerifSmall"/> + <check_box font="SansSerifSmall" label="Mémoriser mes informations" name="remember_check"/> <text name="forgot_password_text"> Mot de passe oublié </text> + <text name="sign_up_text"> + S'inscrire + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_access.xml b/indra/newview/skins/default/xui/fr/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..db77f3b8f145ce57e9ba84b91b441c1b9543aba0 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ACCÈS" name="Access"> + <tab_container name="tabs"> + <panel label="GÉRANTS DU DOMAINE" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gérants du domaine : + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nom" name="name"/> + </name_list> + <button label="Ajouter..." name="add_estate_manager_btn"/> + <button label="Supprimer..." name="remove_estate_manager_btn"/> + </panel> + <panel label="AUTORISÉ" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Rechercher des agents autorisés" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Toujours autorisé : + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nom" name="name"/> + </name_list> + <button label="Ajouter..." name="add_allowed_avatar_btn"/> + <button label="Supprimer..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GROUPES AUTORISÉS" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Rechercher des groupes autorisés" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Groupes toujours autorisés : + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nom" name="name"/> + </name_list> + <button label="Ajouter..." name="add_allowed_group_btn"/> + <button label="Supprimer" name="remove_allowed_group_btn"/> + </panel> + <panel label="INTERDIT" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Rechercher des agents interdits" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Toujours interdit : + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nom" name="name"/> + <columns label="Date de la dernière connexion" name="last_login_date"/> + <columns label="Date d'interdiction" name="ban_date"/> + <columns label="Interdit par" name="bannedby"/> + </name_list> + <button label="Ajouter..." name="add_banned_avatar_btn"/> + <button label="Supprimer..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml index 9bf3fdfc96e861d1bbabcaaee8b081acd0ad6f35..0987ef3fa35f661b99e607d5f574dfa65146a694 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml @@ -18,7 +18,7 @@ domaine. (inconnu) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Autoriser uniquement les résidents et les groupes indiqués ci-dessous" name="estate_restricted_access"/> + <radio_item label="Autoriser uniquement les résidents et les groupes indiqués dans l'onglet Accès" name="estate_restricted_access"/> <radio_item label="Visite ouverte à tous" name="estate_public_access"/> </radio_group> <check_box label="Doit avoir plus de 18 ans" name="limit_age_verified" tool_tip="Pour accéder à ce domaine, les résidents doivent avoir au moins 18 ans. Consultez le [SUPPORT_SITE] pour plus d'informations."/> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml index f6b4f2804678cd833d8d745a2ef7337a9b0bc60f..9064da2a5f21fd11b2484b4bf3c29d059c69479d 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Profil de l'objet"> - <panel.string name="text deed continued">Céder</panel.string> - <panel.string name="text deed">Céder</panel.string> - <panel.string name="text modify info 1">Vous pouvez modifier cet objet</panel.string> - <panel.string name="text modify info 2">Vous pouvez modifier ces objets</panel.string> - <panel.string name="text modify info 3">Vous ne pouvez pas modifier cet objet</panel.string> - <panel.string name="text modify info 4">Vous ne pouvez pas modifier ces objets</panel.string> - <panel.string name="text modify info 5">Impossible de modifier cet objet au-delà de la frontière d'une région</panel.string> - <panel.string name="text modify info 6">Impossible de modifier ces objets au-delà de la frontière d'une région</panel.string> - <panel.string name="text modify warning">Cet objet comprend des parties liées</panel.string> - <panel.string name="Cost Default">Prix : L$</panel.string> - <panel.string name="Cost Total">Prix total : L$</panel.string> - <panel.string name="Cost Per Unit">Prix par : L$</panel.string> - <panel.string name="Cost Mixed">Prix mixte</panel.string> - <panel.string name="Sale Mixed">Vente mixte</panel.string> + <panel.string name="text deed continued"> + Céder + </panel.string> + <panel.string name="text deed"> + Céder + </panel.string> + <panel.string name="text modify info 1"> + Vous pouvez modifier cet objet + </panel.string> + <panel.string name="text modify info 2"> + Vous pouvez modifier ces objets + </panel.string> + <panel.string name="text modify info 3"> + Vous ne pouvez pas modifier cet objet + </panel.string> + <panel.string name="text modify info 4"> + Vous ne pouvez pas modifier ces objets + </panel.string> + <panel.string name="text modify info 5"> + Impossible de modifier cet objet au-delà de la frontière d'une région + </panel.string> + <panel.string name="text modify info 6"> + Impossible de modifier ces objets au-delà de la frontière d'une région + </panel.string> + <panel.string name="text modify warning"> + Cet objet comprend des parties liées + </panel.string> + <panel.string name="Cost Default"> + Prix : L$ + </panel.string> + <panel.string name="Cost Total"> + Prix total : L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Prix par : L$ + </panel.string> + <panel.string name="Cost Mixed"> + Prix mixte + </panel.string> + <panel.string name="Sale Mixed"> + Vente mixte + </panel.string> <text name="title" value="Profil de l'objet"/> <text name="where" value="(dans Second Life)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nom :</text> - <text name="Description:">Description :</text> - <text name="CreatorNameLabel">Créateur :</text> - <text name="Owner:">Propriétaire :</text> - <text name="Group_label">Groupe :</text> + <text name="Name:"> + Nom : + </text> + <text name="Description:"> + Description : + </text> + <text name="CreatorNameLabel"> + Créateur : + </text> + <text name="Owner:"> + Propriétaire : + </text> + <text name="Group_label"> + Groupe : + </text> <button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/> <name_box initial_value="Chargement…" name="Group Name Proxy"/> <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d'un groupe."/> - <text name="label click action">Cliquer pour :</text> + <text name="label click action"> + Cliquer pour : + </text> <combo_box name="clickaction"> <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/> <combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="Payer l'objet" name="Payobject"/> <combo_box.item label="Ouvrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Aucun" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Vous pouvez modifier cet objet</text> - <text name="Anyone can:">N'importe qui :</text> + <text name="perm_modify"> + Vous pouvez modifier cet objet + </text> + <text name="Anyone can:"> + N'importe qui : + </text> <check_box label="Copier" name="checkbox allow everyone copy"/> <check_box label="Bouger" name="checkbox allow everyone move"/> - <text name="GroupLabel">Groupe :</text> + <text name="GroupLabel"> + Groupe : + </text> <check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Céder."/> - <text name="NextOwnerLabel">Le prochain propriétaire :</text> + <text name="NextOwnerLabel"> + Le prochain propriétaire : + </text> <check_box label="Modifier" name="checkbox next owner can modify"/> <check_box label="Copier" name="checkbox next owner can copy"/> <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="Prix : L$" name="Edit Cost"/> <check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/> - <text name="pathfinding_attributes_label">Attributs de recherche de chemin :</text> - <text name="B:">B :</text> - <text name="O:">O :</text> - <text name="G:">G :</text> - <text name="E:">E :</text> - <text name="N:">N :</text> - <text name="F:">F :</text> + <text name="pathfinding_attributes_label"> + Attributs de recherche de chemin : + </text> + <text name="B:"> + B : + </text> + <text name="O:"> + O : + </text> + <text name="G:"> + G : + </text> + <text name="E:"> + E : + </text> + <text name="N:"> + N : + </text> + <text name="F:"> + F : + </text> </panel> <panel name="button_panel"> <button label="Ouvrir" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 5cd3c563bfde3b1505e7cb0ea6f00c136630ef01..5cf22ff34868cd20d62f5f33accdfd75dd014f01 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -2240,6 +2240,18 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life <string name="RegionInfoListTypeBannedAgents"> Toujours interdit </string> + <string name="RegionInfoAllEstates"> + tous les domaines + </string> + <string name="RegionInfoManagedEstates"> + domaines gérés + </string> + <string name="RegionInfoThisEstate"> + ce domaine + </string> + <string name="AndNMore"> + et [EXTRA_COUNT] plus + </string> <string name="ScriptLimitsParcelScriptMemory"> Mémoire des scripts de parcelles </string> diff --git a/indra/newview/skins/default/xui/it/floater_auction.xml b/indra/newview/skins/default/xui/it/floater_auction.xml index 4cad8b744d10bffaf553d3408e07cd941eafe676..ea524a153c43cc1098263e026155f111b33f7173 100644 --- a/indra/newview/skins/default/xui/it/floater_auction.xml +++ b/indra/newview/skins/default/xui/it/floater_auction.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_auction" title="INIZIA LA VENDITA DI TERRENO LINDEN"> <floater.string name="already for sale"> - Non puoi mettere in asta terreni che sono già in vendita. + Non puoi mettere all’asta terreni che sono già in vendita. </floater.string> - <check_box initial_value="true" label="Includi barriere di selezione gialle" name="fence_check"/> - <button label="Fotografia" label_selected="Fotografia" name="snapshot_btn"/> + <check_box initial_value="true" label="Includi la parte selezionata in giallo" name="fence_check"/> + <button label="Istantanea" label_selected="Istantanea" name="snapshot_btn"/> <button label="Vendi a chiunque" label_selected="Vendi a chiunque" name="sell_to_anyone_btn"/> <button label="Cancella impostazioni" label_selected="Cancella impostazioni" name="reset_parcel_btn"/> <button label="Inizia l'asta" label_selected="Inizia l'asta" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index 1ebb45d02be87bfcba72b6aceca0e59cf44d6cfc..c81c3736b40fb4dd78e54aaa942c97d095a77a4f 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -205,6 +205,7 @@ <combo_box.item label="Paga l'oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> <combo_box.item label="Ingrandisci" name="Zoom"/> + <combo_box.item label="Nessuno" name="None"/> </combo_box> <check_box label="In vendita:" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index c3f48c096352ecb224a8b3f1dfddd8171180156b..597fe9c2e480c5cb2ea1d519bb19b0ee84e91a4d 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="Controlli fotocamera..." name="Camera Controls"/> <menu label="Spostamento" name="Movement"> <menu_item_call label="Siedi" name="Sit Down Here"/> + <menu_item_call label="Alzati" name="Stand up"/> <menu_item_check label="Vola" name="Fly"/> <menu_item_check label="Corri sempre" name="Always Run"/> <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/> @@ -281,6 +282,7 @@ <menu_item_check label="Forme fisica" name="Physics Shapes"/> <menu_item_check label="Aggiorna tipo" name="Update Type"/> <menu_item_check label="Info livello dettaglio" name="LOD Info"/> + <menu_item_check label="Conteggio triangolo" name="Triangle Count"/> <menu_item_check label="Crea coda" name="Build Queue"/> <menu_item_check label="Particelle" name="Particles"/> <menu_item_check label="Giunti" name="Joints"/> @@ -355,6 +357,7 @@ <menu_item_check label="Mostra schemi collisione" name="Show Collision Skeleton"/> <menu_item_check label="Mostra ossa" name="Show Bones"/> <menu_item_check label="Mostra bersaglio" name="Display Agent Target"/> + <menu_item_check label="Mostra Impostor Extents" name="Show Impostor Extents"/> <menu_item_call label="Debug texture dell'avatar" name="Debug Avatar Textures"/> </menu> <menu_item_check label="Texture HTTP" name="HTTP Textures"/> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 1baf8e1b873a638159de9e24bb1431b959557315..f64b6522047362ee24caa2dc5aa883dec4a10ca9 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -1569,6 +1569,30 @@ Eccede il [MAX_AGENTS] [LIST_TYPE] limite di [NUM_EXCESS]. <notification name="ProblemAddingEstateManagerBanned"> Impossibile aggiungere il residente espulso alla lista dei gestori delle proprietà . </notification> + <notification name="ProblemBanningEstateManager"> + Impossibile aggiunere il gestore della proprietà immobiliare [AGENT] all’elenco degli espulsi. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> si trova già nell’elenco dei Gruppi ammessi. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] è gia nel tuo elenco [LIST_TYPE]. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] è gia nel tuo elenco [LIST_TYPE]. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] è stato aggiunto all’elenco [LIST_TYPE] di [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] è stato aggiunto all’elenco [LIST_TYPE] di [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] è stato rimosso dall’elenco [LIST_TYPE] di [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] è stato rimosso dall’elenco [LIST_TYPE] di [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Impossibile cambiare l'aspetto fisico finchè gli abiti e i vestiti non sono caricati. </notification> @@ -1872,7 +1896,7 @@ Cambierà migliaia di regioni e produrrà seri problemi ai vari server. <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà " yestext="Questa proprietà "/> </notification> <notification label="Seleziona la proprietà " name="EstateBannedAgentRemove"> - Vuoi rimuovere questo Residente dall’elenco degli espulsi solo per questa proprietà immobiliare oppure per [ALL_ESTATES]? + Rimuovi questo Residente dall’elenco degli espulsi solo per questa proprietà immobiliare oppure per [ALL_ESTATES]? <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà " yestext="Questa proprietà "/> </notification> <notification label="Seleziona la proprietà " name="EstateManagerAdd"> @@ -3168,16 +3192,22 @@ Clicca su Accetta per unirti alla chat oppure su Declina per declinare l'in Collegamento a [VOICE_CHANNEL_NAME] non riuscito, riprova più tardi. Verrai ora ricollegato alla chat vocale nei dintorni. </notification> <notification name="VoiceEffectsExpired"> - Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta. -[[URL] Fai clic qui] per rinnovare l'abbonamento. + Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + +Se sei un membro Premium, [[PREMIUM_URL] fai clic qui] per ricevere in regalo la manipolazione vocale. </notification> <notification name="VoiceEffectsExpiredInUse"> - Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali. -[[URL] Fai clic qui] per rinnovare l'abbonamento. + Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + +Se sei un membro Premium, [[PREMIUM_URL] fai clic qui] per ricevere in regalo la manipolazione vocale. </notification> <notification name="VoiceEffectsWillExpire"> - Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni. -[[URL] Fai clic qui] per rinnovare l'abbonamento. + Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + +Se sei un membro Premium, [[PREMIUM_URL] fai clic qui] per ricevere in regalo la manipolazione vocale. </notification> <notification name="VoiceEffectsNew"> Sono disponibili nuove manipolazioni vocali. @@ -3229,6 +3259,9 @@ Per sicurezza, verranno bloccati per alcuni secondi. <notification name="SnapshotToComputerFailed"> Salvataggio istantanea in [PATH] non riuscito: Il disco è pieno. Sono necessari [NEED_MEMORY] KB ma sono disponibili solo [FREE_MEMORY] KB . </notification> + <notification name="SnapshotToLocalDirNotExist"> + Salvataggio istantanea in [PATH] non riuscito: La cartella non esiste. + </notification> <notification name="PresetNotSaved"> Errore durante il salvataggio del valore predefinito [NAME]. </notification> diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml index 6c1777163cd56f860498fd45fa99d27db64faf4b..228bebd92ae3aa620869f9df99c7489636d58c46 100644 --- a/indra/newview/skins/default/xui/it/panel_login.xml +++ b/indra/newview/skins/default/xui/it/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=it</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=it + </panel.string> + <panel.string name="sign_up_url"> + http://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nome utente" name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come roby12 o Stella Solare"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Accedi" name="connect_btn"/> <check_box label="Ricordami" name="remember_check"/> - <text name="forgot_password_text">Password dimenticata</text> + <text name="forgot_password_text"> + Password dimenticata + </text> <combo_box label="Seleziona griglia" name="server_combo"/> + <text name="sign_up_text"> + Registrati + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_login_first.xml b/indra/newview/skins/default/xui/it/panel_login_first.xml index 6f120a17fca4db15e9bba21ed1a16f4e74f377f8..5b04fd411a82ec332a892bbf69970c9582e66cdd 100644 --- a/indra/newview/skins/default/xui/it/panel_login_first.xml +++ b/indra/newview/skins/default/xui/it/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=it </panel.string> + <panel.string name="sign_up_url"> + http://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Password dimenticata </text> + <text name="sign_up_text"> + Registrati + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/it/panel_region_access.xml b/indra/newview/skins/default/xui/it/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..06ab2b40e79850bbf6d236ea62bc08266bb373d7 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ACCESSO" name="Access"> + <tab_container name="tabs"> + <panel label="GESTORI DELLE PROPRIETÀ IMMOBILIARI" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gestori delle proprietà immobiliari + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Aggiungi..." name="add_estate_manager_btn"/> + <button label="Rimuovi..." name="remove_estate_manager_btn"/> + </panel> + <panel label="AMMESSO" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Cerca agenti ammessi" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Sempre ammesso: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Aggiungi..." name="add_allowed_avatar_btn"/> + <button label="Rimuovi..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GRUPPI AMMESSI" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Cerca gruppi consentiti" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Gruppi sempre consentiti: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Aggiungi..." name="add_allowed_group_btn"/> + <button label="Rimuovi..." name="remove_allowed_group_btn"/> + </panel> + <panel label="ESPULSI" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Cerca agenti espulsi" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Sempre espulsi: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nome" name="name"/> + <columns label="Ultima data di accesso" name="last_login_date"/> + <columns label="Data espulsione" name="ban_date"/> + <columns label="Espulso da" name="bannedby"/> + </name_list> + <button label="Aggiungi..." name="add_banned_avatar_btn"/> + <button label="Rimuovi..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_region_estate.xml b/indra/newview/skins/default/xui/it/panel_region_estate.xml index 525458d1632e939c120d5ccc7d74ac6290e629b6..b4422e4c609598059f2560d5b48e92cc3376a021 100644 --- a/indra/newview/skins/default/xui/it/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/it/panel_region_estate.xml @@ -16,7 +16,7 @@ (sconosciuto) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Consenti solo residenti e gruppi elencati qui sotto" name="estate_restricted_access"/> + <radio_item label="Consenti accesso solo ai residenti e ai gruppi elencati nella scheda di Accesso" name="estate_restricted_access"/> <radio_item label="Chiunque può visitare" name="estate_public_access"/> </radio_group> <check_box label="È necessario avere più di 18 anni" name="limit_age_verified" tool_tip="Per poter visitare questa proprietà immobiliare i Residenti devono avere almeno 18 anni. Vedi [SUPPORT_SITE] per maggiori informazioni."/> @@ -26,10 +26,10 @@ <check_box label="Permetti teleport diretto" name="allow_direct_teleport"/> <button label="Applica" name="apply_btn"/> <text name="estate_manager_label"> - Gestori delle proprietà immobiliari: + Manager delle proprietà : </text> <text name="allow_resident_label"> - Sempre consentiti: + Sempre consentito: </text> <button label="Aggiungi..." name="add_estate_manager_btn"/> <button label="Rimuovi..." name="remove_estate_manager_btn"/> @@ -39,7 +39,7 @@ Gruppi sempre consentiti: </text> <text name="ban_resident_label"> - Sempre espulsi: + Sempre escluso: </text> <button label="Aggiungi..." name="add_allowed_group_btn"/> <button label="Rimuovi..." name="remove_allowed_group_btn"/> diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml index aabefd7d3c97bbe4ce31e7a267cecddc6ec60204..72a89c77ab2ca0173bba210456285dfb5230e929 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Profilo dell'oggetto"> - <panel.string name="text deed continued">Cessione</panel.string> - <panel.string name="text deed">Cessione</panel.string> - <panel.string name="text modify info 1">Tu puoi modificare questo oggetto</panel.string> - <panel.string name="text modify info 2">Tu puoi modificare questi oggetti</panel.string> - <panel.string name="text modify info 3">Non puoi modificare questo oggetto</panel.string> - <panel.string name="text modify info 4">Non puoi modificare questi oggetti</panel.string> - <panel.string name="text modify info 5">Questo oggetto non può essere modificato attraverso il confine di una regione</panel.string> - <panel.string name="text modify info 6">Questi oggetti non possono essere modificati attraverso il confine di una regione</panel.string> - <panel.string name="text modify warning">Questo oggetto ha parti collegate</panel.string> - <panel.string name="Cost Default">Prezzo: L$</panel.string> - <panel.string name="Cost Total">Prezzo totale: L$</panel.string> - <panel.string name="Cost Per Unit">Prezzo per: L$</panel.string> - <panel.string name="Cost Mixed">Prezzo misto</panel.string> - <panel.string name="Sale Mixed">Vendita mista</panel.string> + <panel.string name="text deed continued"> + Cessione + </panel.string> + <panel.string name="text deed"> + Cessione + </panel.string> + <panel.string name="text modify info 1"> + Tu puoi modificare questo oggetto + </panel.string> + <panel.string name="text modify info 2"> + Tu puoi modificare questi oggetti + </panel.string> + <panel.string name="text modify info 3"> + Non puoi modificare questo oggetto + </panel.string> + <panel.string name="text modify info 4"> + Non puoi modificare questi oggetti + </panel.string> + <panel.string name="text modify info 5"> + Questo oggetto non può essere modificato attraverso il confine di una regione + </panel.string> + <panel.string name="text modify info 6"> + Questi oggetti non possono essere modificati attraverso il confine di una regione + </panel.string> + <panel.string name="text modify warning"> + Questo oggetto ha parti collegate + </panel.string> + <panel.string name="Cost Default"> + Prezzo: L$ + </panel.string> + <panel.string name="Cost Total"> + Prezzo totale: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Prezzo per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Prezzo misto + </panel.string> + <panel.string name="Sale Mixed"> + Vendita mista + </panel.string> <text name="title" value="Profilo dell'oggetto"/> <text name="where" value="(in Second Life)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nome:</text> - <text name="Description:">Descrizione:</text> - <text name="CreatorNameLabel">Ideatore:</text> - <text name="Owner:">Proprietario:</text> - <text name="Group_label">Gruppo:</text> + <text name="Name:"> + Nome: + </text> + <text name="Description:"> + Descrizione: + </text> + <text name="CreatorNameLabel"> + Ideatore: + </text> + <text name="Owner:"> + Proprietario: + </text> + <text name="Group_label"> + Gruppo: + </text> <button name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all'oggetto"/> <name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/> <button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/> - <text name="label click action">Fai clic per:</text> + <text name="label click action"> + Fai clic per: + </text> <combo_box name="clickaction"> <combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/> <combo_box.item label="Siediti sull'oggetto" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="Paga oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> <combo_box.item label="Ingrandisci" name="Zoom"/> + <combo_box.item label="Nessuno" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Tu puoi modificare questo oggetto</text> - <text name="Anyone can:">Chiunque:</text> + <text name="perm_modify"> + Tu puoi modificare questo oggetto + </text> + <text name="Anyone can:"> + Chiunque: + </text> <check_box label="Copia" name="checkbox allow everyone copy"/> <check_box label="Sposta" name="checkbox allow everyone move"/> - <text name="GroupLabel">Gruppo:</text> + <text name="GroupLabel"> + Gruppo: + </text> <check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/> - <text name="NextOwnerLabel">Proprietario successivo:</text> + <text name="NextOwnerLabel"> + Proprietario successivo: + </text> <check_box label="Modifica" name="checkbox next owner can modify"/> <check_box label="Copia" name="checkbox next owner can copy"/> <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="Prezzo: L$" name="Edit Cost"/> <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti alle persone di vedere questo oggetto nei risultati della ricerca"/> - <text name="pathfinding_attributes_label">Attributi pathfinding:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Attributi pathfinding: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Apri" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 455ccf87eb61723984cc9f340b440f6bee7d6ebd..fc0da069853432a33b00854a75eea886287152b4 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -2225,6 +2225,18 @@ Se continui a ricevere questo messaggio, contatta l'assistenza Second Life <string name="RegionInfoListTypeBannedAgents"> Sempre esclusi: </string> + <string name="RegionInfoAllEstates"> + tutte le proprietà immobiliari + </string> + <string name="RegionInfoManagedEstates"> + proprietà immobiliari che gestisci + </string> + <string name="RegionInfoThisEstate"> + questa proprietà immobiliare + </string> + <string name="AndNMore"> + e [EXTRA_COUNT] ancora + </string> <string name="ScriptLimitsParcelScriptMemory"> Memoria dello script del lotto </string> diff --git a/indra/newview/skins/default/xui/ja/floater_auction.xml b/indra/newview/skins/default/xui/ja/floater_auction.xml index e9aa287f2c35804b5ac262e9a26333b2970017ff..21c8d90b01139e25e4770f2bb4718db6b7bb2c81 100644 --- a/indra/newview/skins/default/xui/ja/floater_auction.xml +++ b/indra/newview/skins/default/xui/ja/floater_auction.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_auction" title="リンデンランドã®è²©å£²é–‹å§‹"> <floater.string name="already for sale"> - 売り出ã—ä¸ã®åŒºç”»ã¯ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã§ãã¾ã›ã‚“。 + 販売ä¸ã®åŒºç”»ã‚’オークションã«å‡ºå“ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </floater.string> - <check_box initial_value="true" label="黄色ã®é¸æŠžãƒ•ã‚§ãƒ³ã‚¹ã‚’å«ã‚ã‚‹" name="fence_check"/> + <check_box initial_value="true" label="黄色ã®ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ãƒ•ã‚§ãƒ³ã‚¹ã‚’å«ã‚ã‚‹" name="fence_check"/> <button label="スナップショット" label_selected="スナップショット" name="snapshot_btn"/> <button label="誰ã«ã§ã‚‚販売" label_selected="誰ã«ã§ã‚‚販売" name="sell_to_anyone_btn"/> <button label="è¨å®šã‚’クリア" label_selected="è¨å®šã‚’クリア" name="reset_parcel_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index a67916b50fac00ad18adcd5073d98c9ddbbe3f3e..60ddae66c5a071dd58af3d85a9114c1941032857 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -204,6 +204,7 @@ <combo_box.item label="オブジェクトã«æ”¯æ‰•ã†" name="Payobject"/> <combo_box.item label="é–‹ã" name="Open"/> <combo_box.item label="ズームã™ã‚‹" name="Zoom"/> + <combo_box.item label="ãªã—" name="None"/> </combo_box> <check_box label="販売対象:" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index 6dcb4e0ef313721250dac28d3c2c966224298a93..9411a4dd5edefb8feff3c1d8601e759bfdd57a31 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="カメラコントãƒãƒ¼ãƒ«..." name="Camera Controls"/> <menu label="ムーブメント" name="Movement"> <menu_item_call label="座る" name="Sit Down Here"/> + <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand up"/> <menu_item_check label="飛ã¶" name="Fly"/> <menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/> <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ¢ã™ã‚‹" name="Stop Animating My Avatar"/> @@ -296,6 +297,7 @@ <menu_item_check label="テクスãƒãƒ£ã®ç¯„囲" name="Texture Area"/> <menu_item_check label="å´é¢" name="Face Area"/> <menu_item_check label="LOD æƒ…å ±" name="LOD Info"/> + <menu_item_check label="三角形ã®æ•°" name="Triangle Count"/> <menu_item_check label="制作ã‚ュー" name="Build Queue"/> <menu_item_check label="å…‰" name="Lights"/> <menu_item_check label="パーティクル" name="Particles"/> @@ -408,6 +410,7 @@ <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®šã‚’表示ã™ã‚‹" name="Show Collision Skeleton"/> <menu_item_check label="骨を表示" name="Show Bones"/> <menu_item_check label="エージェントã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’表示ã™ã‚‹" name="Display Agent Target"/> + <menu_item_check label="インãƒã‚¹ã‚¿ãƒ¼ã®ç¯„囲を表示" name="Show Impostor Extents"/> <menu_item_call label="アタッãƒãƒ¡ãƒ³ãƒˆã‚’ダンプ" name="Dump Attachments"/> <menu_item_call label="ã‚¢ãƒã‚¿ãƒ¼ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’デãƒãƒƒã‚°" name="Debug Avatar Textures"/> <menu_item_call label="ãƒãƒ¼ã‚«ãƒ«ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’ダンプ" name="Dump Local Textures"/> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 9251a8e5ffee09d0d7f83e2ec99b137cc2538b5c..8e22c7668f499f361acee4bbcee47ffa9fb1185c 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -1599,6 +1599,30 @@ SHA1 フィンガープリント: [MD5_DIGEST] <notification name="ProblemAddingEstateManagerBanned"> 追放ã•ã‚ŒãŸä½äººã‚’ä¸å‹•ç”£ç®¡ç†è€…リストã«è¿½åŠ ã§ãã¾ã›ã‚“。 </notification> + <notification name="ProblemBanningEstateManager"> + ç¦æ¢ãƒªã‚¹ãƒˆã«ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ [AGENT] ã‚’è¿½åŠ ã§ãã¾ã›ã‚“。 + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> ã¯ã™ã§ã«è¨±å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã«è¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] ã¯ã™ã§ã«ã‚ãªãŸã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] ã¯ã™ã§ã«ã‚ãªãŸã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> 衣類ãŠã‚ˆã³ã‚·ã‚§ã‚¤ãƒ—ãŒèªã¿è¾¼ã¾ã‚Œã‚‹ã¾ã§ã¯ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 </notification> @@ -3209,13 +3233,22 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ </notification> <notification name="VoiceEffectsExpired"> - ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¾ã—ãŸã€‚ +期é™ã‚’延長・更新ã™ã‚‹ã«ã¯ [[URL] Click here] をクリックã—ã¦ãã ã•ã„。 + +プレミアム会員ã®æ–¹ã¯ã€ [[PREMIUM_URL] click here] をクリックã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°ç‰¹å…¸ã‚’ãŠå—ã‘å–ã‚Šãã ã•ã„。 </notification> <notification name="VoiceEffectsExpiredInUse"> - ボイスモーフィング効果ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ãŸãŸã‚ã€ã‚ãªãŸã®é€šå¸¸ã®ãƒœã‚¤ã‚¹è¨å®šãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + ボイスモーフィング効果ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ãŸãŸã‚ã€ã‚ãªãŸã®é€šå¸¸ã®ãƒœã‚¤ã‚¹è¨å®šãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚ +期é™ã‚’延長・更新ã™ã‚‹ã«ã¯ [[URL] Click here] をクリックã—ã¦ãã ã•ã„。 + +プレミアム会員ã®æ–¹ã¯ã€ [[PREMIUM_URL] click here] をクリックã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°ç‰¹å…¸ã‚’ãŠå—ã‘å–ã‚Šãã ã•ã„。 </notification> <notification name="VoiceEffectsWillExpire"> - ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒ[INTERVAL]日以内ã«çµ‚了ã—ã¾ã™ã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒ [INTERVAL] 日以内ã«çµ‚了ã—ã¾ã™ã€‚ +期é™ã‚’延長・更新ã™ã‚‹ã«ã¯ [[URL] Click here] をクリックã—ã¦ãã ã•ã„。 + +プレミアム会員ã®æ–¹ã¯ã€ [[PREMIUM_URL] click here] をクリックã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°ç‰¹å…¸ã‚’ãŠå—ã‘å–ã‚Šãã ã•ã„。 </notification> <notification name="VoiceEffectsNew"> æ–°ã—ã„ボイスモーフィング効果ãŒç™»å ´ï¼ @@ -3267,6 +3300,9 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ <notification name="SnapshotToComputerFailed"> スナップショットを [PATH] ã«ä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸ:ディスクã®ç©ºã容é‡ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚[NEED_MEMORY]KB ãŒå¿…è¦ã§ã™ãŒã€[FREE_MEMORY]KB ã—ã‹ã‚ã‚Šã¾ã›ã‚“。 </notification> + <notification name="SnapshotToLocalDirNotExist"> + スナップショットを [PATH] ã«ä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸ:ディレクトリã¯å˜åœ¨ã—ã¾ã›ã‚“。 + </notification> <notification name="PresetNotSaved"> プリセット [NAME] ã®ä¿å˜ã‚¨ãƒ©ãƒ¼ã€‚ </notification> diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml index 5f2007e0da8a0d2c5e1de51e1ad0d05150c26aec..86e7e9dac41805351c9e3ae9cb14dfb034c9da66 100644 --- a/indra/newview/skins/default/xui/ja/panel_login.xml +++ b/indra/newview/skins/default/xui/ja/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=ja</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=ja + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="ユーザーå" name="username_combo" tool_tip="登録時ã«è‡ªåˆ†ã§é¸ã‚“ã ユーザーå(例:bobsmith12ã€Steller Sunshineãªã©ï¼‰"/> @@ -11,8 +16,13 @@ </combo_box> <button label="ãƒã‚°ã‚¤ãƒ³" name="connect_btn"/> <check_box label="記憶ã™ã‚‹" name="remember_check"/> - <text name="forgot_password_text">パスワードを忘れãŸå ´åˆ</text> + <text name="forgot_password_text"> + パスワードを忘れãŸå ´åˆ + </text> <combo_box label="グリッドをé¸æŠž" name="server_combo"/> + <text name="sign_up_text"> + 登録 + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_login_first.xml b/indra/newview/skins/default/xui/ja/panel_login_first.xml index d350e2f9a2264f849c59578dea7ae05b60ee8211..644cee25f255cb63e64ab2021ac6bb0f38475ae9 100644 --- a/indra/newview/skins/default/xui/ja/panel_login_first.xml +++ b/indra/newview/skins/default/xui/ja/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=ja </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> パスワードを忘れãŸå ´åˆ </text> + <text name="sign_up_text"> + 登録 + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_access.xml b/indra/newview/skins/default/xui/ja/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..c0612dd1506dd609c985c7fb380e5d22abf0fe02 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="アクセス" name="Access"> + <tab_container name="tabs"> + <panel label="ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼" name="estate_managers_panel"> + <text name="estate_manager_label"> + ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼: + </text> + <name_list name="estate_manager_name_list"> + <columns label="åå‰" name="name"/> + </name_list> + <button label="è¿½åŠ ..." name="add_estate_manager_btn"/> + <button label="削除…" name="remove_estate_manager_btn"/> + </panel> + <panel label="許å¯" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="許å¯ã•ã‚ŒãŸã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’検索" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + 常ã«è¨±å¯ï¼š + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="åå‰" name="name"/> + </name_list> + <button label="è¿½åŠ ..." name="add_allowed_avatar_btn"/> + <button label="削除…" name="remove_allowed_avatar_btn"/> + </panel> + <panel label="許å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="許å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—を検索" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + 常ã«è¨±å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—: + </text> + <name_list name="allowed_group_name_list"> + <columns label="åå‰" name="name"/> + </name_list> + <button label="è¿½åŠ ..." name="add_allowed_group_btn"/> + <button label="削除…" name="remove_allowed_group_btn"/> + </panel> + <panel label="ç¦æ¢" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="ç¦æ¢ã•ã‚ŒãŸã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’検索" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + 常ã«ç¦æ¢ï¼š + </text> + <name_list name="banned_avatar_name_list"> + <columns label="åå‰" name="name"/> + <columns label="最後ã«ãƒã‚°ã‚¤ãƒ³ã—ãŸæ—¥" name="last_login_date"/> + <columns label="ç¦æ¢ã•ã‚ŒãŸæ—¥ä»˜" name="ban_date"/> + <columns label="ç¦æ¢ã—ãŸäººï¼š" name="bannedby"/> + </name_list> + <button label="è¿½åŠ ..." name="add_banned_avatar_btn"/> + <button label="削除…" name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml index 385c16dfab64ce5175aa9cb01c13539d2a9e55a4..6464a65feb0ae05c92f340b54ab8381593d9aa6e 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml @@ -16,7 +16,7 @@ (ä¸æ˜Žï¼‰ </text> <radio_group name="externally_visible_radio"> - <radio_item label="下記ã®ä½äººã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è¨±å¯ã™ã‚‹" name="estate_restricted_access"/> + <radio_item label="アクセスタブã«è¨˜è¼‰ã•ã‚ŒãŸä½äººã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è¨±å¯ã™ã‚‹" name="estate_restricted_access"/> <radio_item label="誰ã§ã‚‚訪å•å¯" name="estate_public_access"/> </radio_group> <check_box label="18 æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™" name="limit_age_verified" tool_tip="ã“ã®ä¸å‹•ç”£ï¼ˆã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆï¼‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18 æ‰ä»¥ä¸Šã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE] ã‚’ã”覧ãã ã•ã„。"/> @@ -26,25 +26,25 @@ <check_box label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="allow_direct_teleport"/> <button label="é©ç”¨" name="apply_btn"/> <text name="estate_manager_label"> - ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼: + ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ï¼š </text> <text name="allow_resident_label"> 常ã«è¨±å¯ï¼š </text> <button label="è¿½åŠ ..." name="add_estate_manager_btn"/> - <button label="削除…" name="remove_estate_manager_btn"/> + <button label="削除..." name="remove_estate_manager_btn"/> <button label="è¿½åŠ ..." name="add_allowed_avatar_btn"/> - <button label="削除…" name="remove_allowed_avatar_btn"/> + <button label="削除..." name="remove_allowed_avatar_btn"/> <text name="allow_group_label"> - 常ã«è¨±å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—: + グループを常ã«è¨±å¯ï¼š </text> <text name="ban_resident_label"> 常ã«ç¦æ¢ï¼š </text> <button label="è¿½åŠ ..." name="add_allowed_group_btn"/> - <button label="削除…" name="remove_allowed_group_btn"/> + <button label="削除..." name="remove_allowed_group_btn"/> <button label="è¿½åŠ ..." name="add_banned_avatar_btn"/> - <button label="削除…" name="remove_banned_avatar_btn"/> + <button label="削除..." name="remove_banned_avatar_btn"/> <button label="メッセージをä¸å‹•ç”£ã«é€ä¿¡..." name="message_estate_btn"/> <button label="ä¸å‹•ç”£ã‹ã‚‰ä½äººã‚’追ã„出ã™..." name="kick_user_from_estate_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index 858307800b6f8b50b1078324b0f0ac372330bf75..9c70a1172f36356e0efbe45920028d1c88790768 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«"> - <panel.string name="text deed continued">è²æ¸¡</panel.string> - <panel.string name="text deed">è²æ¸¡</panel.string> - <panel.string name="text modify info 1">ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™</panel.string> - <panel.string name="text modify info 2">ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™</panel.string> - <panel.string name="text modify info 3">ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify info 4">ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify info 5">地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify info 6">地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify warning">ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ãƒ‘ーツãŒãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã¾ã™</panel.string> - <panel.string name="Cost Default">ä¾¡æ ¼ï¼š L$</panel.string> - <panel.string name="Cost Total">åˆè¨ˆä¾¡æ ¼: L$</panel.string> - <panel.string name="Cost Per Unit">Price Per: L$</panel.string> - <panel.string name="Cost Mixed">Mixed Price</panel.string> - <panel.string name="Sale Mixed">Mixed Sale</panel.string> + <panel.string name="text deed continued"> + è²æ¸¡ + </panel.string> + <panel.string name="text deed"> + è²æ¸¡ + </panel.string> + <panel.string name="text modify info 1"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </panel.string> + <panel.string name="text modify info 2"> + ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </panel.string> + <panel.string name="text modify info 3"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify info 4"> + ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify info 5"> + 地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify info 6"> + 地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify warning"> + ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ãƒ‘ーツãŒãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã¾ã™ + </panel.string> + <panel.string name="Cost Default"> + ä¾¡æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Total"> + åˆè¨ˆä¾¡æ ¼: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Price Per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mixed Price + </panel.string> + <panel.string name="Sale Mixed"> + Mixed Sale + </panel.string> <text name="title" value="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«"/> <text name="where" value="(インワールド)"/> <panel label="" name="properties_panel"> - <text name="Name:">åå‰ï¼š</text> - <text name="Description:">説明:</text> - <text name="CreatorNameLabel">制作者:</text> - <text name="Owner:">所有者:</text> - <text name="Group_label">グループ:</text> + <text name="Name:"> + åå‰ï¼š + </text> + <text name="Description:"> + 説明: + </text> + <text name="CreatorNameLabel"> + 制作者: + </text> + <text name="Owner:"> + 所有者: + </text> + <text name="Group_label"> + グループ: + </text> <button name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã™"/> <name_box initial_value="ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°..." name="Group Name Proxy"/> <button label="è²æ¸¡" label_selected="è²æ¸¡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ã‚£ã‚µãƒ¼ãŒè²æ¸¡ã§ãã¾ã™ã€‚"/> - <text name="label click action">クリックã§ï¼š</text> + <text name="label click action"> + クリックã§ï¼š + </text> <combo_box name="clickaction"> <combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/> <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="オブジェクトã«æ”¯æ‰•ã†" name="Payobject"/> <combo_box.item label="é–‹ã" name="Open"/> <combo_box.item label="ズーム" name="Zoom"/> + <combo_box.item label="ãªã—" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™</text> - <text name="Anyone can:">全員:</text> + <text name="perm_modify"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </text> + <text name="Anyone can:"> + 全員: + </text> <check_box label="コピー" name="checkbox allow everyone copy"/> <check_box label="移動" name="checkbox allow everyone move"/> - <text name="GroupLabel">グループ:</text> + <text name="GroupLabel"> + グループ: + </text> <check_box label="共有" name="checkbox share with group" tool_tip="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ è²æ¸¡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/> - <text name="NextOwnerLabel">次ã®æ‰€æœ‰è€…:</text> + <text name="NextOwnerLabel"> + 次ã®æ‰€æœ‰è€…: + </text> <check_box label="ä¿®æ£" name="checkbox next owner can modify"/> <check_box label="コピー" name="checkbox next owner can copy"/> <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="ã“ã®ã‚ªãƒ–ジェクトを検索çµæžœã«è¡¨ç¤ºã—ã¾ã™"/> - <text name="pathfinding_attributes_label">パスファインディング属性:</text> - <text name="B:">B.</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + パスファインディング属性: + </text> + <text name="B:"> + B. + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="é–‹ã" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 80fa306157c2523683c6477c331702af3b78d6fa..48329f86cd3adc0a4e4450f985ef1dd7c9145c86 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -2239,6 +2239,18 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="RegionInfoListTypeBannedAgents"> 常ã«ç¦æ¢ </string> + <string name="RegionInfoAllEstates"> + ã™ã¹ã¦ã®ä¸å‹•ç”£ + </string> + <string name="RegionInfoManagedEstates"> + 管ç†ã•ã‚Œã¦ã„ã‚‹ä¸å‹•ç”£ + </string> + <string name="RegionInfoThisEstate"> + ã“ã®ä¸å‹•ç”£ + </string> + <string name="AndNMore"> + ãŠã‚ˆã³ [EXTRA_COUNT] ã¤ã®ä¸å‹•ç”£ + </string> <string name="ScriptLimitsParcelScriptMemory"> 区画スクリプトメモリ </string> diff --git a/indra/newview/skins/default/xui/pt/floater_auction.xml b/indra/newview/skins/default/xui/pt/floater_auction.xml index 074f7bf0013ea2a93ea1503a5f3d05f4e7f6ab99..92b983169d641ae6b2b1db86be6dd49d70875926 100644 --- a/indra/newview/skins/default/xui/pt/floater_auction.xml +++ b/indra/newview/skins/default/xui/pt/floater_auction.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="INICIAR VENDA DE TERRENO LINDEN START"> +<floater name="floater_auction" title="INICIAR VENDA DE TERRENO LINDEN"> <floater.string name="already for sale"> - Você não pode leiloar terrenos que já estão configurados para venda. + Você não pode leiloar terrenos que já estão para venda. </floater.string> - <check_box initial_value="true" label="Incluir marcador de seleção amarelo" name="fence_check"/> + <check_box initial_value="true" label="Incluir uma cerca de seleção amarela" name="fence_check"/> <button label="Foto" label_selected="Foto" name="snapshot_btn"/> <button label="Vender a qualquer um" label_selected="Vender a qualquer um" name="sell_to_anyone_btn"/> - <button label="Clear Settings" label_selected="Limpar configurações" name="reset_parcel_btn"/> - <button label="Iniciar Leilão" label_selected="Iniciar Leilão" name="start_auction_btn"/> + <button label="Limpar configurações" label_selected="Limpar configurações" name="reset_parcel_btn"/> + <button label="Iniciar leilão" label_selected="Iniciar leilão" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index 0c17624aa5f0a754df41826bc5f633d545408529..4e9b6e3bbd6202421d2670eaee2c9bfe4fd47a82 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -198,6 +198,7 @@ <combo_box.item label="Pagar objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Nenhum" name="None"/> </combo_box> <check_box label="À venda" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index fddc9f6abf4430be2ed401f4c8833877068ba9f7..3fe267ccd732d14407b074281e687c253f2b0769 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="Controles da câmera..." name="Camera Controls"/> <menu label="Movimentos" name="Movement"> <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_call label="Ficar de pé" name="Stand up"/> <menu_item_check label="Voar" name="Fly"/> <menu_item_check label="Correr sempre" name="Always Run"/> <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> @@ -281,6 +282,7 @@ <menu_item_check label="Formas fÃsicas" name="Physics Shapes"/> <menu_item_check label="Tipo de atualização" name="Update Type"/> <menu_item_check label="Dados LOD" name="LOD Info"/> + <menu_item_check label="Contar triângulo" name="Triangle Count"/> <menu_item_check label="Fila de construção" name="Build Queue"/> <menu_item_check label="PartÃculas" name="Particles"/> <menu_item_check label="Junções" name="Joints"/> @@ -355,6 +357,7 @@ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/> <menu_item_check label="Exibir ossos" name="Show Bones"/> <menu_item_check label="Display Agent Target" name="Display Agent Target"/> + <menu_item_check label="Mostrar as extensões do impostor" name="Show Impostor Extents"/> <menu_item_call label="Depurar texturas do avatar" name="Debug Avatar Textures"/> </menu> <menu_item_check label="Texturas HTTP" name="HTTP Textures"/> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 59c84b781d4b738993d6241807a0948cd4f22ca2..082293fa33c96d43a58c9789f1e509fd9111fbd5 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -1561,6 +1561,30 @@ Ultrapassa o limite de [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. <notification name="ProblemAddingEstateManagerBanned"> Não foi possÃvel adicionar residentes banidos à lista de gerentes de propriedades. </notification> + <notification name="ProblemBanningEstateManager"> + Não foi possÃvel adicionar o gerente [AGENT] à lista de banimento. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> já está na lista de Grupos permitidos. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] já está na sua [LIST_TYPE] lista. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] já está na sua [LIST_TYPE] lista. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] foi adicionado na [LIST_TYPE] lista de [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] foi adicionado na [LIST_TYPE] lista de [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] foi removido da [LIST_TYPE] lista de [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] foi removido da [LIST_TYPE] lista de [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Não é possÃvel alterar a aparência até que as roupas e formas estejam carregadas. </notification> @@ -1860,7 +1884,7 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar. <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as Propriedades" yestext="Esta Propriedade"/> </notification> <notification label="Selecione a propriedade" name="EstateBannedAgentRemove"> - Remover este Residente da lista de banimento para acessar esta propriedade somente ou para [ALL_ESTATES]? + Remover este Residente da lista de banimento para acessar este estado somente ou para [ALL_ESTATES]? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as Propriedades" yestext="Esta Propriedade"/> </notification> <notification label="Selecione a propriedade" name="EstateManagerAdd"> @@ -3153,16 +3177,22 @@ Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique Falha de conexão com [VOICE_CHANNEL_NAME]. Tente novamente mais tarde. Agora você será reconectado ao bate-papo local. </notification> <notification name="VoiceEffectsExpired"> - Um ou mais serviços de distorção de voz que você assinou veceu. -[[URL] Clique aqui] para renovar o serviço. + Um ou mais serviços de distorção de voz que você assinou venceu. +[[URL] Clique aqui] para renovar o serviço. + +Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz. </notification> <notification name="VoiceEffectsExpiredInUse"> - A Distorção de voz ativa expirou. Suas configurações de voz padrão foram ativadas. -[[URL] Clique aqui] para renovar o serviço. + A Distorção de voz ativa expirou. Suas configurações de voz padrão foram ativadas. +[[URL] Clique aqui] para renovar o serviço. + +Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz. </notification> <notification name="VoiceEffectsWillExpire"> - Uma ou mais das suas distorções de voz tem vencimento em menos de [INTERVAL] dias. -[[URL] Clique aqui] para renovar o serviço. + Uma ou mais das suas distorções de voz tem vencimento em menos de [INTERVAL] dias. +[[URL] Clique aqui] para renovar o serviço. + +Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz. </notification> <notification name="VoiceEffectsNew"> Novas Distorções de voz! @@ -3214,6 +3244,9 @@ Para sua segurança, os SLurls serão bloqueados por alguns instantes. <notification name="SnapshotToComputerFailed"> Falha ao salvar fotografia em [PATH]: Disco cheio. [NEED_MEMORY]KB é necessário, mas somente [FREE_MEMORY]KB está livre. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Falha ao salvar fotografia em [PATH]: O diretório não existe. + </notification> <notification name="PresetNotSaved"> Erro ao salvar predefinição [NAME]. </notification> diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml index ffcf72b1b4d840159f6f8926d9ecd68526617328..ffe637b3c1c01a517e134da35bd2f6c8748da9e8 100644 --- a/indra/newview/skins/default/xui/pt/panel_login.xml +++ b/indra/newview/skins/default/xui/pt/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=pt</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=pt + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nome de usuário" name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 ou Magia Solar"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Login" name="connect_btn"/> <check_box label="Lembrar-me" name="remember_check"/> - <text name="forgot_password_text">Senha esquecida</text> + <text name="forgot_password_text"> + Senha esquecida + </text> <combo_box label="Selecionar grade" name="server_combo"/> + <text name="sign_up_text"> + Cadastre-se + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_login_first.xml b/indra/newview/skins/default/xui/pt/panel_login_first.xml index 6e4ef65beabc9cd19bb1900838a175f6ffc072bb..86c61163bc9104a227d861e3378469e1a4fcea75 100644 --- a/indra/newview/skins/default/xui/pt/panel_login_first.xml +++ b/indra/newview/skins/default/xui/pt/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=pt </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Senha esquecida </text> + <text name="sign_up_text"> + Cadastre-se + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/pt/panel_region_access.xml b/indra/newview/skins/default/xui/pt/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc2136a4598e23bf66f2672f230d50db38436e9e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Acesso" name="Access"> + <tab_container name="tabs"> + <panel label="GERENTES" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gerentes: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Adicionar..." name="add_estate_manager_btn"/> + <button label="Remover..." name="remove_estate_manager_btn"/> + </panel> + <panel label="PERMITIDO" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Buscar agentes permitidos" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Sempre permitido: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Adicionar..." name="add_allowed_avatar_btn"/> + <button label="Remover..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GRUPOS PERMITIDOS" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Buscar grupos permitidos" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Grupos sempre permitidos: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Adicionar..." name="add_allowed_group_btn"/> + <button label="Remover..." name="remove_allowed_group_btn"/> + </panel> + <panel label="BANIDO" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Buscar agentes banidos" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Sempre banido: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nome" name="name"/> + <columns label="Último acesso" name="last_login_date"/> + <columns label="Data do banimento" name="ban_date"/> + <columns label="Banido por" name="bannedby"/> + </name_list> + <button label="Adicionar..." name="add_banned_avatar_btn"/> + <button label="Remover..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_region_estate.xml b/indra/newview/skins/default/xui/pt/panel_region_estate.xml index 8b405f601a5f5e205ccc33744790f5c8f1960c64..ac864ebb4b93c5eac5e4145b5eaa73928de19f5c 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_estate.xml @@ -16,7 +16,7 @@ (desconhecido) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Permitir somente os residentes e os grupos listados abaixo" name="estate_restricted_access"/> + <radio_item label="Permitir somente residentes e grupos listados na aba Acesso" name="estate_restricted_access"/> <radio_item label="Qualquer um pode visitar" name="estate_public_access"/> </radio_group> <check_box label="Deve ser maior de 18 anos" name="limit_age_verified" tool_tip="Os residentes devem ter 18 anos ou mais para acessar esta propriedade. Consulte o [SUPPORT_SITE] para obter mais informações."/> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml index bbfaa4a4f5ad8a59fe8db8963e029b81c1bfda6f..ed609dfc3d1c636a27de842de96effeca28ecdd7 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Perfil do objeto"> - <panel.string name="text deed continued">Doar</panel.string> - <panel.string name="text deed">Doar</panel.string> - <panel.string name="text modify info 1">Você pode modificar este objeto</panel.string> - <panel.string name="text modify info 2">Você pode modificar estes objetos</panel.string> - <panel.string name="text modify info 3">Você não pode modificar este objeto</panel.string> - <panel.string name="text modify info 4">Você não pode modificar estes objetos</panel.string> - <panel.string name="text modify info 5">Não é possÃvel modificar este objeto através de uma demarcação da região</panel.string> - <panel.string name="text modify info 6">Não é possÃvel modificar estes objetos através de uma demarcação da região</panel.string> - <panel.string name="text modify warning">O objeto contém links ligando suas partes</panel.string> - <panel.string name="Cost Default">Preço: L$</panel.string> - <panel.string name="Cost Total">Preço total: L$</panel.string> - <panel.string name="Cost Per Unit">Preço unitário: L$</panel.string> - <panel.string name="Cost Mixed">Preço misto</panel.string> - <panel.string name="Sale Mixed">Venda mista</panel.string> + <panel.string name="text deed continued"> + Doar + </panel.string> + <panel.string name="text deed"> + Doar + </panel.string> + <panel.string name="text modify info 1"> + Você pode modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Você pode modificar estes objetos + </panel.string> + <panel.string name="text modify info 3"> + Você não pode modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + Você não pode modificar estes objetos + </panel.string> + <panel.string name="text modify info 5"> + Não é possÃvel modificar este objeto através de uma demarcação da região + </panel.string> + <panel.string name="text modify info 6"> + Não é possÃvel modificar estes objetos através de uma demarcação da região + </panel.string> + <panel.string name="text modify warning"> + O objeto contém links ligando suas partes + </panel.string> + <panel.string name="Cost Default"> + Preço: L$ + </panel.string> + <panel.string name="Cost Total"> + Preço total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Preço unitário: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Preço misto + </panel.string> + <panel.string name="Sale Mixed"> + Venda mista + </panel.string> <text name="title" value="Perfil do objeto"/> <text name="where" value="(Inworld)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nome:</text> - <text name="Description:">Descrição:</text> - <text name="CreatorNameLabel">Criador:</text> - <text name="Owner:">Proprietário:</text> - <text name="Group_label">Grupo:</text> + <text name="Name:"> + Nome: + </text> + <text name="Description:"> + Descrição: + </text> + <text name="CreatorNameLabel"> + Criador: + </text> + <text name="Owner:"> + Proprietário: + </text> + <text name="Group_label"> + Grupo: + </text> <button name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/> <name_box initial_value="Carregando..." name="Group Name Proxy"/> <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/> - <text name="label click action">Clique para:</text> + <text name="label click action"> + Clique para: + </text> <combo_box name="clickaction"> <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/> <combo_box.item label="Sentar em objeto" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="Pagar por objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Nenhum" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Você pode modificar este objeto</text> - <text name="Anyone can:">Todos:</text> + <text name="perm_modify"> + Você pode modificar este objeto + </text> + <text name="Anyone can:"> + Todos: + </text> <check_box label="Copiar" name="checkbox allow everyone copy"/> <check_box label="Movimentar" name="checkbox allow everyone move"/> - <text name="GroupLabel">Grupo:</text> + <text name="GroupLabel"> + Grupo: + </text> <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenham o seu nÃvel de modificação para este objeto. Faça uma doação para ativar restrições de função."/> - <text name="NextOwnerLabel">Próximo proprietário:</text> + <text name="NextOwnerLabel"> + Próximo proprietário: + </text> <check_box label="Modificar" name="checkbox next owner can modify"/> <check_box label="Copiar" name="checkbox next owner can copy"/> <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="Preço: L$" name="Edit Cost"/> <check_box label="Mostrar nos resultados de busca" name="search_check" tool_tip="Incluir o objeto nos resultados de busca"/> - <text name="pathfinding_attributes_label">Atributos do pathfinding:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Atributos do pathfinding: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Abrir" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 4c23e48b894890b47bac2bdc7925fa30280ffe2c..076a0cc7d3d5d4ebb5c19152b20c29177ce074c7 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -2185,6 +2185,18 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se <string name="RegionInfoListTypeBannedAgents"> Sempre banido </string> + <string name="RegionInfoAllEstates"> + todos os terrenos + </string> + <string name="RegionInfoManagedEstates"> + administre terrenos + </string> + <string name="RegionInfoThisEstate"> + este terreno + </string> + <string name="AndNMore"> + e [EXTRA_COUNT] mais + </string> <string name="ScriptLimitsParcelScriptMemory"> Memória de scripts no lote </string> diff --git a/indra/newview/skins/default/xui/ru/floater_auction.xml b/indra/newview/skins/default/xui/ru/floater_auction.xml index 105c75c919f96bafdadd5c1806c2e16338bc286d..e6cc7000245d45deaaa830f0c5194ba9896e3b73 100644 --- a/indra/newview/skins/default/xui/ru/floater_auction.xml +++ b/indra/newview/skins/default/xui/ru/floater_auction.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="ÐÐЧÐТЬ ПРОДÐЖУ ЗЕМЛИ ЛИÐДЕÐОВ"> +<floater name="floater_auction" title="ÐÐЧÐТЬ ПРОДÐЖУ ЗЕМЛИ LINDEN"> <floater.string name="already for sale"> ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñтавить на аукцион учаÑтки, которые уже продаютÑÑ. </floater.string> <check_box initial_value="true" label="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¶ÐµÐ»Ñ‚ÑƒÑŽ ограду вокруг выбранного учаÑтка" name="fence_check"/> - <button label="Снимок" label_selected="Снимок" name="snapshot_btn"/> + <button label="Моментальный Ñнимок" label_selected="Моментальный Ñнимок" name="snapshot_btn"/> <button label="Купить может каждый" label_selected="Купить может каждый" name="sell_to_anyone_btn"/> <button label="ОчиÑтить наÑтройки" label_selected="ОчиÑтить наÑтройки" name="reset_parcel_btn"/> <button label="Ðачать аукцион" label_selected="Ðачать аукцион" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index 74c27ce1622800292a19cd63717a706b73e3ea73..2d7af4d5819361622860844f2563438f0064cbb0 100644 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -201,6 +201,7 @@ <combo_box.item label="Заплатить за объект" name="Payobject"/> <combo_box.item label="Открыть" name="Open"/> <combo_box.item label="Увеличение" name="Zoom"/> + <combo_box.item label="Ðет" name="None"/> </combo_box> <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index 8e94c4f5fd8330f0f54bd83cdb4bdfa84682d897..06f9d103eed0949ede3fa17afdd39f214d810ff1 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="Управление камерой..." name="Camera Controls"/> <menu label="Движение" name="Movement"> <menu_item_call label="СеÑÑ‚ÑŒ" name="Sit Down Here"/> + <menu_item_call label="Ð’Ñтать" name="Stand up"/> <menu_item_check label="Полет" name="Fly"/> <menu_item_check label="Ð’Ñегда бегать" name="Always Run"/> <menu_item_call label="ОÑтановить анимацию" name="Stop Animating My Avatar"/> @@ -293,6 +294,7 @@ <menu_item_check label="Площадь текÑтуры" name="Texture Area"/> <menu_item_check label="Площадь грани" name="Face Area"/> <menu_item_check label="Данные об уровнÑÑ… детализации" name="LOD Info"/> + <menu_item_check label="КоличеÑтво треугольников" name="Triangle Count"/> <menu_item_check label="Очередь поÑтроителÑ" name="Build Queue"/> <menu_item_check label="ОÑвещение" name="Lights"/> <menu_item_check label="ЧаÑтицы" name="Particles"/> @@ -405,6 +407,7 @@ <menu_item_check label="Показать Ñкелет" name="Show Collision Skeleton"/> <menu_item_check label="Показать коÑти" name="Show Bones"/> <menu_item_check label="Отобразить дейÑтвие агента" name="Display Agent Target"/> + <menu_item_check label="Показать пределы импоÑтера" name="Show Impostor Extents"/> <menu_item_call label="Вывод приÑоединений" name="Dump Attachments"/> <menu_item_call label="Отладка текÑтур аватара" name="Debug Avatar Textures"/> <menu_item_call label="Вывод локальных текÑтур" name="Dump Local Textures"/> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 663cb808ae63b56a8ca5eb3e8b5fd117ebd5c513..9bef3d4b5346a8cf98c1c02551fd110cddbe06a2 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -1569,6 +1569,30 @@ <notification name="ProblemAddingEstateManagerBanned"> Ðевозможно добавить заблокированного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок менеджеров землевладениÑ. </notification> + <notification name="ProblemBanningEstateManager"> + Ðевозможно добавить заблокированного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок менеджеров Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ [AGENT]. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>\[GROUP]</nolink> уже находитÑÑ Ð² ÑпиÑке допущенных групп. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] уже находитÑÑ Ð½Ð° вашем [LIST_TYPE] лиÑте. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] уже находитÑÑ Ð½Ð° вашем [LIST_TYPE] лиÑте. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] был добавлен в [LIST_TYPE] лиÑÑ‚ [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] был добавлен в [LIST_TYPE] лиÑÑ‚ [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] был удален из [LIST_TYPE] лиÑта [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] был удален из [LIST_TYPE] лиÑта [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ внешноÑÑ‚ÑŒ, пока загружаютÑÑ Ð¾Ð´ÐµÐ¶Ð´Ð° и фигура. </notification> @@ -3164,16 +3188,22 @@ Ðе удалоÑÑŒ подключитьÑÑ Ðº [VOICE_CHANNEL_NAME], повторите попытку позже. Будет уÑтановлено подключение к локальному голоÑовому чату. </notification> <notification name="VoiceEffectsExpired"> - ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, на которые вы подпиÑаны. -[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки на один или неÑколько типов анимационного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа. +[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + +ЕÑли вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здеÑÑŒ], чтобы получить право на анимационное изменение голоÑа. </notification> <notification name="VoiceEffectsExpiredInUse"> - ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ типа Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, применены наÑтройки вашего обычного голоÑа. -[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð³Ð¾ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, дейÑтвуют наÑтройки вашего обычного голоÑа. +[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + +ЕÑли вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здеÑÑŒ], чтобы получить право на анимационное изменение голоÑа. </notification> <notification name="VoiceEffectsWillExpire"> - Срок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких ваших типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа иÑтекает через [INTERVAL] дней или раньше. -[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + Срок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких ваших типов анимационного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа иÑтекает через [INTERVAL] дней или раньше. +[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + +ЕÑли вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здеÑÑŒ], чтобы получить право на анимационное изменение голоÑа. </notification> <notification name="VoiceEffectsNew"> ПоÑвилиÑÑŒ новые типы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа! @@ -3225,6 +3255,9 @@ <notification name="SnapshotToComputerFailed"> Ðе удалоÑÑŒ Ñохранить моментальный Ñнимок на [PATH]: ДиÑк переполнен. Ðеобходимо [NEED_MEMORY] Кбайт, но доÑтупно только [FREE_MEMORY] Кбайт. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Ðе удалоÑÑŒ Ñохранить моментальный Ñнимок на [PATH]: Каталог не ÑущеÑтвует. + </notification> <notification name="PresetNotSaved"> Ошибка при Ñохранении преÑета [NAME]. </notification> diff --git a/indra/newview/skins/default/xui/ru/panel_login.xml b/indra/newview/skins/default/xui/ru/panel_login.xml index 2e0ae89b286745d9903c41b44108a70fcda741a8..14107286e59222599171a67225c08b4426fd502f 100644 --- a/indra/newview/skins/default/xui/ru/panel_login.xml +++ b/indra/newview/skins/default/xui/ru/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="username_combo" tool_tip="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое вы выбрали при региÑтрации, например, «bobsmith12» или «Steller Sunshine»"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Войти" name="connect_btn"/> <check_box label="Запомнить менÑ" name="remember_check"/> - <text name="forgot_password_text">Забыли пароль?</text> + <text name="forgot_password_text"> + Забыли пароль? + </text> <combo_box label="Выберите Ñетку" name="server_combo"/> + <text name="sign_up_text"> + РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_login_first.xml b/indra/newview/skins/default/xui/ru/panel_login_first.xml index bb4875373a251f57e6e522425dde964c3c220ab6..5db81ea7ca518eda66cb768df44b5e75b440c1a4 100644 --- a/indra/newview/skins/default/xui/ru/panel_login_first.xml +++ b/indra/newview/skins/default/xui/ru/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Забытый пароль </text> + <text name="sign_up_text"> + РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/ru/panel_region_access.xml b/indra/newview/skins/default/xui/ru/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..48adfbcd95e4e006ab7ff1d6f9c3da78e303b1c9 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ДоÑтуп" name="Access"> + <tab_container name="tabs"> + <panel label="МЕÐЕДЖЕРЫ ЗЕМЛЕВЛÐДЕÐИЯ" name="estate_managers_panel"> + <text name="estate_manager_label"> + Менеджеры землевладениÑ: + </text> + <name_list name="estate_manager_name_list"> + <columns label="ИмÑ" name="name"/> + </name_list> + <button label="Добавить..." name="add_estate_manager_btn"/> + <button label="Удалить..." name="remove_estate_manager_btn"/> + </panel> + <panel label="Ð ÐЗРЕШЕÐÐЫЕ" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="ПоиÑк допущенных агентов" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Разрешено вÑегда: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="ИмÑ" name="name"/> + </name_list> + <button label="Добавить..." name="add_allowed_avatar_btn"/> + <button label="Удалить..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="ДОПУЩЕÐÐЫЕ ГРУППЫ" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="ПоиÑк допущенных групп" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + ДопуÑк групп вÑегда разрешен: + </text> + <name_list name="allowed_group_name_list"> + <columns label="ИмÑ" name="name"/> + </name_list> + <button label="Добавить..." name="add_allowed_group_btn"/> + <button label="Удалить..." name="remove_allowed_group_btn"/> + </panel> + <panel label="ЗÐБЛОКИРОВÐÐЫ" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="ПоиÑк заблокированных агентов" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Ð’Ñегда заблокированы: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="ИмÑ" name="name"/> + <columns label="Дата поÑледнего входа" name="last_login_date"/> + <columns label="Дата блокировки" name="ban_date"/> + <columns label="Заблокированы по инициативе" name="bannedby"/> + </name_list> + <button label="Добавить..." name="add_banned_avatar_btn"/> + <button label="Удалить..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_region_estate.xml b/indra/newview/skins/default/xui/ru/panel_region_estate.xml index 843fcaa9f821e4ddbd3e3b4f6e93425744438a72..5789058b3b25f5529a152b102e2b18a2a312fe32 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_estate.xml @@ -16,7 +16,7 @@ (неизвеÑтно) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Разрешено только нижеперечиÑленным жителÑм и группам" name="estate_restricted_access"/> + <radio_item label="Разрешено только жителÑм и группам, перечиÑленным на вкладке доÑтупа" name="estate_restricted_access"/> <radio_item label="ДоÑтуп открыт Ð´Ð»Ñ Ð²Ñех" name="estate_public_access"/> </radio_group> <check_box label="Должен быть 18 и Ñтарше" name="limit_age_verified" tool_tip="ДоÑтуп к Ñтому землевладению имеют только жители 18 лет и Ñтарше. Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð´ÐµÑÑŒ: [SUPPORT_SITE]."/> @@ -36,7 +36,7 @@ <button label="Добавить..." name="add_allowed_avatar_btn"/> <button label="Удалить..." name="remove_allowed_avatar_btn"/> <text name="allow_group_label"> - ДопуÑк групп вÑегда разрешен: + Группы вÑегда разрешены: </text> <text name="ban_resident_label"> Ð’Ñегда заблокированы: diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml index 4059a800f065d0a8d0f04ee8e726ebe58c6831a0..d7f96cab1fa45a5671e4c4137c4c0c92e947b643 100644 --- a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Профиль объекта"> - <panel.string name="text deed continued">Сделка</panel.string> - <panel.string name="text deed">Сделка</panel.string> - <panel.string name="text modify info 1">Ðтот объект можно изменÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 2">Ðти объекты можно изменÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 3">Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 4">Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 5">Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона</panel.string> - <panel.string name="text modify info 6">Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона</panel.string> - <panel.string name="text modify warning">Ðтот объект Ñодержит объединенные чаÑти</panel.string> - <panel.string name="Cost Default">Цена: L$</panel.string> - <panel.string name="Cost Total">Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñ†ÐµÐ½Ð°: L$</panel.string> - <panel.string name="Cost Per Unit">Цена за: L$</panel.string> - <panel.string name="Cost Mixed">Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð°</panel.string> - <panel.string name="Sale Mixed">Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð°</panel.string> + <panel.string name="text deed continued"> + Сделка + </panel.string> + <panel.string name="text deed"> + Сделка + </panel.string> + <panel.string name="text modify info 1"> + Ðтот объект можно изменÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 2"> + Ðти объекты можно изменÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 3"> + Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 4"> + Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 5"> + Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона + </panel.string> + <panel.string name="text modify info 6"> + Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона + </panel.string> + <panel.string name="text modify warning"> + Ðтот объект Ñодержит объединенные чаÑти + </panel.string> + <panel.string name="Cost Default"> + Цена: L$ + </panel.string> + <panel.string name="Cost Total"> + Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñ†ÐµÐ½Ð°: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Цена за: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð° + </panel.string> + <panel.string name="Sale Mixed"> + Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð° + </panel.string> <text name="title" value="Профиль объекта"/> <text name="where" value="(в мире)"/> <panel label="" name="properties_panel"> - <text name="Name:">Ðазвание:</text> - <text name="Description:">ОпиÑание:</text> - <text name="CreatorNameLabel">Создатель:</text> - <text name="Owner:">Владелец:</text> - <text name="Group_label">Группа:</text> + <text name="Name:"> + Ðазвание: + </text> + <text name="Description:"> + ОпиÑание: + </text> + <text name="CreatorNameLabel"> + Создатель: + </text> + <text name="Owner:"> + Владелец: + </text> + <text name="Group_label"> + Группа: + </text> <button name="button set group" tool_tip="Выберите группу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ ей прав доÑтупа к объекту"/> <name_box initial_value="Загрузка..." name="Group Name Proxy"/> <button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="Ð’ результате Ñделки объект передаетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, при Ñтом права на него будут ÑоответÑтвовать правам Ñледующего владельца. Переданный группе объект может передаватьÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ñтным лицом группы."/> - <text name="label click action">ДейÑтвие по щелчку:</text> + <text name="label click action"> + ДейÑтвие по щелчку: + </text> <combo_box name="clickaction"> <combo_box.item label="КоÑнутьÑÑ (по умолчанию)" name="Touch/grab(default)"/> <combo_box.item label="СеÑÑ‚ÑŒ на объект" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="Заплатить за объект" name="Payobject"/> <combo_box.item label="Открыть" name="Open"/> <combo_box.item label="Приблизить" name="Zoom"/> + <combo_box.item label="Ðет" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Ðтот объект можно изменÑÑ‚ÑŒ</text> - <text name="Anyone can:">Ð’Ñе:</text> + <text name="perm_modify"> + Ðтот объект можно изменÑÑ‚ÑŒ + </text> + <text name="Anyone can:"> + Ð’Ñе: + </text> <check_box label="Копировать" name="checkbox allow everyone copy"/> <check_box label="ПеремеÑтить" name="checkbox allow everyone move"/> - <text name="GroupLabel">Группа:</text> + <text name="GroupLabel"> + Группа: + </text> <check_box label="ПоделитьÑÑ" name="checkbox share with group" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/> - <text name="NextOwnerLabel">Следующий владелец:</text> + <text name="NextOwnerLabel"> + Следующий владелец: + </text> <check_box label="ИзменÑÑ‚ÑŒ" name="checkbox next owner can modify"/> <check_box label="Копировать" name="checkbox next owner can copy"/> <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="Цена: L$" name="Edit Cost"/> <check_box label="Показать в результатах поиÑка" name="search_check" tool_tip="Показывать объект в результатах поиÑка"/> - <text name="pathfinding_attributes_label">Ðтрибуты поиÑка пути:</text> - <text name="B:">Ð:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">Ð’:</text> - <text name="N:">С:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Ðтрибуты поиÑка пути: + </text> + <text name="B:"> + Ð: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + Ð’: + </text> + <text name="N:"> + С: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Открыть" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index dc4741e9bdfcadced8a403d4072d1f097d6c48e8..1a16600744f23a9253f66e714e5822dc7c03cca6 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -636,15 +636,6 @@ support@secondlife.com. <string name="BUTTON_HELP"> Показать Ñправку </string> - <string name="TooltipNotecardNotAllowedTypeDrop"> - Ðлементы Ñтого типа не могут быть занеÑены в -карточку Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ² в Ñтом регионе. - </string> - <string name="TooltipNotecardOwnerRestrictedDrop"> - Только Ñлементы Ñ Ð±ÐµÐ·ÑƒÑловным разрешением -‘Ñледующего владельца’ можно внеÑти -в карточки Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ². - </string> <string name="Searching"> ПоиÑк... </string> @@ -793,9 +784,6 @@ support@secondlife.com. <string name="symbolic link"> ÑÑылку </string> - <string name="settings blob"> - наÑтройки - </string> <string name="symbolic folder link"> ÑÑылку на папку </string> @@ -2238,6 +2226,18 @@ support@secondlife.com. <string name="RegionInfoListTypeBannedAgents"> Ð’Ñегда заблокированы </string> + <string name="RegionInfoAllEstates"> + вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ + </string> + <string name="RegionInfoManagedEstates"> + управлÑемые Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ + </string> + <string name="RegionInfoThisEstate"> + Ñто землевладение + </string> + <string name="AndNMore"> + и \[EXTRA_COUNT] более + </string> <string name="ScriptLimitsParcelScriptMemory"> ПамÑÑ‚ÑŒ под Ñкрипты на учаÑтке </string> diff --git a/indra/newview/skins/default/xui/tr/floater_auction.xml b/indra/newview/skins/default/xui/tr/floater_auction.xml index 3c945a9c964e414d3b35be0145de814ef1b6fe38..dccf47d81986f74667fa562cb2d1e0940ba628b4 100644 --- a/indra/newview/skins/default/xui/tr/floater_auction.xml +++ b/indra/newview/skins/default/xui/tr/floater_auction.xml @@ -3,8 +3,8 @@ <floater.string name="already for sale"> Zaten satışa çıkarılmış olan parselleri açık artırmaya sunamazsınız. </floater.string> - <check_box initial_value="true" label="Sarı seçim çiti dahil edilsin" name="fence_check"/> - <button label="Anlık Görüntü" label_selected="Anlık Görüntü" name="snapshot_btn"/> + <check_box initial_value="true" label="Sarı seçim çitini dahil et" name="fence_check"/> + <button label="Anlık görüntü" label_selected="Anlık görüntü" name="snapshot_btn"/> <button label="Herkese Sat" label_selected="Herkese Sat" name="sell_to_anyone_btn"/> <button label="Ayarları Temizle" label_selected="Ayarları Temizle" name="reset_parcel_btn"/> <button label="Açık Artırmayı BaÅŸlat" label_selected="Açık Artırmayı BaÅŸlat" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index 0c26f717afe67048b05dd69371395271f8a65d19..cd069dccf0bc738bf263c00154e1b461df598cf2 100644 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -201,6 +201,7 @@ <combo_box.item label="Nesneye ödeme yap" name="Payobject"/> <combo_box.item label="Aç" name="Open"/> <combo_box.item label="YakınlaÅŸtır" name="Zoom"/> + <combo_box.item label="Yok" name="None"/> </combo_box> <check_box label="Satılık:" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index 384c89b028e87ed4f3a45b8ecf0d97787e15b3e3..1d03cadbb2016ffe3d414ed200f70ac9329cc55a 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="Kamera Denetimleri..." name="Camera Controls"/> <menu label="Hareket" name="Movement"> <menu_item_call label="Otur" name="Sit Down Here"/> + <menu_item_call label="Kalk" name="Stand up"/> <menu_item_check label="Uç" name="Fly"/> <menu_item_check label="Daima KoÅŸ" name="Always Run"/> <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/> @@ -294,6 +295,7 @@ <menu_item_check label="Doku Alanı" name="Texture Area"/> <menu_item_check label="Yüz Alanı" name="Face Area"/> <menu_item_check label="Ayrıntı Seviyesi Bilgisi" name="LOD Info"/> + <menu_item_check label="Üçgen Sayısı" name="Triangle Count"/> <menu_item_check label="Ä°nÅŸa KuyruÄŸu" name="Build Queue"/> <menu_item_check label="Işıklar" name="Lights"/> <menu_item_check label="Parçacıklar" name="Particles"/> @@ -406,6 +408,7 @@ <menu_item_check label="Çarpışma Ä°skeletini Göster" name="Show Collision Skeleton"/> <menu_item_check label="Kemikleri Göster" name="Show Bones"/> <menu_item_check label="Aracı Hedefini Göster" name="Display Agent Target"/> + <menu_item_check label="Düşük Grafik Özellikli Avatar Kapsamını Göster" name="Show Impostor Extents"/> <menu_item_call label="Aksesuarların Dökümünü Al" name="Dump Attachments"/> <menu_item_call label="Avatar Dokuları İçin Hata Ayıklama" name="Debug Avatar Textures"/> <menu_item_call label="Yerel Dokuların Dökümünü Al" name="Dump Local Textures"/> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 5cca46d483a6b8b0c6ff12cafbada187d56d374b..ea1447a3679ca37a724c3266ce3f55f06ff08343 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -1570,6 +1570,30 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin. <notification name="ProblemAddingEstateManagerBanned"> EngellenmiÅŸ sakin, gayrimenkul yöneticisi listesine eklenemez. </notification> + <notification name="ProblemBanningEstateManager"> + Gayrimenkul yöneticisi [AGENT] engellenen listesine eklenemiyor. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> zaten Ä°zin Verilen Gruplar listesinde yer alıyor. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] zaten [LIST_TYPE] listenizde yer alıyor. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] zaten [LIST_TYPE] listenizde yer alıyor. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT], [ESTATE] [LIST_TYPE] listesine eklendi. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT], [ESTATE] [LIST_TYPE] listesine eklendi. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT], [ESTATE] [LIST_TYPE] listesinden kaldırıldı. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT], [ESTATE] [LIST_TYPE] listesinden kaldırıldı. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Giysi ve ÅŸekil yüklenene kadar görünüm deÄŸiÅŸtirilemez. </notification> @@ -3164,16 +3188,22 @@ Sohbete katılmak için Kabul Et'i, daveti geri çevirmek için ise Reddet& [VOICE_CHANNEL_NAME] ile baÄŸlantı kurulamadı, lütfen daha sonra tekrar deneyin. Åžimdi Yakındaki bir Sesli Sohbete yeniden baÄŸlanılacaksınız. </notification> <notification name="VoiceEffectsExpired"> - Abone olduÄŸunuz Ses Åžekillerinden birinin ya da daha fazlasının süresi dolmuÅŸ. -AboneliÄŸinizi yenilemek için [[URL] burayı tıklatın]. + Abone olduÄŸunuz Ses Dönüşümlerinden birinin ya da daha fazlasının süresi dolmuÅŸ. +AboneliÄŸinizi yenilemek için [[URL] buraya tıklayın]. + +Özel Ãœye iseniz, ses dönüştürme özelliÄŸini almak için [[PREMIUM_URL] buraya tıklayın]. </notification> <notification name="VoiceEffectsExpiredInUse"> - Etkin Ses Åžeklinin süresi dolmuÅŸ, normal ses ayarlarınız uygulandı. -AboneliÄŸinizi yenilemek için [[URL] burayı tıklatın]. + Etkin Ses Dönüşümünün süresi dolmuÅŸ, normal ses ayarlarınız uygulandı. +AboneliÄŸinizi yenilemek için [[URL] buraya tıklayın]. + +Özel Ãœye iseniz, ses dönüştürme özelliÄŸini almak için [[PREMIUM_URL] buraya tıklayın]. </notification> <notification name="VoiceEffectsWillExpire"> - Abone olduÄŸunuz Ses Åžekillerinden birinin ya da daha fazlasının süresi [INTERVAL] gün içinde dolacak. -AboneliÄŸinizi yenilemek için [[URL] burayı tıklatın]. + Ses Dönüşümlerinizden birinin ya da daha fazlasının süresi [INTERVAL] günden daha az bir zamanda dolacak. +AboneliÄŸinizi yenilemek için [[URL] buraya tıklayın]. + +Özel Ãœye iseniz, ses dönüştürme özelliÄŸini almak için [[PREMIUM_URL] buraya tıklayın]. </notification> <notification name="VoiceEffectsNew"> Yeni Ses Åžekilleri kullanılabilir! @@ -3225,6 +3255,9 @@ GüvenliÄŸiniz için birkaç saniye engellenecek. <notification name="SnapshotToComputerFailed"> Anlık görüntü [PATH] yoluna kaydedilemedi: Disk dolu. [NEED_MEMORY]KB gerekli ancak yalnızca [FREE_MEMORY]KB boÅŸ. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Anlık görüntü [PATH] yoluna kaydedilemedi: Dizin mevcut deÄŸil. + </notification> <notification name="PresetNotSaved"> Ön ayar ([NAME]) kaydedilirken hata oluÅŸtu. </notification> diff --git a/indra/newview/skins/default/xui/tr/panel_login.xml b/indra/newview/skins/default/xui/tr/panel_login.xml index 8b320ce9aa68c97f3a71408e1d8991167b5b9ec6..e9fec9783f176c32aa14adcf056782a108565f49 100644 --- a/indra/newview/skins/default/xui/tr/panel_login.xml +++ b/indra/newview/skins/default/xui/tr/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Kullanıcı Adı" name="username_combo" tool_tip="KaydolduÄŸunuzda seçtiÄŸiniz kullanıcı adı, örn. mustafayalcin12 veya Faruk Gungoren"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Oturum Aç" name="connect_btn"/> <check_box label="Beni hatırla" name="remember_check"/> - <text name="forgot_password_text">Parolamı unuttum</text> + <text name="forgot_password_text"> + Parolamı unuttum + </text> <combo_box label="AÄŸ seç" name="server_combo"/> + <text name="sign_up_text"> + Kaydol + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_login_first.xml b/indra/newview/skins/default/xui/tr/panel_login_first.xml index 622edd0a8d22e5650d1d1ce8a3a238f77c220bf0..1fc80c2b977624e99d7e7248a777b3d8917eae3a 100644 --- a/indra/newview/skins/default/xui/tr/panel_login_first.xml +++ b/indra/newview/skins/default/xui/tr/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Parolamı unuttum </text> + <text name="sign_up_text"> + Kaydol + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/tr/panel_region_access.xml b/indra/newview/skins/default/xui/tr/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..57e721bc04e6c08e0b8d4ccf3a71543fb6dfbf33 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="EriÅŸim" name="Access"> + <tab_container name="tabs"> + <panel label="GAYRÄ°MENKUL YÖNETÄ°CÄ°LERÄ°" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gayrimenkul Yöneticileri: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Ad" name="name"/> + </name_list> + <button label="Ekle..." name="add_estate_manager_btn"/> + <button label="Kaldır..." name="remove_estate_manager_btn"/> + </panel> + <panel label="Ä°ZÄ°N VERÄ°LEN" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Ä°zin verilen aracıları ara" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Her zaman izin verilen: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Ad" name="name"/> + </name_list> + <button label="Ekle..." name="add_allowed_avatar_btn"/> + <button label="Kaldır..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="Ä°ZÄ°N VERÄ°LEN GRUPLAR" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Ä°zin verilen grupları ara" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Her zaman izin verilen gruplar: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Ad" name="name"/> + </name_list> + <button label="Ekle..." name="add_allowed_group_btn"/> + <button label="Kaldır..." name="remove_allowed_group_btn"/> + </panel> + <panel label="ENGELLENEN" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Engellenen aracıları ara" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Her zaman engellenen: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Ad" name="name"/> + <columns label="Son oturum açma tarihi" name="last_login_date"/> + <columns label="Engellenme tarihi" name="ban_date"/> + <columns label="Engelleyen" name="bannedby"/> + </name_list> + <button label="Ekle..." name="add_banned_avatar_btn"/> + <button label="Kaldır..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_region_estate.xml b/indra/newview/skins/default/xui/tr/panel_region_estate.xml index fc8dab9c69375b8bca545fc9b8842b291fb97fde..ad5553c5820c4adfbd25ba30ba54518ce661dd86 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_estate.xml @@ -16,7 +16,7 @@ (bilinmiyor) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Yalnızca aÅŸağıda listelenen sakinlere ve gruplara izin ver" name="estate_restricted_access"/> + <radio_item label="Sadece EriÅŸim sekmesinde listelenen sakinlere ve gruplara izin ver" name="estate_restricted_access"/> <radio_item label="Herkes ziyaret edebilir" name="estate_public_access"/> </radio_group> <check_box label="18 yaşından büyük olmalıdır" name="limit_age_verified" tool_tip="Sakinlerin bu gayrimenkule eriÅŸebilmesi için 18 veya üzeri bir yaÅŸta olmaları gerekir. Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml index ddb4bbf160dffa391566f48b9f5ff99d4e24dfae..d3d3d4e0f5a6132b38256d0b3ffcd955c7213e86 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Nesne Profili"> - <panel.string name="text deed continued">Devret</panel.string> - <panel.string name="text deed">Devret</panel.string> - <panel.string name="text modify info 1">Bu nesneyi deÄŸiÅŸtirebilirsiniz</panel.string> - <panel.string name="text modify info 2">Bu nesneleri deÄŸiÅŸtirebilirsiniz</panel.string> - <panel.string name="text modify info 3">Bu nesneyi deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify info 4">Bu nesneleri deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify info 5">Bir bölge sınırı üzerinden bu nesneyi deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify info 6">Bir bölge sınırı üzerinden bu nesneleri deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify warning">Bu nesne baÄŸlantılı parçalara sahip</panel.string> - <panel.string name="Cost Default">Fiyat: L$</panel.string> - <panel.string name="Cost Total">Toplam Fiyat: L$</panel.string> - <panel.string name="Cost Per Unit">Birim Fiyatı: L$</panel.string> - <panel.string name="Cost Mixed">Karma Fiyat</panel.string> - <panel.string name="Sale Mixed">Karma Satış</panel.string> + <panel.string name="text deed continued"> + Devret + </panel.string> + <panel.string name="text deed"> + Devret + </panel.string> + <panel.string name="text modify info 1"> + Bu nesneyi deÄŸiÅŸtirebilirsiniz + </panel.string> + <panel.string name="text modify info 2"> + Bu nesneleri deÄŸiÅŸtirebilirsiniz + </panel.string> + <panel.string name="text modify info 3"> + Bu nesneyi deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify info 4"> + Bu nesneleri deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify info 5"> + Bir bölge sınırı üzerinden bu nesneyi deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify info 6"> + Bir bölge sınırı üzerinden bu nesneleri deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify warning"> + Bu nesne baÄŸlantılı parçalara sahip + </panel.string> + <panel.string name="Cost Default"> + Fiyat: L$ + </panel.string> + <panel.string name="Cost Total"> + Toplam Fiyat: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Birim Fiyatı: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Karma Fiyat + </panel.string> + <panel.string name="Sale Mixed"> + Karma Satış + </panel.string> <text name="title" value="Nesne Profili"/> <text name="where" value="(SL Dünyası)"/> <panel label="" name="properties_panel"> - <text name="Name:">Ad:</text> - <text name="Description:">Açıklama:</text> - <text name="CreatorNameLabel">OluÅŸturan:</text> - <text name="Owner:">Sahip:</text> - <text name="Group_label">Grup:</text> + <text name="Name:"> + Ad: + </text> + <text name="Description:"> + Açıklama: + </text> + <text name="CreatorNameLabel"> + OluÅŸturan: + </text> + <text name="Owner:"> + Sahip: + </text> + <text name="Group_label"> + Grup: + </text> <button name="button set group" tool_tip="Bu nesnenin izinlerini paylaÅŸmak için bir grup seçin"/> <name_box initial_value="Yükleniyor..." name="Group Name Proxy"/> <button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiÄŸinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/> - <text name="label click action">Åžu eylem için tıklayın:</text> + <text name="label click action"> + Åžu eylem için tıklayın: + </text> <combo_box name="clickaction"> <combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/> <combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="Nesneye ödeme yap" name="Payobject"/> <combo_box.item label="Aç" name="Open"/> <combo_box.item label="YakınlaÅŸtır" name="Zoom"/> + <combo_box.item label="Yok" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Bu nesneyi deÄŸiÅŸtirebilirsiniz</text> - <text name="Anyone can:">Herkes:</text> + <text name="perm_modify"> + Bu nesneyi deÄŸiÅŸtirebilirsiniz + </text> + <text name="Anyone can:"> + Herkes: + </text> <check_box label="Kopyala" name="checkbox allow everyone copy"/> <check_box label="Hareket Et" name="checkbox allow everyone move"/> - <text name="GroupLabel">Grup:</text> + <text name="GroupLabel"> + Grup: + </text> <check_box label="PaylaÅŸ" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için deÄŸiÅŸtirme izinlerinizi paylaÅŸmasına izin verir. Rol kısıtlamalarını etkinleÅŸtirmek için Devretme yapmalısınız."/> - <text name="NextOwnerLabel">Sonraki sahip:</text> + <text name="NextOwnerLabel"> + Sonraki sahip: + </text> <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify"/> <check_box label="Kopyala" name="checkbox next owner can copy"/> <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="Fiyat: L$" name="Edit Cost"/> <check_box label="Aramada göster" name="search_check" tool_tip="KiÅŸiler arama sonuçlarında bu nesneyi görebilsin"/> - <text name="pathfinding_attributes_label">Yol bulma özellikleri:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Yol bulma özellikleri: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="Aç" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 16bad98bc49e62f99c19beb564e23a0d6916e1cc..db627f1bc1fb80f7c486263b3d4a6c447a23738f 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -2238,6 +2238,18 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin <string name="RegionInfoListTypeBannedAgents"> Her zaman engellenen </string> + <string name="RegionInfoAllEstates"> + tüm gayrimenkuller + </string> + <string name="RegionInfoManagedEstates"> + yönetilen gayrimenkuller + </string> + <string name="RegionInfoThisEstate"> + bu gayrimenkul + </string> + <string name="AndNMore"> + ve [EXTRA_COUNT] tane daha + </string> <string name="ScriptLimitsParcelScriptMemory"> Parsel Komut Dosyası BelleÄŸi </string> diff --git a/indra/newview/skins/default/xui/zh/floater_auction.xml b/indra/newview/skins/default/xui/zh/floater_auction.xml index 1b589a92ccf7327daf5b787bfbebf9bfef295009..0ab94160c25273338fd47534ae2caa9de8224488 100644 --- a/indra/newview/skins/default/xui/zh/floater_auction.xml +++ b/indra/newview/skins/default/xui/zh/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="開始 Linden 土地出售"> +<floater name="floater_auction" title="開始Linden土地出售"> <floater.string name="already for sale"> 出售ä¸çš„地段無法進行æ‹è³£ã€‚ </floater.string> diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml index f51f7a8ae2835dbf1763f9c83b9da65d669068bd..2df01eb831defd6db25c3be0c0d054807619cb07 100644 --- a/indra/newview/skins/default/xui/zh/floater_tools.xml +++ b/indra/newview/skins/default/xui/zh/floater_tools.xml @@ -201,6 +201,7 @@ <combo_box.item label="支付物件" name="Payobject"/> <combo_box.item label="打開" name="Open"/> <combo_box.item label="縮放" name="Zoom"/> + <combo_box.item label="ç„¡" name="None"/> </combo_box> <check_box label="出售ä¸ï¼š" name="checkbox for sale"/> <spinner label="L$" name="Edit Cost"/> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index 39d4a7c4f7933cf3252c8f9464304cb11f79a738..9f8756a2995773e3519edb80914f9eae43edfa7a 100644 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -12,6 +12,7 @@ <menu_item_call label="æ”影機控制…" name="Camera Controls"/> <menu label="動作" name="Movement"> <menu_item_call label="å下" name="Sit Down Here"/> + <menu_item_call label="èµ·ç«‹" name="Stand up"/> <menu_item_check label="飛行" name="Fly"/> <menu_item_check label="以跑代æ¥" name="Always Run"/> <menu_item_call label="åœæ¢æˆ‘身上的動作" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index b1b35f0614da5f8a6e61072e2963863d1f5f174e..a8903489a7dbbf5f1657e6c1e2373200f611af19 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -1563,6 +1563,30 @@ SHA1 指紋:[MD5_DIGEST] <notification name="ProblemAddingEstateManagerBanned"> 無法把被å°éŽ–çš„å±…æ°‘åŠ å…¥é ˜åœ°çš„ç®¡ç†äººå單。 </notification> + <notification name="ProblemBanningEstateManager"> + ç„¡æ³•å°‡é ˜åœ°ç®¡ç†äºº[AGENT]åŠ å…¥å°éŽ–å單。 + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink>已在ç²å‡†ç¾¤çµ„åå–®ä¸ã€‚ + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT]å·²åœ¨ä½ çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT]å·²åœ¨ä½ çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentWasAddedToList"> + [AGENT]已新增到[ESTATE]çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT]已新增到[ESTATE]çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT]已從[ESTATE]çš„[LIST_TYPE]åå–®ä¸è¢«ç§»é™¤ã€‚ + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT]已從[ESTATE]çš„[LIST_TYPE]åå–®ä¸è¢«ç§»é™¤ã€‚ + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> 無法變更外觀,直到æœè£èˆ‡é«”形下載完畢。 </notification> @@ -3162,14 +3186,20 @@ SHA1 指紋:[MD5_DIGEST] <notification name="VoiceEffectsExpired"> è‡³å°‘ä¸€å€‹ä½ è¨‚ç”¨çš„è®Šè²æ•ˆæžœå·²ç¶“éŽæœŸã€‚ [[URL] 點按這裡] 繼續訂用。 + +付費用戶請[[PREMIUM_URL] 點按這裡]é ˜å–å…費變è²å·¥å…·ã€‚ </notification> <notification name="VoiceEffectsExpiredInUse"> 使用ä¸çš„變è²æ•ˆæžœå·²ç¶“éŽæœŸï¼Œå·²ç”¨ä½ 平時的è²éŸ³è¨å®šå–代。 -[[URL] 點按這裡] 繼續訂用。 +[[URL] 點按這裡]繼續訂用。 + +付費用戶請[[PREMIUM_URL] 點按這裡]é ˜å–å…費變è²å·¥å…·ã€‚ </notification> <notification name="VoiceEffectsWillExpire"> è‡³å°‘ä¸€å€‹ä½ è¨‚ç”¨çš„è®Šè²æ•ˆæžœå°‡åœ¨ [INTERVAL] 天後到期。 -[[URL] 點按這裡] 繼續訂用。 +[[URL] 點按這裡]繼續訂用。 + +付費用戶請[[PREMIUM_URL] 點按這裡]é ˜å–å…費變è²å·¥å…·ã€‚ </notification> <notification name="VoiceEffectsNew"> 新的變è²æ•ˆæžœä¸Šå¸‚äº†ï¼ @@ -3221,6 +3251,9 @@ SHA1 指紋:[MD5_DIGEST] <notification name="SnapshotToComputerFailed"> 將快照儲å˜æ–¼[PATH]時失敗:ç£ç¢Ÿå·²æ»¿ã€‚ 需è¦[NEED_MEMORY]KB的空間,但åªå‰©[FREE_MEMORY]KB空間。 </notification> + <notification name="SnapshotToLocalDirNotExist"> + 將快照儲å˜æ–¼[PATH]時失敗:目錄ä¸å˜åœ¨ã€‚ + </notification> <notification name="PresetNotSaved"> 儲å˜é è¨å稱[NAME]時出錯。 </notification> diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml index 5292e5fc38ff3317740a528c50e97a99bbe6ee5a..59618972af1b83953a37b85ab57fc2221870aaa3 100644 --- a/indra/newview/skins/default/xui/zh/panel_login.xml +++ b/indra/newview/skins/default/xui/zh/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="使用者å稱" name="username_combo" tool_tip="使用者åç¨±æ˜¯ä½ è¨»å†Šæ™‚æ‰€æŒ‘é¸çš„,例如 bobsmith12 或 Steller Sunshine"/> @@ -11,8 +16,13 @@ </combo_box> <button label="登入" name="connect_btn"/> <check_box label="記得我" name="remember_check"/> - <text name="forgot_password_text">忘記密碼</text> + <text name="forgot_password_text"> + 忘記密碼 + </text> <combo_box label="é¸æ“‡æ¨¡æ“¬ä¸–ç•Œ" name="server_combo"/> + <text name="sign_up_text"> + 註冊 + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_login_first.xml b/indra/newview/skins/default/xui/zh/panel_login_first.xml index a8af615b7cd46fb3053c93693beb99838983d4c5..4d72fcdd0354b1882bafc54ac0bd4294f862762d 100644 --- a/indra/newview/skins/default/xui/zh/panel_login_first.xml +++ b/indra/newview/skins/default/xui/zh/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> + <panel.string name="sign_up_url"> + http://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> 忘記密碼 </text> + <text name="sign_up_text"> + 註冊 + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_access.xml b/indra/newview/skins/default/xui/zh/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..7842d26321886101d324ecf2ba8da1ad46bb6279 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="出入許å¯" name="Access"> + <tab_container name="tabs"> + <panel label="é ˜åœ°ç®¡ç†å“¡" name="estate_managers_panel"> + <text name="estate_manager_label"> + é ˜åœ°ç®¡ç†å“¡ï¼š + </text> + <name_list name="estate_manager_name_list"> + <columns label="å稱" name="name"/> + </name_list> + <button label="新增…" name="add_estate_manager_btn"/> + <button label="移除…" name="remove_estate_manager_btn"/> + </panel> + <panel label="ç²å‡†" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="æœå°‹ç²å‡†çš„用戶" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + æ°¸é 准許: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="å稱" name="name"/> + </name_list> + <button label="新增…" name="add_allowed_avatar_btn"/> + <button label="移除…" name="remove_allowed_avatar_btn"/> + </panel> + <panel label="准許的群組" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="æœå°‹ç²å‡†çš„群組" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + æ°¸é 准許的群組: + </text> + <name_list name="allowed_group_name_list"> + <columns label="å稱" name="name"/> + </name_list> + <button label="新增…" name="add_allowed_group_btn"/> + <button label="移除…" name="remove_allowed_group_btn"/> + </panel> + <panel label="ç¦å…¥çš„" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="æœå°‹ç¦å…¥çš„用戶" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + æ°¸é ç¦å…¥ï¼š + </text> + <name_list name="banned_avatar_name_list"> + <columns label="å稱" name="name"/> + <columns label="上次登入日期" name="last_login_date"/> + <columns label="éç¦æ—¥æœŸ" name="ban_date"/> + <columns label="å°éŽ–者:" name="bannedby"/> + </name_list> + <button label="新增…" name="add_banned_avatar_btn"/> + <button label="移除…" name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_estate.xml b/indra/newview/skins/default/xui/zh/panel_region_estate.xml index 4be4f0aac14e272f00cf636975139e9faf27b3f3..b25f6975c93f698a138728a3aed5a2446540cdb9 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_estate.xml @@ -16,7 +16,7 @@ (未知) </text> <radio_group name="externally_visible_radio"> - <radio_item label="åªå…許下列的居民和群組" name="estate_restricted_access"/> + <radio_item label="åªå…許å列於「准入ã€é 籤的居民和群組" name="estate_restricted_access"/> <radio_item label="任何人都å¯é€ 訪" name="estate_public_access"/> </radio_group> <check_box label="å¿…é ˆæ»¿18æ²" name="limit_age_verified" tool_tip="å±…æ°‘å¿…é ˆå¹´æ»¿ 18 æ²æ‰èƒ½é€²å…¥é€™é ˜åœ°ã€‚ åƒé–± [SUPPORT_SITE] ç²å–進一æ¥è³‡è¨Šã€‚"/> @@ -29,22 +29,22 @@ é ˜åœ°ç®¡ç†å“¡ï¼š </text> <text name="allow_resident_label"> - æ°¸é 准許: + æ°¸é å…許: </text> - <button label="新增…" name="add_estate_manager_btn"/> - <button label="移除…" name="remove_estate_manager_btn"/> - <button label="新增…" name="add_allowed_avatar_btn"/> - <button label="移除…" name="remove_allowed_avatar_btn"/> + <button label="æ·»åŠ ..." name="add_estate_manager_btn"/> + <button label="移除..." name="remove_estate_manager_btn"/> + <button label="æ·»åŠ ..." name="add_allowed_avatar_btn"/> + <button label="移除..." name="remove_allowed_avatar_btn"/> <text name="allow_group_label"> - æ°¸é 准許的群組: + æ°¸é å…許的群組: </text> <text name="ban_resident_label"> - æ°¸é ç¦å…¥ï¼š + æ°¸é å°éŽ–: </text> - <button label="新增…" name="add_allowed_group_btn"/> - <button label="移除…" name="remove_allowed_group_btn"/> - <button label="新增…" name="add_banned_avatar_btn"/> - <button label="移除…" name="remove_banned_avatar_btn"/> + <button label="æ·»åŠ ..." name="add_allowed_group_btn"/> + <button label="移除..." name="remove_allowed_group_btn"/> + <button label="æ·»åŠ ..." name="add_banned_avatar_btn"/> + <button label="移除..." name="remove_banned_avatar_btn"/> <button label="é€å‡ºè¨Šæ¯åˆ°é ˜åœ°..." name="message_estate_btn"/> <button label="ç”±é ˜åœ°å°‡å±…æ°‘è¸¢å‡º..." name="kick_user_from_estate_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml index 0884f1789b0daaa91581ab743c1a56c26b531d1c..8cb2721fcefd530402cf7f1f8e5bf23523d72f80 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml @@ -1,31 +1,71 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="物件檔案"> - <panel.string name="text deed continued">讓渡</panel.string> - <panel.string name="text deed">讓渡</panel.string> - <panel.string name="text modify info 1">ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶</panel.string> - <panel.string name="text modify info 2">ä½ èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶</panel.string> - <panel.string name="text modify info 3">ä½ ä¸èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶</panel.string> - <panel.string name="text modify info 4">ä½ ä¸èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶</panel.string> - <panel.string name="text modify info 5">無法跨地å€ä¿®æ”¹é€™å€‹ç‰©ä»¶</panel.string> - <panel.string name="text modify info 6">無法跨地å€ä¿®æ”¹é€™äº›ç‰©ä»¶</panel.string> - <panel.string name="text modify warning">這個物件å«æœ‰è¯çµçš„部分</panel.string> - <panel.string name="Cost Default">åƒ¹æ ¼ï¼š L$</panel.string> - <panel.string name="Cost Total">ç¸½åƒ¹æ ¼ï¼šL$</panel.string> - <panel.string name="Cost Per Unit">單價:L$</panel.string> - <panel.string name="Cost Mixed">æ··åˆåƒ¹æ ¼</panel.string> - <panel.string name="Sale Mixed">æ··åˆéŠ·å”®</panel.string> + <panel.string name="text deed continued"> + 讓渡 + </panel.string> + <panel.string name="text deed"> + 讓渡 + </panel.string> + <panel.string name="text modify info 1"> + ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 2"> + ä½ èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 3"> + ä½ ä¸èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 4"> + ä½ ä¸èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 5"> + 無法跨地å€ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 6"> + 無法跨地å€ä¿®æ”¹é€™äº›ç‰©ä»¶ + </panel.string> + <panel.string name="text modify warning"> + 這個物件å«æœ‰è¯çµçš„部分 + </panel.string> + <panel.string name="Cost Default"> + åƒ¹æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Total"> + ç¸½åƒ¹æ ¼ï¼šL$ + </panel.string> + <panel.string name="Cost Per Unit"> + 單價:L$ + </panel.string> + <panel.string name="Cost Mixed"> + æ··åˆåƒ¹æ ¼ + </panel.string> + <panel.string name="Sale Mixed"> + æ··åˆéŠ·å”® + </panel.string> <text name="title" value="物件檔案"/> <text name="where" value="(在虛擬世界)"/> <panel label="" name="properties_panel"> - <text name="Name:">å稱:</text> - <text name="Description:">æ述:</text> - <text name="CreatorNameLabel">å‰µé€ è€…ï¼š</text> - <text name="Owner:">所有人:</text> - <text name="Group_label">群組:</text> + <text name="Name:"> + å稱: + </text> + <text name="Description:"> + æ述: + </text> + <text name="CreatorNameLabel"> + å‰µé€ è€…ï¼š + </text> + <text name="Owner:"> + 所有人: + </text> + <text name="Group_label"> + 群組: + </text> <button name="button set group" tool_tip="é¸æ“‡ä¸€å€‹ç¾¤çµ„以分享這物件的權é™"/> <name_box initial_value="載入ä¸..." name="Group Name Proxy"/> <button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="「讓渡ã€æœƒæŠŠé€™ç‰©ä»¶è´ˆé€å‡ºåŽ»ä¸¦è³¦äºˆã€Œä¸‹ä¸€å€‹æ‰€æœ‰äººã€æ¬Šé™ã€‚ 群組所分享的物件å¯ç”±ç¾¤çµ„è·å“¡åŠ 以讓渡。"/> - <text name="label click action">點按以:</text> + <text name="label click action"> + 點按以: + </text> <combo_box name="clickaction"> <combo_box.item label="觸碰(é è¨ï¼‰" name="Touch/grab(default)"/> <combo_box.item label="å在物件上" name="Sitonobject"/> @@ -33,15 +73,24 @@ <combo_box.item label="支付物件" name="Payobject"/> <combo_box.item label="打開" name="Open"/> <combo_box.item label="縮放" name="Zoom"/> + <combo_box.item label="ç„¡" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶</text> - <text name="Anyone can:">任何人:</text> + <text name="perm_modify"> + ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </text> + <text name="Anyone can:"> + 任何人: + </text> <check_box label="æšåº¨" name="checkbox allow everyone copy"/> <check_box label="移動" name="checkbox allow everyone move"/> - <text name="GroupLabel">群組:</text> + <text name="GroupLabel"> + 群組: + </text> <check_box label="分享" name="checkbox share with group" tool_tip="å…許æ¤ç¾¤çµ„所有æˆå“¡å…±äº«ä½ 修改æ¤ç‰©ä»¶çš„權é™ã€‚ ä½ å¿…é ˆè®“æ¸¡æ‰èƒ½å•Ÿå‹•è§’色é™åˆ¶ã€‚"/> - <text name="NextOwnerLabel">下一個所有人:</text> + <text name="NextOwnerLabel"> + 下一個所有人: + </text> <check_box label="修改" name="checkbox next owner can modify"/> <check_box label="æšåº¨" name="checkbox next owner can copy"/> <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件"/> @@ -54,13 +103,27 @@ </combo_box> <spinner label="åƒ¹æ ¼ï¼š L$" name="Edit Cost"/> <check_box label="顯示在æœå°‹ä¸" name="search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸å¯Ÿçœ‹åˆ°æ¤ç‰©ä»¶"/> - <text name="pathfinding_attributes_label">尋徑屬性:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + 尋徑屬性: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> <button label="打開" name="open_btn"/> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index 57da57a82c1cda2c43c1fd59e63125f91e6951be..1518c6edf5b875f069dc600a2470e70ce5060fb9 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -2234,6 +2234,18 @@ http://secondlife.com/support 求助解決å•é¡Œã€‚ <string name="RegionInfoListTypeBannedAgents"> æ°¸é å°éŽ– </string> + <string name="RegionInfoAllEstates"> + å…¨éƒ¨é ˜åœ° + </string> + <string name="RegionInfoManagedEstates"> + å—ç®¡é ˜åœ° + </string> + <string name="RegionInfoThisEstate"> + é€™å€‹é ˜åœ° + </string> + <string name="AndNMore"> + åŠå…¶ä»–[EXTRA_COUNT]個 + </string> <string name="ScriptLimitsParcelScriptMemory"> 地段腳本記憶體 </string>