diff --git a/xfa/fgas/localization/fgas_locale.cpp b/xfa/fgas/localization/fgas_locale.cpp
index 7fddbb4..17aae59 100644
--- a/xfa/fgas/localization/fgas_locale.cpp
+++ b/xfa/fgas/localization/fgas_locale.cpp
@@ -65,26 +65,26 @@
 const wchar_t gs_wsDateSymbols[] = L"DJMEeGgYwW";
 const wchar_t gs_wsConstChars[] = L",-:/. ";
 
-int32_t ParseTimeZone(const wchar_t* pStr, int32_t iLen, FX_TIMEZONE& tz) {
-  tz.tzHour = 0;
-  tz.tzMinute = 0;
+int32_t ParseTimeZone(const wchar_t* pStr, int32_t iLen, FX_TIMEZONE* tz) {
+  tz->tzHour = 0;
+  tz->tzMinute = 0;
   if (iLen < 0)
     return 0;
 
   int32_t iStart = 1;
   int32_t iEnd = iStart + 2;
   while (iStart < iLen && iStart < iEnd)
-    tz.tzHour = tz.tzHour * 10 + pStr[iStart++] - '0';
+    tz->tzHour = tz->tzHour * 10 + pStr[iStart++] - '0';
 
   if (iStart < iLen && pStr[iStart] == ':')
     iStart++;
 
   iEnd = iStart + 2;
   while (iStart < iLen && iStart < iEnd)
-    tz.tzMinute = tz.tzMinute * 10 + pStr[iStart++] - '0';
+    tz->tzMinute = tz->tzMinute * 10 + pStr[iStart++] - '0';
 
   if (pStr[0] == '-')
-    tz.tzHour = -tz.tzHour;
+    tz->tzHour = -tz->tzHour;
 
   return iStart;
 }
@@ -285,10 +285,9 @@
       CFX_WideString wsMonthNameAbbr;
       uint16_t i = 0;
       for (; i < 12; i++) {
-        pLocale->GetMonthName(i, wsMonthNameAbbr, true);
-        if (wsMonthNameAbbr.IsEmpty()) {
+        wsMonthNameAbbr = pLocale->GetMonthName(i, true);
+        if (wsMonthNameAbbr.IsEmpty())
           continue;
-        }
         if (!FXSYS_wcsncmp(wsMonthNameAbbr.c_str(), str + cc,
                            wsMonthNameAbbr.GetLength())) {
           break;
@@ -302,10 +301,9 @@
       CFX_WideString wsMonthName;
       uint16_t i = 0;
       for (; i < 12; i++) {
-        pLocale->GetMonthName(i, wsMonthName, false);
-        if (wsMonthName.IsEmpty()) {
+        wsMonthName = pLocale->GetMonthName(i, false);
+        if (wsMonthName.IsEmpty())
           continue;
-        }
         if (!FXSYS_wcsncmp(wsMonthName.c_str(), str + cc,
                            wsMonthName.GetLength())) {
           break;
@@ -321,10 +319,9 @@
       CFX_WideString wsDayNameAbbr;
       uint16_t i = 0;
       for (; i < 7; i++) {
-        pLocale->GetDayName(i, wsDayNameAbbr, true);
-        if (wsDayNameAbbr.IsEmpty()) {
+        wsDayNameAbbr = pLocale->GetDayName(i, true);
+        if (wsDayNameAbbr.IsEmpty())
           continue;
-        }
         if (!FXSYS_wcsncmp(wsDayNameAbbr.c_str(), str + cc,
                            wsDayNameAbbr.GetLength())) {
           break;
@@ -337,10 +334,9 @@
       CFX_WideString wsDayName;
       int32_t i = 0;
       for (; i < 7; i++) {
-        pLocale->GetDayName(i, wsDayName, false);
-        if (wsDayName == L"") {
+        wsDayName = pLocale->GetDayName(i, false);
+        if (wsDayName == L"")
           continue;
-        }
         if (!FXSYS_wcsncmp(wsDayName.c_str(), str + cc,
                            wsDayName.GetLength())) {
           break;
@@ -402,8 +398,7 @@
                  FX_TIMEZONE tzDiff,
                  IFX_Locale* pLocale) {
   int32_t iMinuteDiff = wHour * 60 + wMinute;
-  FX_TIMEZONE tzLocale;
-  pLocale->GetTimeZone(&tzLocale);
+  FX_TIMEZONE tzLocale = pLocale->GetTimeZone();
   iMinuteDiff += tzLocale.tzHour * 60 +
                  (tzLocale.tzHour < 0 ? -tzLocale.tzMinute : tzLocale.tzMinute);
   iMinuteDiff -= tzDiff.tzHour * 60 +
@@ -545,10 +540,8 @@
         i++;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) {
-      CFX_WideString wsAM;
-      pLocale->GetMeridiemName(wsAM, true);
-      CFX_WideString wsPM;
-      pLocale->GetMeridiemName(wsPM, false);
+      CFX_WideString wsAM = pLocale->GetMeridiemName(true);
+      CFX_WideString wsPM = pLocale->GetMeridiemName(false);
       if ((cc + wsAM.GetLength() <= len) &&
           (CFX_WideStringC(str + cc, wsAM.GetLength()) == wsAM)) {
         cc += wsAM.GetLength();
@@ -570,9 +563,9 @@
         FX_TIMEZONE tzDiff;
         tzDiff.tzHour = 0;
         tzDiff.tzMinute = 0;
-        if (cc < len && (str[cc] == '-' || str[cc] == '+')) {
-          cc += ParseTimeZone(str + cc, len - cc, tzDiff);
-        }
+        if (cc < len && (str[cc] == '-' || str[cc] == '+'))
+          cc += ParseTimeZone(str + cc, len - cc, &tzDiff);
+
         ResolveZone(hour, minute, tzDiff, pLocale);
       } else {
         const FX_LOCALETIMEZONEINFO* pEnd =
@@ -590,7 +583,7 @@
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) {
       if (str[cc] != 'Z') {
         FX_TIMEZONE tzDiff;
-        cc += ParseTimeZone(str + cc, len - cc, tzDiff);
+        cc += ParseTimeZone(str + cc, len - cc, &tzDiff);
         ResolveZone(hour, minute, tzDiff, pLocale);
       } else {
         cc++;
@@ -737,13 +730,9 @@
       wsMonth.Format(L"%02d", month);
       wsResult += wsMonth;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) {
-      CFX_WideString wsTemp;
-      pLocale->GetMonthName(month - 1, wsTemp, true);
-      wsResult += wsTemp;
+      wsResult += pLocale->GetMonthName(month - 1, true);
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) {
-      CFX_WideString wsTemp;
-      pLocale->GetMonthName(month - 1, wsTemp, false);
-      wsResult += wsTemp;
+      wsResult += pLocale->GetMonthName(month - 1, false);
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) {
       uint16_t wWeekDay = GetWeekDay(year, month, day);
       CFX_WideString wsWeekDay;
@@ -751,25 +740,18 @@
       wsResult += wsWeekDay;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) {
       uint16_t wWeekDay = GetWeekDay(year, month, day);
-      CFX_WideString wsTemp;
-      pLocale->GetDayName(wWeekDay, wsTemp, true);
-      wsResult += wsTemp;
+      wsResult += pLocale->GetDayName(wWeekDay, true);
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) {
       uint16_t wWeekDay = GetWeekDay(year, month, day);
-      if (pLocale) {
-        CFX_WideString wsTemp;
-        pLocale->GetDayName(wWeekDay, wsTemp, false);
-        wsResult += wsTemp;
-      }
+      if (pLocale)
+        wsResult += pLocale->GetDayName(wWeekDay, false);
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) {
       uint16_t wWeekDay = GetWeekDay(year, month, day);
       CFX_WideString wsWeekDay;
       wsWeekDay.Format(L"%d", wWeekDay ? wWeekDay : 7);
       wsResult += wsWeekDay;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) {
-      CFX_WideString wsTemp;
-      pLocale->GetEraName(wsTemp, year < 0);
-      wsResult += wsTemp;
+      wsResult += pLocale->GetEraName(year < 0);
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) {
       CFX_WideString wsYear;
       wsYear.Format(L"%02d", year % 100);
@@ -895,32 +877,22 @@
       wsMilliseconds.Format(L"%03d", millisecond);
       wsResult += wsMilliseconds;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) {
-      CFX_WideString wsMeridiem;
-      pLocale->GetMeridiemName(wsMeridiem, !bPM);
-      wsResult += wsMeridiem;
+      wsResult += pLocale->GetMeridiemName(!bPM);
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) {
       wsResult += L"GMT";
-      FX_TIMEZONE tz;
-      pLocale->GetTimeZone(&tz);
+      FX_TIMEZONE tz = pLocale->GetTimeZone();
       if (!bGMT && (tz.tzHour != 0 || tz.tzMinute != 0)) {
-        if (tz.tzHour < 0) {
-          wsResult += L"-";
-        } else {
-          wsResult += L"+";
-        }
+        wsResult += tz.tzHour < 0 ? L"-" : L"+";
+
         CFX_WideString wsTimezone;
         wsTimezone.Format(L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute);
         wsResult += wsTimezone;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) {
-      FX_TIMEZONE tz;
-      pLocale->GetTimeZone(&tz);
+      FX_TIMEZONE tz = pLocale->GetTimeZone();
       if (!bGMT && tz.tzHour != 0 && tz.tzMinute != 0) {
-        if (tz.tzHour < 0) {
-          wsResult += L"-";
-        } else {
-          wsResult += L"+";
-        }
+        wsResult += tz.tzHour < 0 ? L"-" : L"+";
+
         CFX_WideString wsTimezone;
         wsTimezone.Format(L"%02d:%02d", FXSYS_abs(tz.tzHour), tz.tzMinute);
         wsResult += wsTimezone;
@@ -1094,7 +1066,7 @@
           tzDiff.tzHour = 0;
           tzDiff.tzMinute = 0;
           if (str[cc] != 'Z')
-            cc += ParseTimeZone(str + cc, len - cc, tzDiff);
+            cc += ParseTimeZone(str + cc, len - cc, &tzDiff);
           ResolveZone(hour, minute, tzDiff, pLocale);
         }
       }
@@ -1323,12 +1295,12 @@
               break;
             }
           }
-          wsSubCategory.clear();
-          if (!pLocale) {
+          if (!pLocale)
             pLocale = m_pLocaleMgr->GetDefLocale();
-          }
+
           ASSERT(pLocale);
-          pLocale->GetNumPattern(eSubCategory, wsSubCategory);
+
+          wsSubCategory = pLocale->GetNumPattern(eSubCategory);
           iDotIndex = wsSubCategory.Find('.');
           if (iDotIndex > 0) {
             iDotIndex += wsPurgePattern.GetLength();
@@ -1447,25 +1419,24 @@
                                 const CFX_WideString& wsPattern,
                                 CFX_WideString& wsValue) {
   wsValue.clear();
-  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty()) {
+  if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty())
     return false;
-  }
+
   int32_t dot_index_f = -1;
   uint32_t dwFormatStyle = 0;
   CFX_WideString wsNumFormat;
   IFX_Locale* pLocale =
       GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat);
-  if (!pLocale || wsNumFormat.IsEmpty()) {
+  if (!pLocale || wsNumFormat.IsEmpty())
     return false;
-  }
+
   int32_t iExponent = 0;
-  CFX_WideString wsDotSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  CFX_WideString wsDotSymbol =
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
+  CFX_WideString wsGroupSymbol =
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping);
   int32_t iGroupLen = wsGroupSymbol.GetLength();
-  CFX_WideString wsMinus;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinus);
+  CFX_WideString wsMinus = pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus);
   int32_t iMinusLen = wsMinus.GetLength();
   int cc = 0, ccf = 0;
   const wchar_t* str = wsSrcNum.c_str();
@@ -1578,8 +1549,8 @@
         ccf--;
       } break;
       case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
+        CFX_WideString wsSymbol =
+            pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol);
         int32_t iSymbolLen = wsSymbol.GetLength();
         cc -= iSymbolLen - 1;
         if (cc < 0 || FXSYS_wcsncmp(str + cc, wsSymbol.c_str(), iSymbolLen)) {
@@ -1641,8 +1612,8 @@
       case 'v':
         return false;
       case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+        CFX_WideString wsSymbol =
+            pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent);
         int32_t iSysmbolLen = wsSymbol.GetLength();
         cc -= iSysmbolLen - 1;
         if (cc < 0 || FXSYS_wcsncmp(str + cc, wsSymbol.c_str(), iSysmbolLen)) {
@@ -1797,9 +1768,8 @@
           ccf++;
         } break;
         case '$': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol,
-                                     wsSymbol);
+          CFX_WideString wsSymbol =
+              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol);
           int32_t iSymbolLen = wsSymbol.GetLength();
           if (cc + iSymbolLen > len ||
               FXSYS_wcsncmp(str + cc, wsSymbol.c_str(), iSymbolLen)) {
@@ -1853,8 +1823,8 @@
         case 'v':
           return false;
         case '%': {
-          CFX_WideString wsSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
+          CFX_WideString wsSymbol =
+              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent);
           int32_t iSysmbolLen = wsSymbol.GetLength();
           if (cc + iSysmbolLen <= len &&
               !FXSYS_wcsncmp(str + cc, wsSymbol.c_str(), iSysmbolLen)) {
@@ -2013,17 +1983,17 @@
           ASSERT(pLocale);
           switch (eCategory) {
             case FX_LOCALECATEGORY_Date:
-              pLocale->GetDatePattern(eSubCategory, wsDatePattern);
-              wsDatePattern = wsTempPattern + wsDatePattern;
+              wsDatePattern =
+                  wsTempPattern + pLocale->GetDatePattern(eSubCategory);
               break;
             case FX_LOCALECATEGORY_Time:
-              pLocale->GetTimePattern(eSubCategory, wsTimePattern);
-              wsTimePattern = wsTempPattern + wsTimePattern;
+              wsTimePattern =
+                  wsTempPattern + pLocale->GetTimePattern(eSubCategory);
               break;
             case FX_LOCALECATEGORY_DateTime:
-              pLocale->GetDatePattern(eSubCategory, wsDatePattern);
-              wsDatePattern = wsTempPattern + wsDatePattern;
-              pLocale->GetTimePattern(eSubCategory, wsTimePattern);
+              wsDatePattern =
+                  wsTempPattern + pLocale->GetDatePattern(eSubCategory);
+              wsTimePattern = pLocale->GetTimePattern(eSubCategory);
               break;
             default:
               break;
@@ -2310,8 +2280,8 @@
     wsSrcNum.TrimRight(L"0");
     wsSrcNum.TrimRight(L".");
   }
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  CFX_WideString wsGroupSymbol =
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping);
   bool bNeg = false;
   if (wsSrcNum[0] == '-') {
     bNeg = true;
@@ -2370,9 +2340,8 @@
         break;
       case 'S':
         if (bNeg) {
-          CFX_WideString wsMinusSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
-          wsOutput = wsMinusSymbol + wsOutput;
+          wsOutput =
+              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
           bAddNeg = true;
         } else {
           wsOutput = L' ' + wsOutput;
@@ -2381,9 +2350,8 @@
         break;
       case 's':
         if (bNeg) {
-          CFX_WideString wsMinusSymbol;
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusSymbol);
-          wsOutput = wsMinusSymbol + wsOutput;
+          wsOutput =
+              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
           bAddNeg = true;
         }
         ccf--;
@@ -2396,9 +2364,9 @@
         ccf--;
         break;
       case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        wsOutput = wsSymbol + wsOutput;
+        wsOutput =
+            pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol) +
+            wsOutput;
       }
         ccf--;
         break;
