diff options
author | Leyla Farazha <leyla@lindenlab.com> | 2010-04-08 16:22:19 -0700 |
---|---|---|
committer | Leyla Farazha <leyla@lindenlab.com> | 2010-04-08 16:22:19 -0700 |
commit | 571ee16a1ff240873b602c6d01a1e3dbd17f2bc2 (patch) | |
tree | d014842034007f3e6891632e1e720f419c6635b2 /indra | |
parent | 1c4b6085064a623268919ed5c56f052f52110b41 (diff) | |
parent | 3ff6c576211a10902bd02085c11fdb448ba9181f (diff) |
Merge
Diffstat (limited to 'indra')
35 files changed, 226 insertions, 126 deletions
diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp index 85b1e70d78..da770c5f2e 100644 --- a/indra/llplugin/llplugincookiestore.cpp +++ b/indra/llplugin/llplugincookiestore.cpp @@ -99,7 +99,7 @@ bool LLPluginCookieStore::Cookie::parse(const std::string &host) std::string::size_type cookie_end = mCookie.size(); std::string::size_type field_start = 0; - lldebugs << "parsing cookie: " << mCookie << llendl; + LL_DEBUGS("CookieStoreParse") << "parsing cookie: " << mCookie << LL_ENDL; while(field_start < cookie_end) { // Finding the start of the next field requires honoring special quoting rules @@ -167,10 +167,10 @@ bool LLPluginCookieStore::Cookie::parse(const std::string &host) ++value_end; } - lldebugs + LL_DEBUGS("CookieStoreParse") << " field name: \"" << mCookie.substr(name_start, name_end - name_start) << "\", value: \"" << mCookie.substr(value_start, value_end - value_start) << "\"" - << llendl; + << LL_ENDL; // See whether this field is one we know if(first_field) @@ -195,13 +195,13 @@ bool LLPluginCookieStore::Cookie::parse(const std::string &host) #if 1 time_t date = curl_getdate(date_string.c_str(), NULL ); mDate.secondsSinceEpoch((F64)date); - lldebugs << " expire date parsed to: " << mDate.asRFC1123() << llendl; + LL_DEBUGS("CookieStoreParse") << " expire date parsed to: " << mDate.asRFC1123() << LL_ENDL; #else // This doesn't work (rfc1123-format dates cause it to fail) if(!mDate.fromString(date_string)) { // Date failed to parse. - llwarns << "failed to parse cookie's expire date: " << date << llendl; + LL_WARNS("CookieStoreParse") << "failed to parse cookie's expire date: " << date << LL_ENDL; return false; } #endif @@ -232,9 +232,14 @@ bool LLPluginCookieStore::Cookie::parse(const std::string &host) { // We don't care about the value of this field (yet) } + else if(matchName(name_start, name_end, "httponly")) + { + // We don't care about the value of this field (yet) + } else { // An unknown field is a parse failure + LL_WARNS("CookieStoreParse") << "unexpected field name: " << mCookie.substr(name_start, name_end - name_start) << LL_ENDL; return false; } @@ -270,7 +275,7 @@ bool LLPluginCookieStore::Cookie::parse(const std::string &host) mCookie += host; mDomainEnd = mCookie.size(); - lldebugs << "added domain (" << mDomainStart << " to " << mDomainEnd << "), new cookie is: " << mCookie << llendl; + LL_DEBUGS("CookieStoreParse") << "added domain (" << mDomainStart << " to " << mDomainEnd << "), new cookie is: " << mCookie << LL_ENDL; } // If the cookie doesn't have a path, add "/". @@ -288,7 +293,7 @@ bool LLPluginCookieStore::Cookie::parse(const std::string &host) mCookie += "/"; mPathEnd = mCookie.size(); - lldebugs << "added path (" << mPathStart << " to " << mPathEnd << "), new cookie is: " << mCookie << llendl; + LL_DEBUGS("CookieStoreParse") << "added path (" << mPathStart << " to " << mPathEnd << "), new cookie is: " << mCookie << LL_ENDL; } @@ -566,7 +571,7 @@ void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_t Cookie *cookie = Cookie::createFromString(s, cookie_start, cookie_end, host); if(cookie) { - lldebugs << "setting cookie: " << cookie->getCookie() << llendl; + LL_DEBUGS("CookieStoreUpdate") << "setting cookie: " << cookie->getCookie() << LL_ENDL; // Create a key for this cookie std::string key = cookie->getKey(); @@ -579,7 +584,7 @@ void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_t { // If we're marking cookies as changed, we should keep it anyway since we'll need to send it out with deltas. cookie->setDead(true); - lldebugs << " marking dead" << llendl; + LL_DEBUGS("CookieStoreUpdate") << " marking dead" << LL_ENDL; } else { @@ -590,7 +595,7 @@ void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_t delete cookie; cookie = NULL; - lldebugs << " removing" << llendl; + LL_DEBUGS("CookieStoreUpdate") << " removing" << LL_ENDL; } } @@ -607,7 +612,7 @@ void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_t delete cookie; cookie = NULL; - lldebugs << " unchanged" << llendl; + LL_DEBUGS("CookieStoreUpdate") << " unchanged" << LL_ENDL; } else { @@ -619,7 +624,7 @@ void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_t if(mark_changed) mHasChangedCookies = true; - lldebugs << " replacing" << llendl; + LL_DEBUGS("CookieStoreUpdate") << " replacing" << LL_ENDL; } } else @@ -631,10 +636,15 @@ void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_t if(mark_changed) mHasChangedCookies = true; - lldebugs << " adding" << llendl; + LL_DEBUGS("CookieStoreUpdate") << " adding" << LL_ENDL; } } } + else + { + LL_WARNS("CookieStoreUpdate") << "failed to parse cookie: " << s.substr(cookie_start, cookie_end - cookie_start) << LL_ENDL; + } + } void LLPluginCookieStore::clearCookies() diff --git a/indra/llplugin/tests/llplugincookiestore_test.cpp b/indra/llplugin/tests/llplugincookiestore_test.cpp index 020d9c1977..c903464c64 100644 --- a/indra/llplugin/tests/llplugincookiestore_test.cpp +++ b/indra/llplugin/tests/llplugincookiestore_test.cpp @@ -127,7 +127,7 @@ namespace tut // Valid, distinct cookies: std::string cookie01 = "cookieA=value; domain=example.com; path=/"; - std::string cookie02 = "cookieB=value; domain=example.com; path=/"; // different name + std::string cookie02 = "cookieB=value; Domain=example.com; Path=/; Max-Age=10; Secure; Version=1; Comment=foo!; HTTPOnly"; // cookie with every supported field, in different cases. std::string cookie03 = "cookieA=value; domain=foo.example.com; path=/"; // different domain std::string cookie04 = "cookieA=value; domain=example.com; path=/bar/"; // different path std::string cookie05 = "cookieC; domain=example.com; path=/"; // empty value diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 0959722aa6..dfb427f293 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -860,5 +860,16 @@ void LLAccordionCtrlTab::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, panel->reshape( width, height, 1); panel->setRect(panel_rect); } +BOOL LLAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask) +{ + //header may be not the first child but we need to process it first + if(y >= (getRect().getHeight() - HEADER_HEIGHT - HEADER_HEIGHT/2) ) + { + //inside tab header + //fix for EXT-6619 + return TRUE; + } + return LLUICtrl::handleToolTip(x, y, mask); +} diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index 4b8b22405e..fb19d17e99 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -148,6 +148,8 @@ public: virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); + virtual bool addChild(LLView* child, S32 tab_group); bool isExpanded() { return mDisplayChildren; } diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index af5fa4f388..3ce32a05b0 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -22,17 +22,6 @@ <key>Value</key> <string>|TOKEN COPY BusyModeResponse|</string> </map> - <key>InstantMessageLogFolder</key> - <map> - <key>Comment</key> - <string>Top level folder to your log files.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string /> - </map> <key>InstantMessageLogPath</key> <map> <key>Comment</key> @@ -55,10 +44,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>LogChat</key> + <key>LogNearbyChat</key> <map> <key>Comment</key> - <string>Log Chat</string> + <string>Log Nearby Chat messages to a file. Is used instead of LogChat but with the "1" default value.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -110,5 +99,46 @@ <key>Value</key> <integer>1</integer> </map> + + <!-- Settings below are for back compatibility only. + They are not used in current viewer anymore. But they can't be removed to avoid + influence on previous versions of the viewer in case of settings are not used or default value + should be changed. See EXT-6661. --> + + <!-- 1.23 settings --> + <key>LogChat</key> + <map> + <key>Comment</key> + <string>Log Chat</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>LogChatIM</key> + <map> + <key>Comment</key> + <string>Log Incoming Instant Messages with Chat</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>LogChatTimestamp</key> + <map> + <key>Comment</key> + <string>Log Timestamp of Chat</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <!-- End of back compatibility settings --> </map> </llsd> diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index 44f1cefafe..bed5c01d7a 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -133,7 +133,7 @@ LLCallFloater::~LLCallFloater() if(LLVoiceClient::instanceExists()) { - gVoiceClient->removeObserver(this); + LLVoiceClient::instance().removeObserver(this); } LLTransientFloaterMgr::getInstance()->removeControlView(this); } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 60ce16aafb..e2c5ad6d02 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1083,10 +1083,8 @@ void LLFloaterPreference::onClickLogPath() { return; //Canceled! } - std::string chat_log_dir = picker.getDirName(); - std::string chat_log_top_folder= gDirUtilp->getBaseFileName(chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogPath",chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder); + + gSavedPerAccountSettings.setString("InstantMessageLogPath", picker.getDirName()); } void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email) diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index d4eecc8c48..438159b2e6 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -75,12 +75,13 @@ public: return false; } - //*TODO by what to replace showing groups floater? if (tokens[0].asString() == "list") { if (tokens[1].asString() == "show") { - //LLFloaterReg::showInstance("contacts", "groups"); + LLSD params; + params["people_panel_tab_name"] = "groups_panel"; + LLSideTray::getInstance()->showPanel("panel_people", params); return true; } return false; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index c8d5d782b7..5d72827a7a 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -207,7 +207,7 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args) return; } - if (gSavedPerAccountSettings.getBOOL("LogChat")) + if (gSavedPerAccountSettings.getBOOL("LogNearbyChat")) { LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText); } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 8d8c996374..a1cdbdad59 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -280,6 +280,17 @@ void LLLandmarksPanel::onShowOnMap() doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1)); } +//virtual +void LLLandmarksPanel::onShowProfile() +{ + LLFolderViewItem* cur_item = getCurSelectedItem(); + + if(!cur_item) + return; + + cur_item->getListener()->performAction(mCurrentSelectedList->getModel(),"about"); +} + // virtual void LLLandmarksPanel::onTeleport() { @@ -306,6 +317,7 @@ void LLLandmarksPanel::updateVerbs() bool landmark_selected = isLandmarkSelected(); mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport")); mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map")); + mShowProfile->setEnabled(landmark_selected && isActionEnabled("more_info")); // TODO: mantipov: Uncomment when mShareBtn is supported // Share button should be enabled when neither a folder nor a landmark is selected @@ -977,13 +989,10 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const void LLLandmarksPanel::onCustomAction(const LLSD& userdata) { - LLFolderViewItem* cur_item = getCurSelectedItem(); - if(!cur_item) - return; std::string command_name = userdata.asString(); if("more_info" == command_name) { - cur_item->getListener()->performAction(mCurrentSelectedList->getModel(),"about"); + onShowProfile(); } else if ("teleport" == command_name) { diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index c9217a4b2f..da5d683cfc 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -57,6 +57,7 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void onSearchEdit(const std::string& string); /*virtual*/ void onShowOnMap(); + /*virtual*/ void onShowProfile(); /*virtual*/ void onTeleport(); /*virtual*/ void updateVerbs(); diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 54455afa4f..17784c31e3 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -252,6 +252,9 @@ BOOL LLPanelPlaces::postBuild() mOverflowBtn = getChild<LLButton>("overflow_btn"); mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this)); + mPlaceInfoBtn = getChild<LLButton>("profile_btn"); + mPlaceInfoBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onProfileButtonClicked, this)); + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("Places.OverflowMenu.Action", boost::bind(&LLPanelPlaces::onOverflowMenuItemClicked, this, _2)); LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; @@ -745,6 +748,14 @@ void LLPanelPlaces::onOverflowButtonClicked() LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop); } +void LLPanelPlaces::onProfileButtonClicked() +{ + if (!mActivePanel) + return; + + mActivePanel->onShowProfile(); +} + bool LLPanelPlaces::onOverflowMenuItemEnable(const LLSD& param) { std::string value = param.asString(); @@ -1060,8 +1071,11 @@ void LLPanelPlaces::updateVerbs() mSaveBtn->setVisible(isLandmarkEditModeOn); mCancelBtn->setVisible(isLandmarkEditModeOn); mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); + mPlaceInfoBtn->setVisible(mPlaceInfoType != LANDMARK_INFO_TYPE && mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE + && !is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); + mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); if (is_place_info_visible) { diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 97cf43d222..7a77fc9300 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -98,6 +98,7 @@ private: bool onOverflowMenuItemEnable(const LLSD& param); void onCreateLandmarkButtonClicked(const LLUUID& folder_id); void onBackButtonClicked(); + void onProfileButtonClicked(); void toggleMediaPanel(); void togglePickPanel(BOOL visible); @@ -128,6 +129,7 @@ private: LLButton* mCancelBtn; LLButton* mCloseBtn; LLButton* mOverflowBtn; + LLButton* mPlaceInfoBtn; LLPlacesInventoryObserver* mInventoryObserver; LLPlacesParcelObserver* mParcelObserver; diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp index 9806b8c64d..42cf3b03a3 100644 --- a/indra/newview/llpanelplacestab.cpp +++ b/indra/newview/llpanelplacestab.cpp @@ -56,6 +56,7 @@ void LLPanelPlacesTab::setPanelPlacesButtons(LLPanelPlaces* panel) { mTeleportBtn = panel->getChild<LLButton>("teleport_btn"); mShowOnMapBtn = panel->getChild<LLButton>("map_btn"); + mShowProfile = panel->getChild<LLButton>("profile_btn"); } void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos, diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h index ce77a42259..f4e93a7658 100644 --- a/indra/newview/llpanelplacestab.h +++ b/indra/newview/llpanelplacestab.h @@ -45,6 +45,7 @@ public: virtual void onSearchEdit(const std::string& string) = 0; virtual void updateVerbs() = 0; // Updates buttons at the bottom of Places panel virtual void onShowOnMap() = 0; + virtual void onShowProfile() = 0; virtual void onTeleport() = 0; bool isTabVisible(); // Check if parent TabContainer is visible. @@ -62,6 +63,7 @@ public: protected: LLButton* mTeleportBtn; LLButton* mShowOnMapBtn; + LLButton* mShowProfile; // Search string for filtering landmarks and teleport history locations static std::string sFilterSubString; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 0a34531eee..c0b2244038 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -496,6 +496,20 @@ void LLTeleportHistoryPanel::onShowOnMap() } } +//virtual +void LLTeleportHistoryPanel::onShowProfile() +{ + if (!mLastSelectedFlatlList) + return; + + LLTeleportHistoryFlatItem* itemp = dynamic_cast<LLTeleportHistoryFlatItem *> (mLastSelectedFlatlList->getSelectedItem()); + + if(!itemp) + return; + + LLTeleportHistoryFlatItem::showPlaceInfoPanel(itemp->getIndex()); +} + // virtual void LLTeleportHistoryPanel::onTeleport() { @@ -544,6 +558,7 @@ void LLTeleportHistoryPanel::updateVerbs() { mTeleportBtn->setEnabled(false); mShowOnMapBtn->setEnabled(false); + mShowProfile->setEnabled(false); return; } @@ -551,6 +566,7 @@ void LLTeleportHistoryPanel::updateVerbs() mTeleportBtn->setEnabled(NULL != itemp); mShowOnMapBtn->setEnabled(NULL != itemp); + mShowProfile->setEnabled(NULL != itemp); } void LLTeleportHistoryPanel::getNextTab(const LLDate& item_date, S32& tab_idx, LLDate& tab_date) diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index 5e2ccc0c93..a456ca506f 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -73,6 +73,7 @@ public: /*virtual*/ void onSearchEdit(const std::string& string); /*virtual*/ void onShowOnMap(); + /*virtual*/ void onShowProfile(); /*virtual*/ void onTeleport(); ///*virtual*/ void onCopySLURL(); /*virtual*/ void updateVerbs(); diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index b010f4d72f..7cde350d5a 100644 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -104,8 +104,13 @@ BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func S32 x, S32 y, bool close_popups) { - for (popup_list_t::iterator popup_it = mPopups.begin(); - popup_it != mPopups.end();) + BOOL handled = FALSE; + + // make a copy of list of popups, in case list is modified during mouse event handling + popup_list_t popups(mPopups); + for (popup_list_t::iterator popup_it = popups.begin(), popup_end = popups.end(); + popup_it != popup_end; + ++popup_it) { LLView* popup = popup_it->get(); if (!popup @@ -121,23 +126,19 @@ BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func { if (func(popup, popup_x, popup_y)) { - return TRUE; + handled = TRUE; + break; } } if (close_popups) { - popup_list_t::iterator cur_popup_it = popup_it++; - mPopups.erase(cur_popup_it); + mPopups.remove(*popup_it); popup->onTopLost(); } - else - { - ++popup_it; - } } - return FALSE; + return handled; } diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index e9a80907b7..af440a3689 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -47,7 +47,6 @@ #include "llsyswellwindow.h" #include "llimfloater.h" #include "llscriptfloater.h" -#include "llfontgl.h" #include <algorithm> @@ -582,7 +581,6 @@ void LLScreenChannel::showToastsTop() void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) { LLRect toast_rect; - LLRect tbox_rect; LLToast::Params p; p.lifetime_secs = timer; p.enable_hide_btn = false; @@ -593,34 +591,26 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this)); + LLPanel* wrapper_panel = mStartUpToastPanel->getChild<LLPanel>("wrapper_panel"); LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text"); std::string text = LLTrans::getString("StartUpNotifications"); - tbox_rect = text_box->getRect(); - S32 tbox_width = tbox_rect.getWidth(); - S32 tbox_vpad = text_box->getVPad(); - S32 text_width = text_box->getDefaultFont()->getWidth(text); - S32 text_height = text_box->getTextPixelHeight(); - - // EXT - 3703 (Startup toast message doesn't fit toast width) - // Calculating TextBox HEIGHT needed to include the whole string according to the given WIDTH of the TextBox. - S32 new_tbox_height = (text_width/tbox_width + 1) * text_height; - // Calculating TOP position of TextBox - S32 new_tbox_top = new_tbox_height + tbox_vpad + gSavedSettings.getS32("ToastGap"); - // Calculating toast HEIGHT according to the new TextBox size - S32 toast_height = new_tbox_height + tbox_vpad * 2; - - tbox_rect.setLeftTopAndSize(tbox_rect.mLeft, new_tbox_top, tbox_rect.getWidth(), new_tbox_height); - text_box->setRect(tbox_rect); - toast_rect = mStartUpToastPanel->getRect(); mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true); - toast_rect.setLeftTopAndSize(0, toast_height + gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_height); - mStartUpToastPanel->setRect(toast_rect); text_box->setValue(text); text_box->setVisible(TRUE); + + S32 old_height = text_box->getRect().getHeight(); + text_box->reshapeToFitText(); + text_box->setOrigin(text_box->getRect().mLeft, (wrapper_panel->getRect().getHeight() - text_box->getRect().getHeight())/2); + S32 new_height = text_box->getRect().getHeight(); + S32 height_delta = new_height - old_height; + + toast_rect.setLeftTopAndSize(0, toast_rect.getHeight() + height_delta +gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight()); + mStartUpToastPanel->setRect(toast_rect); + addChild(mStartUpToastPanel); mStartUpToastPanel->setVisible(TRUE); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 94a32873ec..c7eb9320e4 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -889,13 +889,12 @@ bool idle_startup() } //Default the path if one isn't set. - if (gSavedPerAccountSettings.getString("InstantMessageLogFolder").empty()) + // *NOTE: unable to check variable differ from "InstantMessageLogPath" because it was + // provided in pre 2.0 viewer. See EXT-6661 + if (gSavedPerAccountSettings.getString("InstantMessageLogPath").empty()) { gDirUtilp->setChatLogsDir(gDirUtilp->getOSUserAppDir()); - std::string chat_log_dir = gDirUtilp->getChatLogsDir(); - std::string chat_log_top_folder=gDirUtilp->getBaseFileName(chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogPath",chat_log_dir); - gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder); + gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir()); } else { diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 6f037177fa..874995a09e 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -413,7 +413,6 @@ bool handleHighResSnapshotChanged(const LLSD& newvalue) bool handleVoiceClientPrefsChanged(const LLSD& newvalue) { - if(LLVoiceClient::getInstance()) LLVoiceClient::getInstance()->updateSettings(); return true; } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index af0dcd8e35..a5adb11c53 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1426,15 +1426,15 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) //virtual void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height) { - if(mKnownDrawWidth != width || mKnownDrawHeight != height) + if(mKnownDrawWidth < width || mKnownDrawHeight < height) { - mKnownDrawWidth = width; - mKnownDrawHeight = height; + mKnownDrawWidth = llmax(mKnownDrawWidth, width) ; + mKnownDrawHeight = llmax(mKnownDrawHeight, height) ; mKnownDrawSizeChanged = TRUE ; mFullyLoaded = FALSE ; } - addTextureStats((F32)(width * height)); + addTextureStats((F32)(mKnownDrawWidth * mKnownDrawHeight)); } //virtual diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index fac7fa6a18..7bb1006e93 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -139,13 +139,10 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess LLVoiceChannel::~LLVoiceChannel() { - // Don't use LLVoiceClient::getInstance() here -- this can get called during atexit() time and that singleton MAY have already been destroyed. - // Using call of instanceExists() instead of gVoiceClient in check to avoid crash in LLVoiceClient::removeObserver() - // when quitting viewer by closing console window before login (though in case of such quit crash will occur - // later in other destructors anyway). EXT-5524 + // Must check instance exists here, the singleton MAY have already been destroyed. if(LLVoiceClient::instanceExists()) { - gVoiceClient->removeObserver(this); + LLVoiceClient::instance().removeObserver(this); } sVoiceChannelMap.erase(mSessionID); diff --git a/indra/newview/skins/default/textures/arrow_down.tga b/indra/newview/skins/default/textures/arrow_down.tga Binary files differnew file mode 100644 index 0000000000..81dc9d3b6c --- /dev/null +++ b/indra/newview/skins/default/textures/arrow_down.tga diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 1b04d01abf..27d66945d9 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_visible="true" + default_tab_group="1" follows="all" height="408" label="Things" @@ -61,6 +62,7 @@ left="7" name="inventory filter tabs" tab_height="30" + tab_group="1" tab_position="top" tab_min_width="100" top_pad="10" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 6152dd1587..8131b75b70 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Side tray panel --> <panel + default_tab_group="1" follows="all" height="449" label="People" @@ -56,6 +57,7 @@ layout="topleft" left="5" name="tabs" + tab_group="1" tab_min_width="70" tab_height="30" tab_position="top" diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index c61007a9e1..a7a0efcdb3 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_visible="true" + default_tab_group="1" follows="all" height="570" label="Places" @@ -37,6 +38,7 @@ background_visible="true" name="Places Tabs" tab_min_width="80" tab_height="30" + tab_group="1" tab_position="top" top_pad="10" width="315" /> @@ -132,5 +134,14 @@ background_visible="true" right="-10" top="1" width="60" /> + <button + follows="bottom|left" + height="23" + label="Profile" + layout="topleft" + name="profile_btn" + right="-1" + top="1" + width="111" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 3d7f392404..fca9b4bca1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -84,7 +84,7 @@ </text> <check_box enabled="false" - control_name="LogChat" + control_name="LogNearbyChat" height="16" label="Save nearby chat logs on my computer" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index 11069b3ac3..e7384fa77f 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -64,7 +64,6 @@ text_color="white" top="5" translate="false" - v_pad="5" use_ellipses="true" width="260"> Toast text; diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index c5efa2e221..73650a19dc 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel background_visible="true" +default_tab_group="1" follows="all" height="570" label="Outfits" @@ -90,6 +91,7 @@ width="333"> min_height="410" width="320" left="0" + tab_group="1" top_pad="6" follows="all" /> <!-- <button diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index c453d415b4..49bf2a7442 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -264,7 +264,7 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s [COUNT] </text> <text left="4" name="Autoreturn" width="412"> - Devolución automática de objetos de otros Residentes (minutos, 0 para desactivarla): + Devolución automática de objetos de otros (en min., 0 para desactivarla): </text> <line_editor name="clean other time" right="-20"/> <text name="Object Owners:" width="150"> diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml index 9a0a566a55..a40f65d5d0 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml @@ -13,17 +13,17 @@ No puede unirse ni dividirse. </floater.string> <floater.string name="cant_buy_for_group"> - No tiene permiso de comprar terreno para el grupo que tiene activado. + No tienes permiso de comprar terreno para el grupo que tienes activado. </floater.string> <floater.string name="no_land_selected"> No se ha seleccionado terreno. </floater.string> <floater.string name="multiple_parcels_selected"> Se han seleccionado varias parcelas diferentes. -Inténtelo seleccionando un área más pequeña. +Inténtalo seleccionando un área más pequeña. </floater.string> <floater.string name="no_permission"> - No tiene permiso de comprar terreno para el grupo que tiene activado. + No tienes permiso de comprar terreno para el grupo que tienes activado. </floater.string> <floater.string name="parcel_not_for_sale"> La parcela seleccionada no está en venta. @@ -32,20 +32,20 @@ Inténtelo seleccionando un área más pequeña. El grupo ya es propietario de la parcela. </floater.string> <floater.string name="you_already_own"> - Usted ya es propietario de la parcela. + Ya eres propietario de la parcela. </floater.string> <floater.string name="set_to_sell_to_other"> - La parcela seleccionada está marcada para ser vendida a otro + La parcela seleccionada está marcada para ser vendida a otro. </floater.string> <floater.string name="no_public_land"> El área seleccionada no tiene terreno público. </floater.string> <floater.string name="not_owned_by_you"> - Está seleccionado un terreno propiedad de otro Residente. + Estás seleccionado un terreno propiedad de otro Residente. Prueba a seleccionar un área más pequeña. </floater.string> <floater.string name="processing"> - Procesando su compra... + Procesando tu compra... (Llevará uno o dos minutos). </floater.string> @@ -68,10 +68,10 @@ Prueba a seleccionar un área más pequeña. no necesita </floater.string> <floater.string name="must_upgrade"> - Para poseer terreno, su cuenta debe ascender de categoría. + Para poseer terreno, tu cuenta debe ascender de categoría. </floater.string> <floater.string name="cant_own_land"> - Su cuenta puede poseer terreno. + Tu cuenta puede poseer terreno. </floater.string> <floater.string name="land_holdings"> Tienes [BUYER] m² de terreno. @@ -112,16 +112,16 @@ los suficientes créditos de uso en contribución de terreno para cubrir esta parcela. </floater.string> <floater.string name="have_enough_lindens"> - Tiene [AMOUNT] L$, cantidad suficiente para comprar este terreno. + Tienes [AMOUNT] L$, cantidad suficiente para comprar este terreno. </floater.string> <floater.string name="not_enough_lindens"> - Sólo tiene [AMOUNT] L$. Necesitaría [AMOUNT2] L$ más. + Sólo tienes [AMOUNT] L$. Necesitarías [AMOUNT2] L$ más. </floater.string> <floater.string name="balance_left"> - Tras la compra, aún tendrá [AMOUNT] L$. + Tras la compra, aún tendrás [AMOUNT] L$. </floater.string> <floater.string name="balance_needed"> - Para costearse este terreno, deberá comprar, al menos, [AMOUNT] L$. + Para costearte este terreno, deberás comprar, al menos, [AMOUNT] L$. </floater.string> <floater.string name="no_parcel_selected"> (No se ha seleccionado una parcela) @@ -163,7 +163,7 @@ para cubrir esta parcela. Podrá o no unirse o dividirse. </text> <text name="covenant_text"> - Deve aceptar el Contrato del Estado: + Debes aceptar el Contrato del Estado: </text> <text left="470" name="covenant_timestamp_text"/> <text_editor name="covenant_editor"> @@ -198,7 +198,7 @@ se vende con los objetos </text> <button label="Ir al sitio web" name="error_web"/> <text name="account_action"> - Ascienda a la categoría de miembro premium. + Asciende a la categoría de miembro premium. </text> <text name="account_reason"> Sólo pueden ser propietarios de terreno los miembros premium. @@ -209,7 +209,7 @@ se vende con los objetos <combo_box.item label="6.00 US$/mes, facturados anualmente" name="US$6.00/month,billedannually"/> </combo_box> <text name="land_use_action"> - Aumenta su cuota mensual por uso de terreno a 40 US$/mes. + Aumenta tu cuota mensual por uso de terreno a 40 US$/mes. </text> <text name="land_use_reason"> Tienes 1309 m² de terreno. @@ -219,7 +219,7 @@ Esta parcela es de 512 m². Pagar al residente Joe 4.000 L$ por el terreno </text> <text name="currency_reason"> - Tiene 2.100 L$. + Tienes 2.100 L$. </text> <text name="currency_action"> Comprar más L$ @@ -231,7 +231,7 @@ Esta parcela es de 512 m². por, aprox., [LOCAL_AMOUNT] </text> <text name="currency_balance"> - Tiene 2.100 L$. + Tienes 2.100 L$. </text> <check_box label="Quitar [AMOUNT] m² de las contribuciones de grupo." name="remove_contribution"/> <button label="Comprar" name="buy_btn"/> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 9cb3b70260..082841af31 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -86,19 +86,19 @@ Asegúrate de que tu conexión a Internet está funcionando adecuadamente. <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/> </notification> <notification name="CompileQueueSaveText"> - Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtelo más tarde. + Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde. </notification> <notification name="CompileQueueSaveBytecode"> - Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtelo más tarde. + Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde. </notification> <notification name="WriteAnimationFail"> - Hubo un problema al escribir los datos de la animación. Por favor, inténtelo más tarde. + Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde. </notification> <notification name="UploadAuctionSnapshotFail"> Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON] </notification> <notification name="UnableToViewContentsMoreThanOne"> - No se puede ver a la vez los contenidos de más de un ítem. Por favor, elija un solo objeto y vuelva a intentarlo. + No se puede ver a la vez los contenidos de más de un ítem. Por favor, elige un solo objeto y vuelve a intentarlo. </notification> <notification name="SaveClothingBodyChanges"> ¿Guardar todos los cambios en la ropa y partes del cuerpo? @@ -119,11 +119,11 @@ Asegúrate de que tu conexión a Internet está funcionando adecuadamente. <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/> </notification> <notification name="RevokeModifyRights"> - ¿Quiere revocar los derechos de modificación a [FIRST_NAME] [LAST_NAME]? + ¿Quieres revocar los derechos de modificación a [FIRST_NAME] [LAST_NAME]? <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/> </notification> <notification name="RevokeModifyRightsMultiple"> - ¿Quiere revocar los derechos de modificación a los residentes seleccionados? + ¿Quieres revocar los derechos de modificación a los residentes seleccionados? <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/> </notification> <notification name="UnableToCreateGroup"> @@ -188,7 +188,7 @@ Por favor, invita a miembros en las próximas 48 horas. <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/> </notification> <notification name="LandBuyPass"> - Por [COST] L$ puede entrar a este terreno ('[PARCEL_NAME]') durante [TIME] horas. ¿Comprar un pase? + Por [COST] L$ puedes entrar a este terreno ('[PARCEL_NAME]') durante [TIME] horas. ¿Comprar un pase? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="SalePriceRestriction"> @@ -208,7 +208,7 @@ El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME]. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ReturnObjectsDeededToGroup"> - ¿Estás seguros de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo '[NAME]' al inventario de su propietario anterior? + ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo '[NAME]' al inventario de su propietario anterior? *ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo! @@ -304,7 +304,7 @@ debes estar dentro de ella. La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa. </notification> <notification name="CannotWearTrash"> - No puede vestirte ropas o partes del cuerpo que estén en la Papelera + No puedes vestirte ropas o partes del cuerpo que estén en la Papelera </notification> <notification name="MaxAttachmentsOnOutfit"> No se puede anexar el objeto. @@ -426,7 +426,7 @@ El objeto debe de haber sido borrado o estar fuera de rango ('out of range& Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.. </notification> <notification name="StartRegionEmpty"> - Perdon, no está definida tu Posición inicial. + Perdón, no está definida tu Posición inicial. Por favor, escribe el nombre de la región en el cajetín de Posición inicial, o elige para esa posición Mi Base o Mi última posición. <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -639,22 +639,22 @@ Por favor, inténtalo más tarde. </notification> <notification name="CannotRecompileSelectObjectsNoScripts"> No se pudo 'recompilar'. -Seleccione un objeto con script. +Selecciona un objeto con script. </notification> <notification name="CannotRecompileSelectObjectsNoPermission"> No se pudo 'recompilar'. -Seleccione objetos con scripts en los que usted tenga permiso para modificarlos. +Selecciona objetos con scripts en los que tengas permiso para modificarlos. </notification> <notification name="CannotResetSelectObjectsNoScripts"> No se pudo 'reiniciar'. -Seleccione objetos con scripts. +Selecciona objetos con scripts. </notification> <notification name="CannotResetSelectObjectsNoPermission"> No se pudo 'reiniciar'. -Seleccione objetos con scripts en los que usted tenga permiso para modificarlos. +Selecciona objetos con scripts en los que tengas permiso para modificarlos. </notification> <notification name="CannotOpenScriptObjectNoMod"> Imposible abrir el script del objeto sin modificar los permisos. @@ -662,7 +662,7 @@ Seleccione objetos con scripts en los que usted tenga permiso para modificarlos. <notification name="CannotSetRunningSelectObjectsNoScripts"> No se puede configurar ningún script como 'ejecutándose'. -Seleccione objetos con scripts. +Selecciona objetos con scripts. </notification> <notification name="CannotSetRunningNotSelectObjectsNoScripts"> No se puede configurar ningún script como 'no ejecutándose'. @@ -770,7 +770,7 @@ no se ha seleccionado una parcela. </notification> <notification name="CannotDeedLandNoGroup"> No se ha podido transferir el terreno: -no ha seleccionado un grupo. +no has seleccionado un grupo. </notification> <notification name="CannotDeedLandNoRegion"> No se ha podido transferir el terreno: @@ -800,7 +800,7 @@ Vuelve a intentarlo en unos segundos. </notification> <notification name="CannotReleaseLandSelected"> No se ha podido abandonar el terreno: -no es propietario de todas las parcelas seleccionadas. +no eres propietario de todas las parcelas seleccionadas. Por favor, selecciona una sola parcela. </notification> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 46d8984889..7a65eb32bc 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -49,7 +49,7 @@ Mostrar los MI en: </text> <text name="requires_restart_label"> - (requiere reiniciar) + (requiere reiniciar) </text> <radio_group name="chat_window" tool_tip="Muestra tus mensajes instantáneos en varias ventanas flotantes o en una sola con varias pestañas (requiere que reinicies)"> <radio_item label="Varias ventanas" name="radio" value="0"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 0f2af7aaef..4cee677420 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1543,10 +1543,10 @@ No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta. </string> <string name="covenant_last_modified"> - Última modificación: + Última modificación: </string> <string name="none_text" value="(no hay)"/> - <string name="never_text" value="(nunca)"/> + <string name="never_text" value=" (nunca)"/> <string name="GroupOwned"> Propiedad del grupo </string> |