@@ -2443,9 +2411,8 @@
         }
         break;
       case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        wsOutput = wsSymbol + wsOutput;
+        wsOutput =
+            pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent) + wsOutput;
       }
         ccf--;
         break;
@@ -2491,28 +2458,25 @@
       wsOutput += wsSrcNum[i];
     }
     if (dot_index < len) {
-      CFX_WideString wsSymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
-      wsOutput += wsSymbol;
+      wsOutput += pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
       wsOutput += wsSrcNum.Right(len - dot_index - 1);
     }
     if (bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
+      wsOutput =
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
     }
     return false;
   }
   if (dot_index_f == wsNumFormat.GetLength()) {
     if (!bAddNeg && bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
+      wsOutput =
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
     }
     return true;
   }
-  CFX_WideString wsDotSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDotSymbol);
+
+  CFX_WideString wsDotSymbol =
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
   if (strf[dot_index_f] == 'V') {
     wsOutput += wsDotSymbol;
   } else if (strf[dot_index_f] == '.') {
@@ -2570,14 +2534,11 @@
         CFX_WideString wsExp;
         wsExp.Format(L"E%+d", exponent);
         wsOutput += wsExp;
-      }
         ccf++;
-        break;
-      case '$': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol, wsSymbol);
-        wsOutput += wsSymbol;
-      }
+      } break;
+      case '$':
+        wsOutput +=
+            pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol);
         ccf++;
         break;
       case 'c':
@@ -2620,22 +2581,18 @@
           bAddNeg = true;
         }
         break;
-      case '%': {
-        CFX_WideString wsSymbol;
-        pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent, wsSymbol);
-        wsOutput += wsSymbol;
-      }
+      case '%':
+        wsOutput += pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent);
         ccf++;
         break;
-      case '8': {
-        while (ccf < lenf && strf[ccf] == '8') {
+      case '8':
+        while (ccf < lenf && strf[ccf] == '8')
           ccf++;
-        }
         while (cc < len && FXSYS_isDecimalDigit(str[cc])) {
           wsOutput += str[cc];
           cc++;
         }
-      } break;
+        break;
       case ',':
         wsOutput += wsGroupSymbol;
         ccf++;
@@ -2662,10 +2619,8 @@
     }
   }
   if (!bAddNeg && bNeg) {
-    CFX_WideString wsMinusymbol;
-    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-    wsOutput =
-        wsMinusymbol + wsOutput[0] + wsOutput.Mid(1, wsOutput.GetLength() - 1);
+    wsOutput = pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) +
+               wsOutput[0] + wsOutput.Mid(1, wsOutput.GetLength() - 1);
   }
   return true;
 }
diff --git a/xfa/fgas/localization/fgas_locale.h b/xfa/fgas/localization/fgas_locale.h
index 449430b..5d8ddc0 100644
--- a/xfa/fgas/localization/fgas_locale.h
+++ b/xfa/fgas/localization/fgas_locale.h
@@ -59,25 +59,18 @@
   virtual ~IFX_Locale() {}
 
   virtual CFX_WideString GetName() const = 0;
-  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                 CFX_WideString& wsNumSymbol) const = 0;
-  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const = 0;
-  virtual void GetMonthName(int32_t nMonth,
-                            CFX_WideString& wsMonthName,
-                            bool bAbbr = true) const = 0;
-  virtual void GetDayName(int32_t nWeek,
-                          CFX_WideString& wsDayName,
-                          bool bAbbr = true) const = 0;
-  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                               bool bAM = true) const = 0;
-  virtual void GetTimeZone(FX_TIMEZONE* tz) const = 0;
-  virtual void GetEraName(CFX_WideString& wsEraName, bool bAD = true) const = 0;
-  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const = 0;
-  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const = 0;
-  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                             CFX_WideString& wsPattern) const = 0;
+  virtual CFX_WideString GetNumbericSymbol(FX_LOCALENUMSYMBOL eType) const = 0;
+  virtual CFX_WideString GetDateTimeSymbols() const = 0;
+  virtual CFX_WideString GetMonthName(int32_t nMonth, bool bAbbr) const = 0;
+  virtual CFX_WideString GetDayName(int32_t nWeek, bool bAbbr) const = 0;
+  virtual CFX_WideString GetMeridiemName(bool bAM) const = 0;
+  virtual FX_TIMEZONE GetTimeZone() const = 0;
+  virtual CFX_WideString GetEraName(bool bAD) const = 0;
+  virtual CFX_WideString GetDatePattern(
+      FX_LOCALEDATETIMESUBCATEGORY eType) const = 0;
+  virtual CFX_WideString GetTimePattern(
+      FX_LOCALEDATETIMESUBCATEGORY eType) const = 0;
+  virtual CFX_WideString GetNumPattern(FX_LOCALENUMSUBCATEGORY eType) const = 0;
 };
 
 bool FX_DateFromCanonical(const CFX_WideString& wsDate, CFX_Unitime* datetime);
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
index 218e58b..83f65ed 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
@@ -1168,13 +1168,10 @@
   int32_t second = uniTime.GetSecond();
   int32_t milSecond = uniTime.GetMillisecond();
 
-  FX_TIMEZONE tzLocale;
-  pMgr->GetDefLocale()->GetTimeZone(&tzLocale);
-
   // TODO(dsinclair): See if there is other time conversion code in pdfium and
   //   consolidate.
   int32_t mins = hour * 60 + min;
-  mins -= (tzLocale.tzHour * 60);
+  mins -= (pMgr->GetDefLocale()->GetTimeZone().tzHour * 60);
   while (mins > 1440)
     mins -= 1440;
   while (mins < 0)
@@ -1568,7 +1565,7 @@
 
   CFX_WideString wsFormat;
   if (formatString.IsEmpty())
-    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+    wsFormat = pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default);
   else
     wsFormat = CFX_WideString::FromUTF8(formatString.AsStringC());
 
@@ -1588,10 +1585,7 @@
   int32_t milSecond = uniTime.GetMillisecond();
   int32_t mins = hour * 60 + min;
 
-  FX_TIMEZONE tz;
-  CXFA_TimeZoneProvider provider;
-  provider.GetTimeZone(&tz);
-  mins -= (tz.tzHour * 60);
+  mins -= (CXFA_TimeZoneProvider().GetTimeZone().tzHour * 60);
   while (mins > 1440)
     mins -= 1440;
 
@@ -1942,7 +1936,7 @@
 
   CFX_WideString wsFormat;
   if (szFormat.IsEmpty())
-    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+    wsFormat = pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default);
   else
     wsFormat = CFX_WideString::FromUTF8(szFormat);
 
@@ -1979,7 +1973,7 @@
 
   CFX_WideString wsFormat;
   if (szFormat.IsEmpty())
-    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+    wsFormat = pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default);
   else
     wsFormat = CFX_WideString::FromUTF8(szFormat);
 
@@ -2017,7 +2011,7 @@
 
   CFX_WideString wsFormat;
   if (szFormat.IsEmpty())
-    pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+    wsFormat = pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default);
   else
     wsFormat = CFX_WideString::FromUTF8(szFormat);
 
@@ -2055,7 +2049,7 @@
 
   CFX_WideString wsFormat;
   if (szFormat.IsEmpty())
-    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+    wsFormat = pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default);
   else
     wsFormat = CFX_WideString::FromUTF8(szFormat);
 
@@ -2094,7 +2088,7 @@
 
   CFX_WideString wsFormat;
   if (szFormat.IsEmpty())
-    pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat);
+    wsFormat = pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default);
   else
     wsFormat = CFX_WideString::FromUTF8(szFormat);
 
@@ -2206,12 +2200,10 @@
   if (!pLocale)
     return;
 
-  CFX_WideString strRet;
-  pLocale->GetDatePattern(strStyle, strRet);
+  CFX_WideString strRet = pLocale->GetDatePattern(strStyle);
   if (!bStandard) {
-    CFX_WideString wsSymbols;
-    pLocale->GetDateTimeSymbols(wsSymbols);
-    AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Date);
+    AlternateDateTimeSymbols(strRet, pLocale->GetDateTimeSymbols(),
+                             g_sAltTable_Date);
   }
   strFormat = strRet.UTF8Encode();
 }
@@ -2257,12 +2249,10 @@
   if (!pLocale)
     return;
 
-  CFX_WideString strRet;
-  pLocale->GetTimePattern(strStyle, strRet);
+  CFX_WideString strRet = pLocale->GetTimePattern(strStyle);
   if (!bStandard) {
-    CFX_WideString wsSymbols;
-    pLocale->GetDateTimeSymbols(wsSymbols);
-    AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Time);
+    AlternateDateTimeSymbols(strRet, pLocale->GetDateTimeSymbols(),
+                             g_sAltTable_Time);
   }
   strFormat = strRet.UTF8Encode();
 }
diff --git a/xfa/fxfa/parser/cxfa_localevalue.cpp b/xfa/fxfa/parser/cxfa_localevalue.cpp
index 189d7d9..a5238d2 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue.cpp
@@ -940,28 +940,26 @@
     }
     n++;
   }
-  if (n == nCount) {
+  if (n == nCount)
     return true;
-  }
-  if (nf == nCountFmt) {
+  if (nf == nCountFmt)
     return false;
-  }
+
   while (nf < nCountFmt && (cf = pFmt[nf]) != L'.') {
     ASSERT(cf == L'z' || cf == L'*');
     ++nf;
   }
   CFX_WideString wsDecimalSymbol;
-  if (pLocale) {
-    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol);
-  } else {
+  if (pLocale)
+    wsDecimalSymbol = pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
+  else
     wsDecimalSymbol = CFX_WideString(L'.');
-  }
-  if (pFmt[nf] != L'.') {
+
+  if (pFmt[nf] != L'.')
     return false;
-  }
-  if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.') {
+  if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.')
     return false;
-  }
+
   ++nf;
   ++n;
   bLimit = true;
diff --git a/xfa/fxfa/parser/cxfa_nodelocale.cpp b/xfa/fxfa/parser/cxfa_nodelocale.cpp
index 49d55c8..fac3cc3 100644
--- a/xfa/fxfa/parser/cxfa_nodelocale.cpp
+++ b/xfa/fxfa/parser/cxfa_nodelocale.cpp
@@ -35,7 +35,7 @@
     case FX_LOCALENUMPATTERN_Integer:
       return g_FX_Integer;
   }
-  return L"";
+  return CFX_WideString();
 }
 
 CXFA_NodeLocale::CXFA_NodeLocale(CXFA_Node* pLocale) : m_pLocale(pLocale) {}
@@ -47,108 +47,89 @@
                                   : nullptr);
 }
 
-void CXFA_NodeLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                        CFX_WideString& wsNumSymbol) const {
+CFX_WideString CXFA_NodeLocale::GetNumbericSymbol(
+    FX_LOCALENUMSYMBOL eType) const {
   switch (eType) {
     case FX_LOCALENUMSYMBOL_Decimal:
-      wsNumSymbol = GetSymbol(XFA_Element::NumberSymbols, L"decimal");
-      break;
+      return GetSymbol(XFA_Element::NumberSymbols, L"decimal");
     case FX_LOCALENUMSYMBOL_Grouping:
-      wsNumSymbol = GetSymbol(XFA_Element::NumberSymbols, L"grouping");
-      break;
+      return GetSymbol(XFA_Element::NumberSymbols, L"grouping");
     case FX_LOCALENUMSYMBOL_Percent:
-      wsNumSymbol = GetSymbol(XFA_Element::NumberSymbols, L"percent");
-      break;
+      return GetSymbol(XFA_Element::NumberSymbols, L"percent");
     case FX_LOCALENUMSYMBOL_Minus:
-      wsNumSymbol = GetSymbol(XFA_Element::NumberSymbols, L"minus");
-      break;
+      return GetSymbol(XFA_Element::NumberSymbols, L"minus");
     case FX_LOCALENUMSYMBOL_Zero:
-      wsNumSymbol = GetSymbol(XFA_Element::NumberSymbols, L"zero");
-      break;
+      return GetSymbol(XFA_Element::NumberSymbols, L"zero");
     case FX_LOCALENUMSYMBOL_CurrencySymbol:
-      wsNumSymbol = GetSymbol(XFA_Element::CurrencySymbols, L"symbol");
-      break;
+      return GetSymbol(XFA_Element::CurrencySymbols, L"symbol");
     case FX_LOCALENUMSYMBOL_CurrencyName:
-      wsNumSymbol = GetSymbol(XFA_Element::CurrencySymbols, L"isoname");
-      break;
+      return GetSymbol(XFA_Element::CurrencySymbols, L"isoname");
   }
+  return CFX_WideString();
 }
 
-void CXFA_NodeLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
+CFX_WideString CXFA_NodeLocale::GetDateTimeSymbols() const {
   CXFA_Node* pSymbols =
       m_pLocale ? m_pLocale->GetChild(0, XFA_Element::DateTimeSymbols)
                 : nullptr;
-  wsDtSymbol = pSymbols ? pSymbols->GetContent() : CFX_WideString();
+  return pSymbols ? pSymbols->GetContent() : CFX_WideString();
 }
 
-void CXFA_NodeLocale::GetMonthName(int32_t nMonth,
-                                   CFX_WideString& wsMonthName,
-                                   bool bAbbr) const {
-  wsMonthName = GetCalendarSymbol(XFA_Element::MonthNames, nMonth, bAbbr);
+CFX_WideString CXFA_NodeLocale::GetMonthName(int32_t nMonth, bool bAbbr) const {
+  return GetCalendarSymbol(XFA_Element::MonthNames, nMonth, bAbbr);
 }
 
-void CXFA_NodeLocale::GetDayName(int32_t nWeek,
-                                 CFX_WideString& wsDayName,
-                                 bool bAbbr) const {
-  wsDayName = GetCalendarSymbol(XFA_Element::DayNames, nWeek, bAbbr);
+CFX_WideString CXFA_NodeLocale::GetDayName(int32_t nWeek, bool bAbbr) const {
+  return GetCalendarSymbol(XFA_Element::DayNames, nWeek, bAbbr);
 }
 
-void CXFA_NodeLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
-                                      bool bAM) const {
-  wsMeridiemName =
-      GetCalendarSymbol(XFA_Element::MeridiemNames, bAM ? 0 : 1, false);
+CFX_WideString CXFA_NodeLocale::GetMeridiemName(bool bAM) const {
+  return GetCalendarSymbol(XFA_Element::MeridiemNames, bAM ? 0 : 1, false);
 }
 
-void CXFA_NodeLocale::GetTimeZone(FX_TIMEZONE* tz) const {
-  CXFA_TimeZoneProvider provider;
-  provider.GetTimeZone(tz);
+FX_TIMEZONE CXFA_NodeLocale::GetTimeZone() const {
+  return CXFA_TimeZoneProvider().GetTimeZone();
 }
 
-void CXFA_NodeLocale::GetEraName(CFX_WideString& wsEraName, bool bAD) const {
-  wsEraName = GetCalendarSymbol(XFA_Element::EraNames, bAD ? 1 : 0, false);
+CFX_WideString CXFA_NodeLocale::GetEraName(bool bAD) const {
+  return GetCalendarSymbol(XFA_Element::EraNames, bAD ? 1 : 0, false);
 }
 
-void CXFA_NodeLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                     CFX_WideString& wsPattern) const {
+CFX_WideString CXFA_NodeLocale::GetDatePattern(
+    FX_LOCALEDATETIMESUBCATEGORY eType) const {
   switch (eType) {
     case FX_LOCALEDATETIMESUBCATEGORY_Short:
-      wsPattern = GetSymbol(XFA_Element::DatePatterns, L"short");
-      break;
+      return GetSymbol(XFA_Element::DatePatterns, L"short");
     case FX_LOCALEDATETIMESUBCATEGORY_Medium:
     case FX_LOCALEDATETIMESUBCATEGORY_Default:
-      wsPattern = GetSymbol(XFA_Element::DatePatterns, L"med");
-      break;
+      return GetSymbol(XFA_Element::DatePatterns, L"med");
     case FX_LOCALEDATETIMESUBCATEGORY_Full:
-      wsPattern = GetSymbol(XFA_Element::DatePatterns, L"full");
-      break;
+      return GetSymbol(XFA_Element::DatePatterns, L"full");
     case FX_LOCALEDATETIMESUBCATEGORY_Long:
-      wsPattern = GetSymbol(XFA_Element::DatePatterns, L"long");
-      break;
+      return GetSymbol(XFA_Element::DatePatterns, L"long");
   }
+  return CFX_WideString();
 }
 
-void CXFA_NodeLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                     CFX_WideString& wsPattern) const {
+CFX_WideString CXFA_NodeLocale::GetTimePattern(
+    FX_LOCALEDATETIMESUBCATEGORY eType) const {
   switch (eType) {
     case FX_LOCALEDATETIMESUBCATEGORY_Short:
-      wsPattern = GetSymbol(XFA_Element::TimePatterns, L"short");
-      break;
+      return GetSymbol(XFA_Element::TimePatterns, L"short");
     case FX_LOCALEDATETIMESUBCATEGORY_Medium:
     case FX_LOCALEDATETIMESUBCATEGORY_Default:
-      wsPattern = GetSymbol(XFA_Element::TimePatterns, L"med");
-      break;
+      return GetSymbol(XFA_Element::TimePatterns, L"med");
     case FX_LOCALEDATETIMESUBCATEGORY_Full:
-      wsPattern = GetSymbol(XFA_Element::TimePatterns, L"full");
-      break;
+      return GetSymbol(XFA_Element::TimePatterns, L"full");
     case FX_LOCALEDATETIMESUBCATEGORY_Long:
-      wsPattern = GetSymbol(XFA_Element::TimePatterns, L"long");
-      break;
+      return GetSymbol(XFA_Element::TimePatterns, L"long");
   }
+  return CFX_WideString();
 }
 
-void CXFA_NodeLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                                    CFX_WideString& wsPattern) const {
-  wsPattern = XFA_PatternToString(eType);
+CFX_WideString CXFA_NodeLocale::GetNumPattern(
+    FX_LOCALENUMSUBCATEGORY eType) const {
+  return XFA_PatternToString(eType);
 }
 
 CXFA_Node* CXFA_NodeLocale::GetNodeByName(CXFA_Node* pParent,
@@ -180,13 +161,14 @@
   CXFA_Node* pCalendar =
       m_pLocale ? m_pLocale->GetChild(0, XFA_Element::CalendarSymbols)
                 : nullptr;
-  if (pCalendar) {
-    CXFA_Node* pNode = pCalendar->GetFirstChildByClass(eElement);
-    for (; pNode; pNode = pNode->GetNextSameClassSibling(eElement)) {
-      if (pNode->GetBoolean(XFA_ATTRIBUTE_Abbr) == bAbbr) {
-        CXFA_Node* pSymbol = pNode->GetChild(index, XFA_Element::Unknown);
-        return pSymbol ? pSymbol->GetContent() : CFX_WideString();
-      }
+  if (!pCalendar)
+    return CFX_WideString();
+
+  CXFA_Node* pNode = pCalendar->GetFirstChildByClass(eElement);
+  for (; pNode; pNode = pNode->GetNextSameClassSibling(eElement)) {
+    if (pNode->GetBoolean(XFA_ATTRIBUTE_Abbr) == bAbbr) {
+      CXFA_Node* pSymbol = pNode->GetChild(index, XFA_Element::Unknown);
+      return pSymbol ? pSymbol->GetContent() : CFX_WideString();
     }
   }
   return CFX_WideString();
diff --git a/xfa/fxfa/parser/cxfa_nodelocale.h b/xfa/fxfa/parser/cxfa_nodelocale.h
index db3b230..0059d19 100644
--- a/xfa/fxfa/parser/cxfa_nodelocale.h
+++ b/xfa/fxfa/parser/cxfa_nodelocale.h
@@ -21,27 +21,20 @@
 
   // IFX_Locale
   CFX_WideString GetName() const override;
-  void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                         CFX_WideString& wsNumSymbol) const override;
+  CFX_WideString GetNumbericSymbol(FX_LOCALENUMSYMBOL eType) const override;
 
-  void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const override;
-  void GetMonthName(int32_t nMonth,
-                    CFX_WideString& wsMonthName,
-                    bool bAbbr = true) const override;
-  void GetDayName(int32_t nWeek,
-                  CFX_WideString& wsDayName,
-                  bool bAbbr = true) const override;
-  void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                       bool bAM = true) const override;
-  void GetTimeZone(FX_TIMEZONE* tz) const override;
-  void GetEraName(CFX_WideString& wsEraName, bool bAD = true) const override;
+  CFX_WideString GetDateTimeSymbols() const override;
+  CFX_WideString GetMonthName(int32_t nMonth, bool bAbbr) const override;
+  CFX_WideString GetDayName(int32_t nWeek, bool bAbbr) const override;
+  CFX_WideString GetMeridiemName(bool bAM) const override;
+  FX_TIMEZONE GetTimeZone() const override;
+  CFX_WideString GetEraName(bool bAD) const override;
 
-  void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                      CFX_WideString& wsPattern) const override;
-  void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                      CFX_WideString& wsPattern) const override;
-  void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                     CFX_WideString& wsPattern) const override;
+  CFX_WideString GetDatePattern(
+      FX_LOCALEDATETIMESUBCATEGORY eType) const override;
+  CFX_WideString GetTimePattern(
+      FX_LOCALEDATETIMESUBCATEGORY eType) const override;
+  CFX_WideString GetNumPattern(FX_LOCALENUMSUBCATEGORY eType) const override;
 
  private:
   CXFA_Node* GetNodeByName(CXFA_Node* pParent,
diff --git a/xfa/fxfa/parser/cxfa_timezoneprovider.cpp b/xfa/fxfa/parser/cxfa_timezoneprovider.cpp
index 65ce61e..ae31977 100644
--- a/xfa/fxfa/parser/cxfa_timezoneprovider.cpp
+++ b/xfa/fxfa/parser/cxfa_timezoneprovider.cpp
@@ -30,7 +30,3 @@
 }
 
 CXFA_TimeZoneProvider::~CXFA_TimeZoneProvider() {}
-
-void CXFA_TimeZoneProvider::GetTimeZone(FX_TIMEZONE* tz) const {
-  *tz = m_tz;
-}
diff --git a/xfa/fxfa/parser/cxfa_timezoneprovider.h b/xfa/fxfa/parser/cxfa_timezoneprovider.h
index 05230cc..493da32 100644
--- a/xfa/fxfa/parser/cxfa_timezoneprovider.h
+++ b/xfa/fxfa/parser/cxfa_timezoneprovider.h
@@ -14,7 +14,7 @@
   CXFA_TimeZoneProvider();
   ~CXFA_TimeZoneProvider();
 
-  void GetTimeZone(FX_TIMEZONE* tz) const;
+  FX_TIMEZONE GetTimeZone() const { return m_tz; }
 
  private:
   FX_TIMEZONE m_tz;
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index e6cd75f..6da501b 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -1486,7 +1486,7 @@
             return true;
         }
       }
-      CFX_WideString wsDataPicture, wsTimePicture;
+
       IFX_Locale* pLocale = GetLocal();
       if (!pLocale)
         return false;
@@ -1494,19 +1494,18 @@
       uint32_t dwType = widgetValue.GetType();
       switch (dwType) {
         case XFA_VT_DATE:
-          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsPicture);
+          wsPicture =
+              pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium);
           break;
         case XFA_VT_TIME:
-          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsPicture);
+          wsPicture =
+              pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium);
           break;
         case XFA_VT_DATETIME:
-          pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsDataPicture);
-          pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium,
-                                  wsTimePicture);
-          wsPicture = wsDataPicture + L"T" + wsTimePicture;
+          wsPicture =
+              pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium) +
+              L"T" +
+              pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Medium);
           break;
         case XFA_VT_DECIMAL:
         case XFA_VT_FLOAT:
@@ -1516,7 +1515,6 @@
       }
       return true;
     }
-
     case XFA_VALUEPICTURE_Edit: {
       CXFA_Node* pUI = m_pNode->GetChild(0, XFA_Element::Ui);
       if (pUI) {
@@ -1525,32 +1523,29 @@
             return true;
         }
       }
-      {
-        CFX_WideString wsDataPicture, wsTimePicture;
-        IFX_Locale* pLocale = GetLocal();
-        if (!pLocale) {
-          return false;
-        }
-        uint32_t dwType = widgetValue.GetType();
-        switch (dwType) {
-          case XFA_VT_DATE:
-            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsPicture);
-            break;
-          case XFA_VT_TIME:
-            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsPicture);
-            break;
-          case XFA_VT_DATETIME:
-            pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsDataPicture);
-            pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short,
-                                    wsTimePicture);
-            wsPicture = wsDataPicture + L"T" + wsTimePicture;
-            break;
-          default:
-            break;
-        }
+
+      IFX_Locale* pLocale = GetLocal();
+      if (!pLocale)
+        return false;
+
+      uint32_t dwType = widgetValue.GetType();
+      switch (dwType) {
+        case XFA_VT_DATE:
+          wsPicture =
+              pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short);
+          break;
+        case XFA_VT_TIME:
+          wsPicture =
+              pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short);
+          break;
+        case XFA_VT_DATETIME:
+          wsPicture =
+              pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Short) +
+              L"T" +
+              pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short);
+          break;
+        default:
+          break;
       }
       return true;
     }
@@ -1783,8 +1778,8 @@
     return;
 
   CFX_WideString wsSrcNum = wsValue;
-  CFX_WideString wsGroupSymbol;
-  pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping, wsGroupSymbol);
+  CFX_WideString wsGroupSymbol =
+      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Grouping);
   bool bNeg = false;
   if (wsSrcNum[0] == '-') {
     bNeg = true;
@@ -1806,15 +1801,12 @@
       wsOutput += wsSrcNum[i];
     }
     if (dot_index < len) {
-      CFX_WideString wsSymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsSymbol);
-      wsOutput += wsSymbol;
+      wsOutput += pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
       wsOutput += wsSrcNum.Right(len - dot_index - 1);
     }
     if (bNeg) {
-      CFX_WideString wsMinusymbol;
-      pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus, wsMinusymbol);
-      wsOutput = wsMinusymbol + wsOutput;
+      wsOutput =
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
     }
   }
 }
diff --git a/xfa/fxfa/parser/cxfa_xmllocale.cpp b/xfa/fxfa/parser/cxfa_xmllocale.cpp
index c4aae15..cbac777 100644
--- a/xfa/fxfa/parser/cxfa_xmllocale.cpp
+++ b/xfa/fxfa/parser/cxfa_xmllocale.cpp
@@ -25,8 +25,8 @@
   return m_pLocaleData ? m_pLocaleData->GetAttrValue("name") : CFX_WideString();
 }
 
-void CXFA_XMLLocale::GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                       CFX_WideString& wsNumSymbol) const {
+CFX_WideString CXFA_XMLLocale::GetNumbericSymbol(
+    FX_LOCALENUMSYMBOL eType) const {
   CFX_ByteString bsSymbols;
   CFX_WideString wsName;
   switch (eType) {
@@ -59,87 +59,77 @@
       wsName = L"isoname";
       break;
     default:
-      return;
+      return CFX_WideString();
   }
   CXML_Element* pElement = m_pLocaleData->GetElement("", bsSymbols.AsStringC());
   if (!pElement)
-    return;
+    return CFX_WideString();
 
-  GetPattern(pElement,
-             CFX_ByteStringC(bsSymbols.c_str(), bsSymbols.GetLength() - 1),
-             wsName.AsStringC(), wsNumSymbol);
+  return GetPattern(
+      pElement, CFX_ByteStringC(bsSymbols.c_str(), bsSymbols.GetLength() - 1),
+      wsName.AsStringC());
 }
 
-void CXFA_XMLLocale::GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const {
+CFX_WideString CXFA_XMLLocale::GetDateTimeSymbols() const {
   if (!m_pLocaleData)
-    return;
+    return CFX_WideString();
 
   CFX_ByteString bsSpace;
   CXML_Element* pNumberSymbols =
       m_pLocaleData->GetElement(bsSpace.AsStringC(), "dateTimeSymbols");
-  if (!pNumberSymbols)
-    return;
-
-  wsDtSymbol = pNumberSymbols->GetContent(0);
+  return pNumberSymbols ? pNumberSymbols->GetContent(0) : CFX_WideString();
 }
 
-void CXFA_XMLLocale::GetMonthName(int32_t nMonth,
-                                  CFX_WideString& wsMonthName,
-                                  bool bAbbr) const {
-  wsMonthName = GetCalendarSymbol("month", nMonth, bAbbr);
+CFX_WideString CXFA_XMLLocale::GetMonthName(int32_t nMonth, bool bAbbr) const {
+  return GetCalendarSymbol("month", nMonth, bAbbr);
 }
 
-void CXFA_XMLLocale::GetDayName(int32_t nWeek,
-                                CFX_WideString& wsDayName,
-                                bool bAbbr) const {
-  wsDayName = GetCalendarSymbol("day", nWeek, bAbbr);
+CFX_WideString CXFA_XMLLocale::GetDayName(int32_t nWeek, bool bAbbr) const {
+  return GetCalendarSymbol("day", nWeek, bAbbr);
 }
 
-void CXFA_XMLLocale::GetMeridiemName(CFX_WideString& wsMeridiemName,
-                                     bool bAM) const {
-  wsMeridiemName = GetCalendarSymbol("meridiem", bAM ? 0 : 1, false);
+CFX_WideString CXFA_XMLLocale::GetMeridiemName(bool bAM) const {
+  return GetCalendarSymbol("meridiem", bAM ? 0 : 1, false);
 }
 
-void CXFA_XMLLocale::GetTimeZone(FX_TIMEZONE* tz) const {
-  CXFA_TimeZoneProvider provider;
-  provider.GetTimeZone(tz);
+FX_TIMEZONE CXFA_XMLLocale::GetTimeZone() const {
+  return CXFA_TimeZoneProvider().GetTimeZone();
 }
 
-void CXFA_XMLLocale::GetEraName(CFX_WideString& wsEraName, bool bAD) const {
-  wsEraName = GetCalendarSymbol("era", bAD ? 1 : 0, false);
+CFX_WideString CXFA_XMLLocale::GetEraName(bool bAD) const {
+  return GetCalendarSymbol("era", bAD ? 1 : 0, false);
 }
 
 CFX_WideString CXFA_XMLLocale::GetCalendarSymbol(const CFX_ByteStringC& symbol,
                                                  int index,
                                                  bool bAbbr) const {
+  if (!m_pLocaleData)
+    return CFX_WideString();
+
+  CXML_Element* pChild = m_pLocaleData->GetElement("", "calendarSymbols");
+  if (!pChild)
+    return CFX_WideString();
+
   CFX_ByteString pstrSymbolNames = symbol + "Names";
-  CFX_WideString wsSymbolName = L"";
-  if (m_pLocaleData) {
-    CXML_Element* pChild = m_pLocaleData->GetElement("", "calendarSymbols");
-    if (pChild) {
-      CXML_Element* pSymbolNames =
-          pChild->GetElement("", pstrSymbolNames.AsStringC());
-      if (pSymbolNames) {
-        if ((!!pSymbolNames->GetAttrInteger("abbr")) != bAbbr) {
-          pSymbolNames = pChild->GetElement("", pstrSymbolNames.AsStringC(), 1);
-        }
-        if (pSymbolNames && (!!pSymbolNames->GetAttrInteger("abbr")) == bAbbr) {
-          CXML_Element* pSymbolName =
-              pSymbolNames->GetElement("", symbol, index);
-          if (pSymbolName)
-            wsSymbolName = pSymbolName->GetContent(0);
-        }
-      }
-    }
-  }
-  return wsSymbolName;
+  CXML_Element* pSymbolNames =
+      pChild->GetElement("", pstrSymbolNames.AsStringC());
+  if (!pSymbolNames)
+    return CFX_WideString();
+  if ((!!pSymbolNames->GetAttrInteger("abbr")) != bAbbr)
+    pSymbolNames = pChild->GetElement("", pstrSymbolNames.AsStringC(), 1);
+
+  if (!pSymbolNames || (!!pSymbolNames->GetAttrInteger("abbr")) != bAbbr)
+    return CFX_WideString();
+
+  CXML_Element* pSymbolName = pSymbolNames->GetElement("", symbol, index);
+  return pSymbolName ? pSymbolName->GetContent(0) : CFX_WideString();
 }
 
-void CXFA_XMLLocale::GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                    CFX_WideString& wsPattern) const {
+CFX_WideString CXFA_XMLLocale::GetDatePattern(
+    FX_LOCALEDATETIMESUBCATEGORY eType) const {
   CXML_Element* pElement = m_pLocaleData->GetElement("", "datePatterns");
   if (!pElement)
-    return;
+    return CFX_WideString();
 
   CFX_WideString wsName;
   switch (eType) {
@@ -157,14 +147,14 @@
       wsName = L"long";
       break;
   }
-  GetPattern(pElement, "datePattern", wsName.AsStringC(), wsPattern);
+  return GetPattern(pElement, "datePattern", wsName.AsStringC());
 }
 
-void CXFA_XMLLocale::GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                                    CFX_WideString& wsPattern) const {
+CFX_WideString CXFA_XMLLocale::GetTimePattern(
+    FX_LOCALEDATETIMESUBCATEGORY eType) const {
   CXML_Element* pElement = m_pLocaleData->GetElement("", "timePatterns");
   if (!pElement)
-    return;
+    return CFX_WideString();
 
   CFX_WideString wsName;
   switch (eType) {
@@ -182,28 +172,24 @@
       wsName = L"long";
       break;
   }
-  GetPattern(pElement, "timePattern", wsName.AsStringC(), wsPattern);
+  return GetPattern(pElement, "timePattern", wsName.AsStringC());
 }
 
-void CXFA_XMLLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                                   CFX_WideString& wsPattern) const {
-  CXML_Element* pElement = m_pLocaleData->GetElement("", "numberPatterns");
-  if (!pElement)
-    return;
-
-  wsPattern = XFA_PatternToString(eType);
+CFX_WideString CXFA_XMLLocale::GetNumPattern(
+    FX_LOCALENUMSUBCATEGORY eType) const {
+  return m_pLocaleData->GetElement("", "numberPatterns")
+             ? XFA_PatternToString(eType)
+             : CFX_WideString();
 }
 
-void CXFA_XMLLocale::GetPattern(CXML_Element* pElement,
-                                const CFX_ByteStringC& bsTag,
-                                const CFX_WideStringC& wsName,
-                                CFX_WideString& wsPattern) const {
+CFX_WideString CXFA_XMLLocale::GetPattern(CXML_Element* pElement,
+                                          const CFX_ByteStringC& bsTag,
+                                          const CFX_WideStringC& wsName) const {
   int32_t iCount = pElement->CountElements("", bsTag);
   for (int32_t i = 0; i < iCount; i++) {
     CXML_Element* pChild = pElement->GetElement("", bsTag, i);
-    if (pChild->GetAttrValue("name") == wsName) {
-      wsPattern = pChild->GetContent(0);
-      return;
-    }
+    if (pChild->GetAttrValue("name") == wsName)
+      return pChild->GetContent(0);
   }
+  return CFX_WideString();
 }
diff --git a/xfa/fxfa/parser/cxfa_xmllocale.h b/xfa/fxfa/parser/cxfa_xmllocale.h
index b631697..7616c11 100644
--- a/xfa/fxfa/parser/cxfa_xmllocale.h
+++ b/xfa/fxfa/parser/cxfa_xmllocale.h
@@ -19,33 +19,25 @@
 
   // IFX_Locale
   CFX_WideString GetName() const override;
-  void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                         CFX_WideString& wsNumSymbol) const override;
+  CFX_WideString GetNumbericSymbol(FX_LOCALENUMSYMBOL eType) const override;
 
-  void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const override;
-  void GetMonthName(int32_t nMonth,
-                    CFX_WideString& wsMonthName,
-                    bool bAbbr = true) const override;
-  void GetDayName(int32_t nWeek,
-                  CFX_WideString& wsDayName,
-                  bool bAbbr = true) const override;
-  void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                       bool bAM = true) const override;
-  void GetTimeZone(FX_TIMEZONE* tz) const override;
-  void GetEraName(CFX_WideString& wsEraName, bool bAD = true) const override;
+  CFX_WideString GetDateTimeSymbols() const override;
+  CFX_WideString GetMonthName(int32_t nMonth, bool bAbbr) const override;
+  CFX_WideString GetDayName(int32_t nWeek, bool bAbbr) const override;
+  CFX_WideString GetMeridiemName(bool bAM) const override;
+  FX_TIMEZONE GetTimeZone() const override;
+  CFX_WideString GetEraName(bool bAD) const override;
 
-  void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                      CFX_WideString& wsPattern) const override;
-  void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                      CFX_WideString& wsPattern) const override;
-  void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                     CFX_WideString& wsPattern) const override;
+  CFX_WideString GetDatePattern(
+      FX_LOCALEDATETIMESUBCATEGORY eType) const override;
+  CFX_WideString GetTimePattern(
+      FX_LOCALEDATETIMESUBCATEGORY eType) const override;
+  CFX_WideString GetNumPattern(FX_LOCALENUMSUBCATEGORY eType) const override;
 
  private:
-  void GetPattern(CXML_Element* pElement,
-                  const CFX_ByteStringC& bsTag,
-                  const CFX_WideStringC& wsName,
-                  CFX_WideString& wsPattern) const;
+  CFX_WideString GetPattern(CXML_Element* pElement,
+                            const CFX_ByteStringC& bsTag,
+                            const CFX_WideStringC& wsName) const;
   CFX_WideString GetCalendarSymbol(const CFX_ByteStringC& symbol,
                                    int index,
                                    bool bAbbr) const;
