diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java
index a7aa8ea..7eb4a5d 100644
--- a/src/com/android/settings/MainClear.java
+++ b/src/com/android/settings/MainClear.java
@@ -16,6 +16,9 @@
 
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 import android.accounts.Account;
@@ -23,6 +26,7 @@
 import android.accounts.AuthenticatorDescription;
 import android.app.ActionBar;
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -491,8 +495,17 @@
             if (profilesSize > 1) {
                 View titleView = Utils.inflateCategoryHeader(inflater, contents);
                 final TextView titleText = (TextView) titleView.findViewById(android.R.id.title);
-                titleText.setText(userInfo.isManagedProfile() ? R.string.category_work
-                        : R.string.category_personal);
+
+                DevicePolicyManager devicePolicyManager =
+                        context.getSystemService(DevicePolicyManager.class);
+
+                if (userInfo.isManagedProfile()) {
+                    titleText.setText(devicePolicyManager.getString(
+                            WORK_CATEGORY_HEADER, () -> getString(R.string.category_work)));
+                } else {
+                    titleText.setText(devicePolicyManager.getString(
+                            PERSONAL_CATEGORY_HEADER, () -> getString(R.string.category_personal)));
+                }
                 contents.addView(titleView);
             }
 
diff --git a/src/com/android/settings/RemoteBugreportActivity.java b/src/com/android/settings/RemoteBugreportActivity.java
index 2c88ec3..12dce90 100644
--- a/src/com/android/settings/RemoteBugreportActivity.java
+++ b/src/com/android/settings/RemoteBugreportActivity.java
@@ -15,6 +15,11 @@
  */
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_FINISHED_REQUEST_CONSENT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_NOT_FINISHED_REQUEST_CONSENT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARING_REMOTE_BUGREPORT_MESSAGE;
+
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
@@ -42,12 +47,16 @@
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
+
         final int notificationType = getIntent().getIntExtra(
                 DevicePolicyManager.EXTRA_BUGREPORT_NOTIFICATION_TYPE, -1);
 
         if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED) {
             AlertDialog dialog = new AlertDialog.Builder(this)
-                    .setMessage(R.string.sharing_remote_bugreport_dialog_message)
+                    .setMessage(devicePolicyManager.getString(
+                            SHARING_REMOTE_BUGREPORT_MESSAGE,
+                            () -> getString(R.string.sharing_remote_bugreport_dialog_message)))
                     .setOnDismissListener(new DialogInterface.OnDismissListener() {
                         @Override
                         public void onDismiss(DialogInterface dialog) {
@@ -65,12 +74,21 @@
         } else if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
                 || notificationType
                         == DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED) {
+
+            int defaultMessageId =  notificationType
+                    == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
+                    ? R.string.share_remote_bugreport_dialog_message
+                    : R.string.share_remote_bugreport_dialog_message_finished;
+            String overrideMessageId = notificationType
+                    == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
+                    ? SHARE_REMOTE_BUGREPORT_NOT_FINISHED_REQUEST_CONSENT
+                    : SHARE_REMOTE_BUGREPORT_FINISHED_REQUEST_CONSENT;
+
             AlertDialog dialog = new AlertDialog.Builder(this)
-                    .setTitle(R.string.share_remote_bugreport_dialog_title)
-                    .setMessage(notificationType
-                                    == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
-                            ? R.string.share_remote_bugreport_dialog_message
-                            : R.string.share_remote_bugreport_dialog_message_finished)
+                    .setTitle(devicePolicyManager.getString(SHARE_REMOTE_BUGREPORT_DIALOG_TITLE,
+                            () -> getString(R.string.share_remote_bugreport_dialog_title)))
+                    .setMessage(devicePolicyManager.getString(overrideMessageId,
+                            () -> getString(defaultMessageId)))
                     .setOnDismissListener(new DialogInterface.OnDismissListener() {
                         @Override
                         public void onDismiss(DialogInterface dialog) {
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java
index ae25ba9..fffb8eb 100644
--- a/src/com/android/settings/TrustedCredentialsSettings.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
 import static android.widget.LinearLayout.LayoutParams.MATCH_PARENT;
 import static android.widget.LinearLayout.LayoutParams.WRAP_CONTENT;
 
@@ -82,6 +84,7 @@
 
     private static final String TAG = "TrustedCredentialsSettings";
 
+    private DevicePolicyManager mDevicePolicyManager;
     private UserManager mUserManager;
     private KeyguardManager mKeyguardManager;
     private int mTrustAllCaUserId;
@@ -179,6 +182,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         final Activity activity = getActivity();
+        mDevicePolicyManager = activity.getSystemService(DevicePolicyManager.class);
         mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
         mKeyguardManager = (KeyguardManager) activity
                 .getSystemService(Context.KEYGUARD_SERVICE);
@@ -385,9 +389,12 @@
 
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
             if (getUserInfoByGroup(groupPosition).isManagedProfile()) {
-                title.setText(R.string.category_work);
+                title.setText(mDevicePolicyManager.getString(WORK_CATEGORY_HEADER,
+                        () -> getString(R.string.category_work)));
             } else {
-                title.setText(R.string.category_personal);
+                title.setText(mDevicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
+                        () -> getString(R.string.category_personal)));
+
             }
             title.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
 
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index 42b2334..8f387d4 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -16,6 +16,14 @@
 
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_CATEGORY_PERSONAL;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_CATEGORY_WORK;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_BY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_PROFILE_SETTINGS_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_WORK_PROFILE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOT_AVAILABLE;
 import static android.content.Intent.EXTRA_USER;
 import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
 import static android.os.UserManager.DISALLOW_REMOVE_MANAGED_PROFILE;
@@ -24,6 +32,7 @@
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -85,6 +94,7 @@
     private static final String PREF_KEY_WORK_PROFILE_SETTING = "work_profile_setting";
 
     private UserManager mUm;
+    private DevicePolicyManager mDpm;
     private SparseArray<ProfileData> mProfiles = new SparseArray<ProfileData>();
     private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver =
             new ManagedProfileBroadcastReceiver();
@@ -146,6 +156,7 @@
             @ProfileSelectFragment.ProfileType int type) {
         super(context);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mDpm = context.getSystemService(DevicePolicyManager.class);
         mAuthorities = authorities;
         mFragment = parent;
         if (mAuthorities != null) {
@@ -188,13 +199,16 @@
                         UserHandle.myUserId())) {
                     final SearchIndexableRaw data = new SearchIndexableRaw(mContext);
                     data.key = PREF_KEY_REMOVE_PROFILE;
-                    data.title = res.getString(R.string.remove_managed_profile_label);
+                    data.title = mDpm.getString(
+                            REMOVE_WORK_PROFILE,
+                            () -> res.getString(R.string.remove_managed_profile_label));
                     data.screenTitle = screenTitle;
                     rawData.add(data);
                 }
                 final SearchIndexableRaw data = new SearchIndexableRaw(mContext);
                 data.key = PREF_KEY_WORK_PROFILE_SETTING;
-                data.title = res.getString(R.string.managed_profile_settings_title);
+                data.title = mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
+                        () -> res.getString(R.string.managed_profile_settings_title));
                 data.screenTitle = screenTitle;
                 rawData.add(data);
             }
@@ -253,7 +267,8 @@
                 new SubSettingLauncher(mContext)
                         .setSourceMetricsCategory(metricsCategory)
                         .setDestination(ManagedProfileSettings.class.getName())
-                        .setTitleRes(R.string.managed_profile_settings_title)
+                        .setTitleText(mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
+                                () -> mContext.getString(R.string.managed_profile_settings_title)))
                         .setArguments(arguments)
                         .launch();
 
@@ -331,11 +346,15 @@
             preferenceGroup.setContentDescription(title);
         } else if (userInfo.isManagedProfile()) {
             if (mType == ProfileSelectFragment.ProfileType.ALL) {
-                preferenceGroup.setTitle(R.string.category_work);
+                preferenceGroup.setTitle(
+                        mDpm.getString(WORK_CATEGORY_HEADER,
+                                () -> mContext.getString(R.string.category_work)));
                 final String workGroupSummary = getWorkGroupSummary(context, userInfo);
                 preferenceGroup.setSummary(workGroupSummary);
                 preferenceGroup.setContentDescription(
-                        mContext.getString(R.string.accessibility_category_work, workGroupSummary));
+                        mDpm.getString(ACCESSIBILITY_CATEGORY_WORK, () ->
+                        mContext.getString(
+                                R.string.accessibility_category_work, workGroupSummary)));
             }
             profileData.removeWorkProfilePreference = newRemoveWorkProfilePreference();
             mHelper.enforceRestrictionOnPreference(profileData.removeWorkProfilePreference,
@@ -343,9 +362,12 @@
             profileData.managedProfilePreference = newManagedProfileSettings();
         } else {
             if (mType == ProfileSelectFragment.ProfileType.ALL) {
-                preferenceGroup.setTitle(R.string.category_personal);
+                preferenceGroup.setTitle(
+                        mDpm.getString(PERSONAL_CATEGORY_HEADER,
+                                () -> mContext.getString(R.string.category_personal)));
                 preferenceGroup.setContentDescription(
-                        mContext.getString(R.string.accessibility_category_personal));
+                        mDpm.getString(ACCESSIBILITY_CATEGORY_PERSONAL, () ->
+                        mContext.getString(R.string.accessibility_category_personal)));
             }
         }
         final PreferenceScreen screen = mFragment.getPreferenceScreen();
@@ -378,7 +400,9 @@
         RestrictedPreference preference = new RestrictedPreference(
                 mFragment.getPreferenceManager().getContext());
         preference.setKey(PREF_KEY_REMOVE_PROFILE);
-        preference.setTitle(R.string.remove_managed_profile_label);
+        preference.setTitle(
+                mDpm.getString(REMOVE_WORK_PROFILE,
+                        () -> mContext.getString(R.string.remove_managed_profile_label)));
         preference.setIcon(R.drawable.ic_delete);
         preference.setOnPreferenceClickListener(this);
         preference.setOrder(ORDER_LAST);
@@ -389,7 +413,8 @@
     private Preference newManagedProfileSettings() {
         Preference preference = new Preference(mFragment.getPreferenceManager().getContext());
         preference.setKey(PREF_KEY_WORK_PROFILE_SETTING);
-        preference.setTitle(R.string.managed_profile_settings_title);
+        preference.setTitle(mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
+                () -> mContext.getString(R.string.managed_profile_settings_title)));
         preference.setIcon(R.drawable.ic_settings_24dp);
         preference.setOnPreferenceClickListener(this);
         preference.setOrder(ORDER_NEXT_TO_LAST);
@@ -403,7 +428,8 @@
             return null;
         }
         CharSequence appLabel = packageManager.getApplicationLabel(adminApplicationInfo);
-        return mContext.getString(R.string.managing_admin, appLabel);
+        return mDpm.getString(MANAGED_BY,
+                () -> mContext.getString(R.string.managing_admin, appLabel), appLabel);
     }
 
     void cleanUpPreferences() {
@@ -482,7 +508,9 @@
             mProfileNotAvailablePreference.setIcon(R.drawable.empty_icon);
             mProfileNotAvailablePreference.setTitle(null);
             mProfileNotAvailablePreference.setSummary(
-                    R.string.managed_profile_not_available_label);
+                    mDpm.getString(
+                            WORK_PROFILE_NOT_AVAILABLE, () -> mContext.getString(
+                    R.string.managed_profile_not_available_label)));
             profileData.preferenceGroup.addPreference(mProfileNotAvailablePreference);
         }
         if (profileData.removeWorkProfilePreference != null) {
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index 23b6157..7c72d6c 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -16,10 +16,14 @@
 
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_PERSONAL_ACCOUNT_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_WORK_ACCOUNT_TITLE;
+
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.app.Activity;
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -154,10 +158,20 @@
         UserInfo user = um.getUserInfo(mUserHandle.getIdentifier());
         boolean isWorkProfile = user != null ? user.isManagedProfile() : false;
         CharSequence currentTitle = getActivity().getTitle();
+
+        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
+
         String accessibilityTitle =
-                getString(isWorkProfile
-                        ? R.string.accessibility_work_account_title
-                        : R.string.accessibility_personal_account_title, currentTitle);
+                isWorkProfile
+                        ? devicePolicyManager.getString(ACCESSIBILITY_WORK_ACCOUNT_TITLE,
+                                () -> getString(R.string.accessibility_work_account_title,
+                                        currentTitle), currentTitle)
+                                : devicePolicyManager.getString(
+                                        ACCESSIBILITY_PERSONAL_ACCOUNT_TITLE,
+                                        () -> getString(
+                                                R.string.accessibility_personal_account_title,
+                                                currentTitle), currentTitle);
+
         getActivity().setTitle(Utils.createAccessibleSequence(currentTitle, accessibilityTitle));
     }
 
diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
index 2ce2206..58ef7f1 100644
--- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
+++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
@@ -15,12 +15,15 @@
  */
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_ACCOUNT_FAILED_ADMIN_RESTRICTION;
+
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -213,7 +216,9 @@
 
             return new AlertDialog.Builder(context)
                     .setTitle(R.string.remove_account_label)
-                    .setMessage(R.string.remove_account_failed)
+                    .setMessage(getContext().getSystemService(DevicePolicyManager.class)
+                            .getString(REMOVE_ACCOUNT_FAILED_ADMIN_RESTRICTION,
+                                    () -> getString(R.string.remove_account_failed)))
                     .setPositiveButton(android.R.string.ok, null)
                     .create();
         }
diff --git a/src/com/android/settings/accounts/WorkModePreferenceController.java b/src/com/android/settings/accounts/WorkModePreferenceController.java
index 11a620b..aa54d33 100644
--- a/src/com/android/settings/accounts/WorkModePreferenceController.java
+++ b/src/com/android/settings/accounts/WorkModePreferenceController.java
@@ -13,6 +13,10 @@
  */
 package com.android.settings.accounts;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_OFF_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_ON_SUMMARY;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -40,6 +44,7 @@
 
     private UserManager mUserManager;
     private UserHandle mManagedUser;
+    private DevicePolicyManager mDevicePolicyManager;
 
     private Preference mPreference;
     private IntentFilter mIntentFilter;
@@ -47,6 +52,7 @@
     public WorkModePreferenceController(Context context, String key) {
         super(context, key);
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
         mIntentFilter = new IntentFilter();
         mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
         mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
@@ -80,9 +86,15 @@
 
     @Override
     public CharSequence getSummary() {
-        return mContext.getText(isChecked()
-                ? R.string.work_mode_on_summary
-                : R.string.work_mode_off_summary);
+        if (isChecked()) {
+            return mDevicePolicyManager
+                    .getString(WORK_PROFILE_SETTING_ON_SUMMARY,
+                            () -> mContext.getString(R.string.work_mode_on_summary));
+        }
+
+        return mDevicePolicyManager
+                .getString(WORK_PROFILE_SETTING_OFF_SUMMARY,
+                        () -> mContext.getString(R.string.work_mode_off_summary));
     }
 
     private boolean isChecked() {
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 7104340..0f21097 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -219,7 +219,7 @@
         }
     }
 
-    public static void startAppInfoFragment(Class<?> fragment, int titleRes,
+    public static void startAppInfoFragment(Class<?> fragment, String title,
             String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) {
         final Bundle args = new Bundle();
         args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg);
@@ -228,7 +228,7 @@
         new SubSettingLauncher(source.getContext())
                 .setDestination(fragment.getName())
                 .setSourceMetricsCategory(sourceMetricsCategory)
-                .setTitleRes(titleRes)
+                .setTitleText(title)
                 .setArguments(args)
                 .setUserHandle(new UserHandle(UserHandle.getUserId(uid)))
                 .setResultListener(source, request)
diff --git a/src/com/android/settings/applications/AppsPreferenceController.java b/src/com/android/settings/applications/AppsPreferenceController.java
index 9fbd5c1..fad513e 100644
--- a/src/com/android/settings/applications/AppsPreferenceController.java
+++ b/src/com/android/settings/applications/AppsPreferenceController.java
@@ -211,7 +211,8 @@
                 pref.setOrder(showAppsCount++);
                 pref.setOnPreferenceClickListener(preference -> {
                     AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class,
-                            R.string.application_info_label, pkgName, appEntry.info.uid,
+                            mContext.getString(R.string.application_info_label),
+                            pkgName, appEntry.info.uid,
                             mHost, 1001 /*RequestCode*/, getMetricsCategory());
                     return true;
                 });
diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java
index 4681fd8..ef259d2 100644
--- a/src/com/android/settings/applications/UsageAccessDetails.java
+++ b/src/com/android/settings/applications/UsageAccessDetails.java
@@ -17,6 +17,7 @@
 
 import static android.app.AppOpsManager.OP_GET_USAGE_STATS;
 import static android.app.AppOpsManager.OP_LOADER_USAGE_STATS;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_DISABLE_USAGE_ACCESS_WARNING;
 
 import android.Manifest;
 import android.app.AppOpsManager;
@@ -96,7 +97,8 @@
                     new AlertDialog.Builder(getContext())
                             .setIcon(com.android.internal.R.drawable.ic_dialog_alert_material)
                             .setTitle(android.R.string.dialog_alert_title)
-                            .setMessage(R.string.work_profile_usage_access_warning)
+                            .setMessage(mDpm.getString(WORK_PROFILE_DISABLE_USAGE_ACCESS_WARNING,
+                                    () -> getString(R.string.work_profile_usage_access_warning)))
                             .setPositiveButton(R.string.okay, null)
                             .show();
                 }
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 01bc2f1..93b7c10 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -645,8 +645,8 @@
     }
 
     private void startAppInfoFragment(Class<?> fragment, int titleRes) {
-        AppInfoBase.startAppInfoFragment(fragment, titleRes, mCurrentPkgName, mCurrentUid, this,
-                INSTALLED_APP_DETAILS, getMetricsCategory());
+        AppInfoBase.startAppInfoFragment(fragment, getString(titleRes), mCurrentPkgName,
+                mCurrentUid, this, INSTALLED_APP_DETAILS, getMetricsCategory());
     }
 
     @Override
diff --git a/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java b/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java
index 07c4858..eae1d06 100644
--- a/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java
+++ b/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java
@@ -70,7 +70,8 @@
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (preference instanceof DomainAppPreference) {
             ApplicationsState.AppEntry entry = ((DomainAppPreference) preference).getEntry();
-            AppInfoBase.startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label,
+            AppInfoBase.startAppInfoFragment(AppLaunchSettings.class,
+                    mContext.getString(R.string.auto_launch_label),
                     entry.info.packageName, entry.info.uid, mFragment,
                     INSTALLED_APP_DETAILS, mMetricsCategory);
             return true;
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
index 7b2f4ba..e133c62 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
@@ -17,6 +17,18 @@
 package com.android.settings.applications.specialaccess.deviceadmin;
 
 import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVATE_DEVICE_ADMIN_APP;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVATE_THIS_DEVICE_ADMIN_APP;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVE_DEVICE_ADMIN_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_ADMIN_POLICIES_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.NEW_DEVICE_ADMIN_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_AND_UNINSTALL_DEVICE_ADMIN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_DEVICE_ADMIN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_WORK_PROFILE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_PROFILE_OWNER_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.USER_ADMIN_POLICIES_WARNING;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_ADMIN_POLICIES_WARNING;
 
 import android.app.Activity;
 import android.app.ActivityManager;
@@ -318,7 +330,8 @@
 
             // Build and show the simplified dialog
             final Dialog dialog = new AlertDialog.Builder(this)
-                    .setTitle(getText(R.string.profile_owner_add_title_simplified))
+                    .setTitle(mDPM.getString(SET_PROFILE_OWNER_DIALOG_TITLE,
+                            () -> getString(R.string.profile_owner_add_title_simplified)))
                     .setView(R.layout.profile_owner_add)
                     .setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface dialog, int which) {
@@ -339,8 +352,10 @@
             mAddMsg = dialog.findViewById(R.id.add_msg_simplified);
             mAddMsg.setText(mAddMsgText);
             mAdminWarning = dialog.findViewById(R.id.admin_warning_simplified);
-            mAdminWarning.setText(getString(R.string.device_admin_warning_simplified,
-                    mProfileOwnerName));
+            mAdminWarning.setText(
+                    mDPM.getString(NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED, () ->
+                    getString(R.string.device_admin_warning_simplified,
+                    mProfileOwnerName), mProfileOwnerName));
             return;
         }
         setContentView(R.layout.device_admin_add);
@@ -655,8 +670,10 @@
             final boolean isManagedProfile = isManagedProfile(mDeviceAdmin);
             if (isProfileOwner && isManagedProfile) {
                 // Profile owner in a managed profile, user can remove profile to disable admin.
-                mAdminWarning.setText(R.string.admin_profile_owner_message);
-                mActionButton.setText(R.string.remove_managed_profile_label);
+                mAdminWarning.setText(mDPM.getString(WORK_PROFILE_ADMIN_POLICIES_WARNING,
+                        () -> getString(R.string.admin_profile_owner_message)));
+                mActionButton.setText(mDPM.getString(REMOVE_WORK_PROFILE,
+                        () -> getString(R.string.remove_managed_profile_label)));
 
                 final EnforcedAdmin admin = getAdminEnforcingCantRemoveProfile();
                 final boolean hasBaseRestriction = hasBaseCantRemoveProfileRestriction();
@@ -670,27 +687,33 @@
                 // Profile owner in a user or device owner, user can't disable admin.
                 if (isProfileOwner) {
                     // Show profile owner in a user description.
-                    mAdminWarning.setText(R.string.admin_profile_owner_user_message);
+                    mAdminWarning.setText(mDPM.getString(USER_ADMIN_POLICIES_WARNING,
+                            () -> getString(R.string.admin_profile_owner_user_message)));
                 } else {
                     // Show device owner description.
                     if (isFinancedDevice()) {
                         mAdminWarning.setText(R.string.admin_financed_message);
                     } else {
-                        mAdminWarning.setText(R.string.admin_device_owner_message);
+                        mAdminWarning.setText(mDPM.getString(DEVICE_ADMIN_POLICIES_WARNING,
+                                () -> getString(R.string.admin_device_owner_message)));
                     }
                 }
-                mActionButton.setText(R.string.remove_device_admin);
+                mActionButton.setText(mDPM.getString(REMOVE_DEVICE_ADMIN,
+                        () -> getString(R.string.remove_device_admin)));
                 mActionButton.setEnabled(false);
             } else {
                 addDeviceAdminPolicies(false /* showDescription */);
-                mAdminWarning.setText(getString(R.string.device_admin_status,
-                        mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(
-                        getPackageManager())));
+                CharSequence label = mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(
+                        getPackageManager());
+                mAdminWarning.setText(mDPM.getString(ACTIVE_DEVICE_ADMIN_WARNING,
+                        () -> getString(R.string.device_admin_status, label), label));
                 setTitle(R.string.active_device_admin_msg);
                 if (mUninstalling) {
-                    mActionButton.setText(R.string.remove_and_uninstall_device_admin);
+                    mActionButton.setText(mDPM.getString(REMOVE_AND_UNINSTALL_DEVICE_ADMIN,
+                            () -> getString(R.string.remove_and_uninstall_device_admin)));
                 } else {
-                    mActionButton.setText(R.string.remove_device_admin);
+                    mActionButton.setText(mDPM.getString(REMOVE_DEVICE_ADMIN,
+                            () -> getString(R.string.remove_device_admin)));
                 }
             }
             CharSequence supportMessage = mDPM.getLongSupportMessageForUser(
@@ -703,10 +726,16 @@
             }
         } else {
             addDeviceAdminPolicies(true /* showDescription */);
-            mAdminWarning.setText(getString(R.string.device_admin_warning,
-                    mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager())));
-            setTitle(getText(R.string.add_device_admin_msg));
-            mActionButton.setText(getText(R.string.add_device_admin));
+            CharSequence label = mDeviceAdmin.getActivityInfo()
+                    .applicationInfo.loadLabel(getPackageManager());
+            mAdminWarning.setText(
+                    mDPM.getString(NEW_DEVICE_ADMIN_WARNING, () ->
+                    getString(R.string.device_admin_warning, label
+                    ), label));
+            setTitle(mDPM.getString(ACTIVATE_DEVICE_ADMIN_APP,
+                    () -> getString(R.string.add_device_admin_msg)));
+            mActionButton.setText(mDPM.getString(ACTIVATE_THIS_DEVICE_ADMIN_APP,
+                    () -> getString(R.string.add_device_admin)));
             if (isAdminUninstallable()) {
                 mUninstallButton.setVisibility(View.VISIBLE);
             }
diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
index 61af4f6..4e96aa3 100644
--- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
+++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
@@ -15,6 +15,11 @@
  */
 package com.android.settings.applications.specialaccess.interactacrossprofiles;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.APP_CAN_ACCESS_PERSONAL_DATA;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.APP_CAN_ACCESS_PERSONAL_PERMISSIONS;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECT_APPS_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.INSTALL_IN_PERSONAL_PROFILE_TO_CONNECT_PROMPT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.INSTALL_IN_WORK_PROFILE_TO_CONNECT_PROMPT;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
 import static android.provider.Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS;
@@ -258,16 +263,22 @@
 
         final TextView dialogTitle = dialogView.findViewById(
                 R.id.interact_across_profiles_consent_dialog_title);
-        dialogTitle.setText(
-                getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel));
+        dialogTitle.setText(mDpm.getString(CONNECT_APPS_DIALOG_TITLE, () ->
+                getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel)));
 
         final TextView appDataSummary = dialogView.findViewById(R.id.app_data_summary);
-        appDataSummary.setText(getString(
-                R.string.interact_across_profiles_consent_dialog_app_data_summary, mAppLabel));
+        appDataSummary.setText(
+                mDpm.getString(APP_CAN_ACCESS_PERSONAL_DATA,
+                        () -> getString(
+                                R.string.interact_across_profiles_consent_dialog_app_data_summary,
+                                mAppLabel), mAppLabel));
 
         final TextView permissionsSummary = dialogView.findViewById(R.id.permissions_summary);
-        permissionsSummary.setText(getString(
-                R.string.interact_across_profiles_consent_dialog_permissions_summary, mAppLabel));
+        permissionsSummary.setText(mDpm.getString(APP_CAN_ACCESS_PERSONAL_PERMISSIONS,
+                () -> getString(
+                        R.string.interact_across_profiles_consent_dialog_permissions_summary,
+                        mAppLabel),
+                mAppLabel));
 
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setView(dialogView)
@@ -393,9 +404,12 @@
             return false;
         }
         if (!mInstalledInPersonal) {
-            mInstallBanner.setTitle(getString(
-                    R.string.interact_across_profiles_install_personal_app_title,
-                    mAppLabel));
+            mInstallBanner.setTitle(
+                    mDpm.getString(INSTALL_IN_PERSONAL_PROFILE_TO_CONNECT_PROMPT,
+                            () -> getString(
+                                    R.string.interact_across_profiles_install_personal_app_title,
+                                    mAppLabel),
+                            mAppLabel));
             if (mInstallAppIntent != null) {
                 mInstallBanner.setSummary(
                         R.string.interact_across_profiles_install_app_summary);
@@ -404,9 +418,12 @@
             return true;
         }
         if (!mInstalledInWork) {
-            mInstallBanner.setTitle(getString(
-                    R.string.interact_across_profiles_install_work_app_title,
-                    mAppLabel));
+            mInstallBanner.setTitle(
+                    mDpm.getString(INSTALL_IN_WORK_PROFILE_TO_CONNECT_PROMPT,
+                            () -> getString(
+                                    R.string.interact_across_profiles_install_work_app_title,
+                                    mAppLabel),
+                            mAppLabel));
             if (mInstallAppIntent != null) {
                 mInstallBanner.setSummary(
                         R.string.interact_across_profiles_install_app_summary);
diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java
index ffab617..05ec3e9 100644
--- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java
+++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java
@@ -15,9 +15,11 @@
  */
 package com.android.settings.applications.specialaccess.interactacrossprofiles;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE;
 import static android.content.pm.PackageManager.GET_ACTIVITIES;
 
 import android.annotation.Nullable;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
@@ -51,6 +53,7 @@
     private Context mContext;
     private PackageManager mPackageManager;
     private UserManager mUserManager;
+    private DevicePolicyManager mDevicePolicyManager;
     private CrossProfileApps mCrossProfileApps;
     private IconDrawableFactory mIconDrawableFactory;
 
@@ -63,6 +66,7 @@
         mUserManager = mContext.getSystemService(UserManager.class);
         mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
         mCrossProfileApps = mContext.getSystemService(CrossProfileApps.class);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
@@ -91,7 +95,8 @@
                 @Override
                 public boolean onPreferenceClick(Preference preference) {
                     AppInfoBase.startAppInfoFragment(InteractAcrossProfilesDetails.class,
-                            R.string.interact_across_profiles_title,
+                            mDevicePolicyManager.getString(CONNECTED_WORK_AND_PERSONAL_APPS_TITLE,
+                                    () -> getString(R.string.interact_across_profiles_title)),
                             packageName,
                             appInfo.uid,
                             InteractAcrossProfilesSettings.this/* source */,
diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
index 57b7412..d794de6 100644
--- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
+++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java
@@ -168,7 +168,8 @@
                 @Override
                 public boolean onPreferenceClick(Preference preference) {
                     AppInfoBase.startAppInfoFragment(PictureInPictureDetails.class,
-                            R.string.picture_in_picture_app_detail_title, packageName, appInfo.uid,
+                            getString(R.string.picture_in_picture_app_detail_title),
+                            packageName, appInfo.uid,
                             PictureInPictureSettings.this, -1, getMetricsCategory());
                     return true;
                 }
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 7f3bc87..5085172 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -88,9 +88,9 @@
     protected abstract int getHeaderResDefault();
 
     /**
-     * @return the description resource for if the biometric has been disabled by a device admin
+     * @return the description for if the biometric has been disabled by a device admin
      */
-    protected abstract int getDescriptionResDisabledByAdmin();
+    protected abstract String getDescriptionDisabledByAdmin();
 
     /**
      * @return the cancel button
@@ -414,7 +414,7 @@
         super.initViews();
 
         if (mBiometricUnlockDisabledByAdmin && !mParentalConsentRequired) {
-            setDescriptionText(getDescriptionResDisabledByAdmin());
+            setDescriptionText(getDescriptionDisabledByAdmin());
         }
     }
 
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index eadb5b8..b622c1c 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.biometrics.face;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_UNLOCK_DISABLED;
+
 import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Intent;
@@ -221,8 +223,11 @@
     }
 
     @Override
-    protected int getDescriptionResDisabledByAdmin() {
-        return R.string.security_settings_face_enroll_introduction_message_unlock_disabled;
+    protected String getDescriptionDisabledByAdmin() {
+        DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
+        return devicePolicyManager.getString(
+                FACE_UNLOCK_DISABLED,
+                () -> getString(R.string.security_settings_face_enroll_introduction_message_unlock_disabled));
     }
 
     @Override
diff --git a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
index 49f128c..abfd3a2 100644
--- a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.biometrics.face;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.os.UserHandle;
 
@@ -27,21 +30,26 @@
 public class FaceProfileStatusPreferenceController extends FaceStatusPreferenceController {
 
     private static final String KEY_FACE_SETTINGS = "face_settings_profile";
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public FaceProfileStatusPreferenceController(Context context) {
         super(context, KEY_FACE_SETTINGS);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public FaceProfileStatusPreferenceController(Context context, String key) {
         super(context, key);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public FaceProfileStatusPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY_FACE_SETTINGS, lifecycle);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public FaceProfileStatusPreferenceController(Context context, String key, Lifecycle lifecycle) {
         super(context, key, lifecycle);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
@@ -70,7 +78,10 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        preference.setTitle(mContext.getResources().getString(
-                R.string.security_settings_face_profile_preference_title));
+
+        preference.setTitle(
+                mDevicePolicyManager.getString(FACE_SETTINGS_FOR_WORK_TITLE, () ->
+                mContext.getResources().getString(
+                R.string.security_settings_face_profile_preference_title)));
     }
 }
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index 62347ac..f3a7f2c 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -17,12 +17,14 @@
 package com.android.settings.biometrics.face;
 
 import static android.app.Activity.RESULT_OK;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
 
 import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST;
 import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST;
 import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
 import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
 
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -66,6 +68,7 @@
 
     private UserManager mUserManager;
     private FaceManager mFaceManager;
+    private DevicePolicyManager mDevicePolicyManager;
     private int mUserId;
     private int mSensorId;
     private long mChallenge;
@@ -148,6 +151,7 @@
 
         mUserManager = context.getSystemService(UserManager.class);
         mFaceManager = context.getSystemService(FaceManager.class);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
         mToken = getIntent().getByteArrayExtra(KEY_TOKEN);
         mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1);
         mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L);
@@ -157,8 +161,10 @@
         mFaceFeatureProvider = FeatureFactory.getFactory(getContext()).getFaceFeatureProvider();
 
         if (mUserManager.getUserInfo(mUserId).isManagedProfile()) {
-            getActivity().setTitle(getActivity().getResources().getString(
-                    R.string.security_settings_face_profile_preference_title));
+            getActivity().setTitle(
+                    mDevicePolicyManager.getString(FACE_SETTINGS_FOR_WORK_TITLE, () ->
+                    getActivity().getResources().getString(
+                    R.string.security_settings_face_profile_preference_title)));
         }
 
         mLockscreenController = Utils.isMultipleBiometricsSupported(context)
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index f70a663..2ef5446 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.biometrics.fingerprint;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED;
+
 import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.ActivityNotFoundException;
@@ -57,6 +59,8 @@
     @Nullable private FooterButton mPrimaryFooterButton;
     @Nullable private FooterButton mSecondaryFooterButton;
 
+    private DevicePolicyManager mDevicePolicyManager;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         mFingerprintManager = Utils.getFingerprintManagerOrNull(this);
@@ -68,6 +72,8 @@
 
         super.onCreate(savedInstanceState);
 
+        mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
+
         final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint);
         final ImageView iconDeviceLocked = findViewById(R.id.icon_device_locked);
         final ImageView iconTrashCan = findViewById(R.id.icon_trash_can);
@@ -177,8 +183,10 @@
     }
 
     @Override
-    protected int getDescriptionResDisabledByAdmin() {
-        return R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled;
+    protected String getDescriptionDisabledByAdmin() {
+        return mDevicePolicyManager.getString(
+                FINGERPRINT_UNLOCK_DISABLED,
+                () -> getString(R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled));
     }
 
     @Override
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 87a29b2..50e1780 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -17,6 +17,10 @@
 package com.android.settings.biometrics.fingerprint;
 
 
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED_EXPLANATION;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE;
+
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
 
 import android.app.Activity;
@@ -356,11 +360,22 @@
                     activity, getString(getHelpResource()), activity.getClass().getName());
             final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo(
                     activity, ANNOTATION_URL, helpIntent);
-            mFooterTitle = AnnotationSpan.linkify(getText(admin != null
-                            ? R.string
-                            .security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled
-                            : R.string.security_settings_fingerprint_v2_home_screen),
-                    linkInfo, adminLinkInfo);
+
+            if (admin != null) {
+                DevicePolicyManager devicePolicyManager =
+                        getSystemService(DevicePolicyManager.class);
+                String footerText = devicePolicyManager.getString(
+                        FINGERPRINT_UNLOCK_DISABLED_EXPLANATION,
+                        () -> getString(R.string.security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled));
+
+                mFooterTitle = AnnotationSpan.linkify(footerText, linkInfo, adminLinkInfo);
+            } else {
+                mFooterTitle = AnnotationSpan.linkify(
+                        getText(R.string.security_settings_fingerprint_v2_home_screen),
+                        linkInfo, adminLinkInfo);
+            }
+
+
         }
 
         private boolean isUdfps() {
@@ -917,11 +932,20 @@
                 mFp = getArguments().getParcelable("fingerprint");
                 final boolean isProfileChallengeUser =
                         getArguments().getBoolean("isProfileChallengeUser");
+
+                DevicePolicyManager devicePolicyManager =
+                        getContext().getSystemService(DevicePolicyManager.class);
+                String messageId =
+                        isProfileChallengeUser ? WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE
+                        : UNDEFINED;
+                int defaultMessageId = isProfileChallengeUser
+                        ? R.string.fingerprint_last_delete_message_profile_challenge
+                        : R.string.fingerprint_last_delete_message;
+
                 final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
                         .setTitle(R.string.fingerprint_last_delete_title)
-                        .setMessage((isProfileChallengeUser)
-                                ? R.string.fingerprint_last_delete_message_profile_challenge
-                                : R.string.fingerprint_last_delete_message)
+                        .setMessage(devicePolicyManager.getString(
+                                messageId, () -> getContext().getString(defaultMessageId)))
                         .setPositiveButton(R.string.fingerprint_last_delete_confirm,
                                 new DialogInterface.OnClickListener() {
                                     @Override
diff --git a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java
index 9e1941a..25b15c7 100644
--- a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java
+++ b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java
@@ -16,9 +16,12 @@
 
 package com.android.settings.bugreporthandler;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_PROFILE_APP_SUBTEXT;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_APP_SUBTEXT;
 import static android.provider.Settings.ACTION_BUGREPORT_HANDLER_SETTINGS;
 
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -189,10 +192,15 @@
             return "";
         }
         final UserInfo userInfo = mUserManager.getUserInfo(handlerUser);
+        DevicePolicyManager devicePolicyManager =
+                context.getSystemService(DevicePolicyManager.class);
+
         if (userInfo != null && userInfo.isManagedProfile()) {
-            return context.getString(R.string.work_profile_app_subtext);
+            return devicePolicyManager.getString(WORK_PROFILE_APP_SUBTEXT,
+                    () -> context.getString(R.string.work_profile_app_subtext));
         }
-        return context.getString(R.string.personal_profile_app_subtext);
+        return devicePolicyManager.getString(PERSONAL_PROFILE_APP_SUBTEXT,
+                () -> context.getString(R.string.personal_profile_app_subtext));
     }
 
     private static class BugreportHandlerAppInfo extends DefaultAppInfo {
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
index 3b64d3d..f7a309e 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
@@ -16,10 +16,13 @@
 
 package com.android.settings.dashboard.profileselector;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
 import static android.content.Intent.EXTRA_USER_ID;
 
 import android.annotation.IntDef;
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.os.Bundle;
@@ -96,9 +99,6 @@
      * Used in fragment argument with Extra key {@link SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB}
      */
     public static final int WORK_TAB = 1;
-    private static final int[] LABEL = {
-            R.string.category_personal, R.string.category_work
-    };
 
     private ViewGroup mContentView;
 
@@ -233,14 +233,23 @@
 
         @Override
         public CharSequence getPageTitle(int position) {
-            return mContext.getString(LABEL[convertPosition(position)]);
+            DevicePolicyManager devicePolicyManager =
+                    mContext.getSystemService(DevicePolicyManager.class);
+
+            if (convertPosition(position) == WORK_TAB) {
+                return devicePolicyManager.getString(WORK_CATEGORY_HEADER,
+                        () -> mContext.getString(R.string.category_work));
+            }
+
+            return devicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
+                    () -> mContext.getString(R.string.category_personal));
         }
     }
 
     private static int convertPosition(int index) {
         if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
                 == View.LAYOUT_DIRECTION_RTL) {
-            return LABEL.length - 1 - index;
+            return 1 - index;
         }
         return index;
     }
diff --git a/src/com/android/settings/dashboard/profileselector/UserAdapter.java b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
index 0b3a7fc..7057961 100644
--- a/src/com/android/settings/dashboard/profileselector/UserAdapter.java
+++ b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
@@ -16,7 +16,12 @@
 
 package com.android.settings.dashboard.profileselector;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_USER_LABEL;
+
 import android.app.ActivityManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.database.DataSetObserver;
@@ -54,7 +59,9 @@
             UserInfo userInfo = um.getUserInfo(mUserHandle.getIdentifier());
             Drawable icon;
             if (userInfo.isManagedProfile()) {
-                mName = context.getString(R.string.managed_user_title);
+                mName = context.getSystemService(DevicePolicyManager.class).getString(
+                        WORK_PROFILE_USER_LABEL,
+                        () -> context.getString(R.string.managed_user_title));
                 icon = context.getPackageManager().getUserBadgeForDensityNoBackground(
                         userHandle, /* density= */ 0);
             } else {
@@ -77,14 +84,18 @@
     }
 
     private ArrayList<UserDetails> data;
+    private final Context mContext;
     private final LayoutInflater mInflater;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public UserAdapter(Context context, ArrayList<UserDetails> users) {
         if (users == null) {
             throw new IllegalArgumentException("A list of user details must be provided");
         }
+        mContext = context;
         this.data = users;
         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     public UserHandle getUserHandle(int position) {
@@ -104,13 +115,15 @@
         return row;
     }
 
-    private int getTitle(UserDetails user) {
+    private String getTitle(UserDetails user) {
         int userHandle = user.mUserHandle.getIdentifier();
         if (userHandle == UserHandle.USER_CURRENT
                 || userHandle == ActivityManager.getCurrentUser()) {
-            return R.string.category_personal;
+            return mDevicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
+                    () -> mContext.getString(R.string.category_personal));
         } else {
-            return R.string.category_work;
+            return mDevicePolicyManager.getString(WORK_CATEGORY_HEADER,
+                    () -> mContext.getString(R.string.category_work));
         }
     }
 
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
index 8dc1e2f..454de9d 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java
@@ -16,9 +16,11 @@
 
 package com.android.settings.deviceinfo;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ERROR_MOVE_DEVICE_ADMIN;
 import static android.content.Intent.EXTRA_TITLE;
 import static android.content.pm.PackageManager.EXTRA_MOVE_ID;
 
+import android.app.admin.DevicePolicyManager;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.MoveCallback;
 import android.os.Bundle;
@@ -87,7 +89,9 @@
             case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
                 return getString(R.string.insufficient_storage);
             case PackageManager.MOVE_FAILED_DEVICE_ADMIN:
-                return getString(R.string.move_error_device_admin);
+                return getSystemService(DevicePolicyManager.class)
+                        .getString(ERROR_MOVE_DEVICE_ADMIN,
+                                () -> getString(R.string.move_error_device_admin));
             case PackageManager.MOVE_FAILED_DOESNT_EXIST:
                 return getString(R.string.does_not_exist);
             case PackageManager.MOVE_FAILED_INVALID_LOCATION:
diff --git a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
index 2a3359a..65f0853 100644
--- a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
+++ b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.display;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 
 import static com.android.settings.display.ScreenTimeoutSettings.FALLBACK_SCREEN_TIMEOUT_VALUE;
@@ -60,7 +61,9 @@
         final RestrictedLockUtils.EnforcedAdmin admin = getPreferenceDisablingAdmin(maxTimeout);
         if (admin != null) {
             preference.setEnabled(false);
-            preference.setSummary(mContext.getText(R.string.disabled_by_policy_title));
+            preference.setSummary(mContext.getSystemService(DevicePolicyManager.class)
+                    .getString(DISABLED_BY_IT_ADMIN_TITLE,
+                            () -> mContext.getString(R.string.disabled_by_policy_title)));
             ((RestrictedPreference) preference).setDisabledByAdmin(admin);
         } else {
             preference.setSummary(getTimeoutSummary(maxTimeout));
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index f8c03d5..43ec864 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.display;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.OTHER_OPTIONS_DISABLED_BY_ADMIN;
 import static android.hardware.SensorPrivacyManager.Sensors.CAMERA;
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 
@@ -85,6 +86,8 @@
         }
     };
 
+    private DevicePolicyManager mDevicePolicyManager;
+
     @VisibleForTesting
     Context mContext;
 
@@ -116,6 +119,7 @@
     public void onAttach(Context context) {
         super.onAttach(context);
         mContext = context;
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
         mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries);
         mInitialValues = getResources().getStringArray(R.array.screen_timeout_values);
         mAdaptiveSleepController = new AdaptiveSleepPreferenceController(context);
@@ -219,8 +223,9 @@
 
     @VisibleForTesting
     void setupDisabledFooterPreference() {
-        final String textDisabledByAdmin = getResources().getString(
-                R.string.admin_disabled_other_options);
+        final String textDisabledByAdmin = mDevicePolicyManager.getString(
+                OTHER_OPTIONS_DISABLED_BY_ADMIN, () -> getResources().getString(
+                        R.string.admin_disabled_other_options));
         final String textMoreDetails = getResources().getString(R.string.admin_more_details);
 
         final SpannableString spannableString = new SpannableString(
diff --git a/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java b/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java
index 1c7ff62..d5c10b4 100644
--- a/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java
+++ b/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java
@@ -14,6 +14,9 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ADMIN_ACTION_NONE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.text.format.DateUtils;
 
@@ -43,11 +46,17 @@
     public void updateState(Preference preference) {
         final Date timestamp = getAdminActionTimestamp();
         preference.setSummary(timestamp == null ?
-                mContext.getString(R.string.enterprise_privacy_none) :
+                getEnterprisePrivacyNone() :
                 DateUtils.formatDateTime(mContext, timestamp.getTime(),
                         DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE));
     }
 
+    private String getEnterprisePrivacyNone() {
+        return mContext.getSystemService(DevicePolicyManager.class)
+                .getString(ADMIN_ACTION_NONE,
+                        () -> mContext.getString(R.string.enterprise_privacy_none));
+    }
+
     @Override
     public boolean isAvailable() {
         return true;
diff --git a/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java b/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
index 696561b..e883ac3 100644
--- a/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
+++ b/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
@@ -13,6 +13,10 @@
  */
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ALWAYS_ON_VPN_DEVICE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ALWAYS_ON_VPN_PERSONAL_PROFILE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import androidx.preference.Preference;
@@ -27,18 +31,29 @@
 
     private static final String KEY_ALWAYS_ON_VPN_PRIMARY_USER = "always_on_vpn_primary_user";
     private final EnterprisePrivacyFeatureProvider mFeatureProvider;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public AlwaysOnVpnCurrentUserPreferenceController(Context context) {
         super(context);
         mFeatureProvider = FeatureFactory.getFactory(context)
                 .getEnterprisePrivacyFeatureProvider(context);
+        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
     public void updateState(Preference preference) {
-        preference.setTitle(mFeatureProvider.isInCompMode()
-                ? R.string.enterprise_privacy_always_on_vpn_personal
-                : R.string.enterprise_privacy_always_on_vpn_device);
+        if (mFeatureProvider.isInCompMode()) {
+            preference.setTitle(
+                    mDevicePolicyManager.getString(
+                            ALWAYS_ON_VPN_PERSONAL_PROFILE,
+                            () -> mContext.getString(
+                                    R.string.enterprise_privacy_always_on_vpn_personal)));
+        } else {
+            preference.setTitle(
+                    mDevicePolicyManager.getString(ALWAYS_ON_VPN_DEVICE,
+                            () -> mContext.getString(
+                                    R.string.enterprise_privacy_always_on_vpn_device)));
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java b/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java
index 45170b3..76aa6bc 100644
--- a/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java
+++ b/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java
@@ -14,6 +14,10 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CA_CERTS_DEVICE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CA_CERTS_PERSONAL_PROFILE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import androidx.annotation.VisibleForTesting;
@@ -26,8 +30,11 @@
     @VisibleForTesting
     static final String CA_CERTS_CURRENT_USER = "ca_certs_current_user";
 
+    DevicePolicyManager mDevicePolicyManager;
+
     public CaCertsCurrentUserPreferenceController(Context context) {
         super(context);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
@@ -38,9 +45,16 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        preference.setTitle(mFeatureProvider.isInCompMode()
-                ? R.string.enterprise_privacy_ca_certs_personal
-                : R.string.enterprise_privacy_ca_certs_device);
+
+        if (mFeatureProvider.isInCompMode()) {
+            preference.setTitle(mDevicePolicyManager.getString(
+                    CA_CERTS_PERSONAL_PROFILE,
+                    () -> mContext.getString(R.string.enterprise_privacy_ca_certs_personal)));
+        } else {
+            preference.setTitle(mDevicePolicyManager.getString(
+                    CA_CERTS_DEVICE,
+                    () -> mContext.getString(R.string.enterprise_privacy_ca_certs_device)));
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java b/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java
index 5d11d4a..696baca 100644
--- a/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java
+++ b/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java
@@ -16,8 +16,13 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONTACT_YOUR_IT_ADMIN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.IT_ADMIN_POLICY_DISABLING_INFO_URL;
+
 import static java.util.Objects.requireNonNull;
 
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import com.android.settings.R;
@@ -25,14 +30,17 @@
 
 class DeviceAdminStringProviderImpl implements DeviceAdminStringProvider {
     private final Context mContext;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     DeviceAdminStringProviderImpl(Context context) {
         mContext = requireNonNull(context);
+        mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
     public String getDefaultDisabledByPolicyTitle() {
-        return mContext.getString(R.string.disabled_by_policy_title);
+        return mDevicePolicyManager.getString(DISABLED_BY_IT_ADMIN_TITLE,
+                () -> mContext.getString(R.string.disabled_by_policy_title));
     }
 
     @Override
@@ -67,12 +75,14 @@
 
     @Override
     public String getDefaultDisabledByPolicyContent() {
-        return mContext.getString(R.string.default_admin_support_msg);
+        return mDevicePolicyManager.getString(CONTACT_YOUR_IT_ADMIN,
+                () -> mContext.getString(R.string.default_admin_support_msg));
     }
 
     @Override
     public String getLearnMoreHelpPageUrl() {
-        return mContext.getString(R.string.help_url_action_disabled_by_it_admin);
+        return mDevicePolicyManager.getString(IT_ADMIN_POLICY_DISABLING_INFO_URL,
+                () -> mContext.getString(R.string.help_url_action_disabled_by_it_admin));
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
index 35ce1f1..76b2e24 100644
--- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
+++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_MANAGED_WITHOUT_NAME;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_MANAGED_WITH_NAME;
+
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -95,10 +98,12 @@
         final SpannableStringBuilder disclosure = new SpannableStringBuilder();
         final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
         if (organizationName != null) {
-            disclosure.append(mResources.getString(R.string.do_disclosure_with_name,
-                    organizationName));
+            disclosure.append(mDpm.getString(DEVICE_MANAGED_WITH_NAME,
+                    () -> mResources.getString(R.string.do_disclosure_with_name,
+                    organizationName), organizationName));
         } else {
-            disclosure.append(mResources.getString(R.string.do_disclosure_generic));
+            disclosure.append(mDpm.getString(DEVICE_MANAGED_WITHOUT_NAME,
+                    () -> mResources.getString(R.string.do_disclosure_generic)));
         }
         return disclosure;
     }
diff --git a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
index c878058..34d098d 100644
--- a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
+++ b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
@@ -16,6 +16,10 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -123,14 +127,20 @@
         if (!mEnterprisePrivacyFeatureProvider.isInCompMode() && mUsers.size() == 1) {
             createPreferences(prefContext, screen, mApps.get(0));
         } else {
+            DevicePolicyManager devicePolicyManager =
+                    mContext.getSystemService(DevicePolicyManager.class);
             for (int i = 0; i < mUsers.size(); i++) {
                 final UserInfo userInfo = mUsers.get(i);
                 final PreferenceCategory category = new PreferenceCategory(prefContext);
                 screen.addPreference(category);
                 if (userInfo.isManagedProfile()) {
-                    category.setTitle(R.string.category_work);
+                    category.setTitle(devicePolicyManager.getString(
+                            WORK_CATEGORY_HEADER,
+                            () -> mContext.getString(R.string.category_work)));
                 } else {
-                    category.setTitle(R.string.category_personal);
+                    category.setTitle(devicePolicyManager.getString(
+                            PERSONAL_CATEGORY_HEADER,
+                            () -> mContext.getString(R.string.category_personal)));
                 }
                 category.setOrder(i);
                 createPreferences(prefContext, category, mApps.get(i));
diff --git a/src/com/android/settings/enterprise/ImePreferenceController.java b/src/com/android/settings/enterprise/ImePreferenceController.java
index 51a24a2..25dcdaf 100644
--- a/src/com/android/settings/enterprise/ImePreferenceController.java
+++ b/src/com/android/settings/enterprise/ImePreferenceController.java
@@ -14,6 +14,9 @@
 
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ADMIN_ACTION_SET_INPUT_METHOD_NAME;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import androidx.preference.Preference;
@@ -37,9 +40,13 @@
 
     @Override
     public void updateState(Preference preference) {
-        preference.setSummary(mContext.getResources().getString(
-                R.string.enterprise_privacy_input_method_name,
-                mFeatureProvider.getImeLabelIfOwnerSet()));
+        preference.setSummary(
+                mContext.getSystemService(DevicePolicyManager.class)
+                        .getString(ADMIN_ACTION_SET_INPUT_METHOD_NAME, () ->
+                                mContext.getResources().getString(
+                                        R.string.enterprise_privacy_input_method_name,
+                                        mFeatureProvider.getImeLabelIfOwnerSet()),
+                                mFeatureProvider.getImeLabelIfOwnerSet()));
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java b/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java
index 00d17f1..934659d 100644
--- a/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java
+++ b/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java
@@ -13,6 +13,9 @@
  */
 package com.android.settings.enterprise;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.NUMBER_OF_DEVICE_ADMINS_NONE;
+
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 
 import com.android.settings.R;
@@ -23,20 +26,28 @@
 public class ManageDeviceAdminPreferenceController extends BasePreferenceController {
 
     private final EnterprisePrivacyFeatureProvider mFeatureProvider;
+    private final DevicePolicyManager mDevicePolicyManager;
 
     public ManageDeviceAdminPreferenceController(Context context, String key) {
         super(context, key);
         mFeatureProvider = FeatureFactory.getFactory(context)
                 .getEnterprisePrivacyFeatureProvider(context);
+        mDevicePolicyManager =
+                mContext.getSystemService(DevicePolicyManager.class);
     }
 
     @Override
     public CharSequence getSummary() {
         final int activeAdmins
                 = mFeatureProvider.getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile();
-        return activeAdmins == 0
-                ? mContext.getResources().getString(R.string.number_of_device_admins_none)
-                : mContext.getResources().getQuantityString(R.plurals.number_of_device_admins,
+
+        if (activeAdmins == 0) {
+            return mDevicePolicyManager.getString(NUMBER_OF_DEVICE_ADMINS_NONE,
+                    () -> mContext.getResources().getString(R.string.number_of_device_admins_none));
+        }
+
+        // TODO: override
+        return mContext.getResources().getQuantityString(R.plurals.number_of_device_admins,
                         activeAdmins, activeAdmins);
     }
 
diff --git a/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java b/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java
index fa1874a..f6070bd 100644
--- a/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java
+++ b/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java
@@ -17,6 +17,8 @@
 package com.android.settings.enterprise;
 
 import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO_SUMMARY;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO_SUMMARY_WITH_NAME;
 
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
@@ -50,10 +52,16 @@
 
         final String organizationName = mFeatureProvider.getDeviceOwnerOrganizationName();
         if (organizationName == null) {
-            preference.setSummary(R.string.enterprise_privacy_settings_summary_generic);
+            preference.setSummary(mDevicePolicyManager.getString(
+                    MANAGED_DEVICE_INFO_SUMMARY,
+                    () -> mContext.getString(
+                            R.string.enterprise_privacy_settings_summary_generic)));
         } else {
-            preference.setSummary(mContext.getResources().getString(
-                    R.string.enterprise_privacy_settings_summary_with_name, organizationName));
+            preference.setSummary(mDevicePolicyManager
+                    .getString(MANAGED_DEVICE_INFO_SUMMARY_WITH_NAME,
+                            () -> mContext.getResources().getString(
+                                    R.string.enterprise_privacy_settings_summary_with_name,
+                                    organizationName), organizationName));
         }
     }
 
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java
index 4e901fd..1927421 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.homepage.contextualcards.conditional;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_OFF_CONDITION_TITLE;
+
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -46,6 +49,7 @@
 
     private final Context mAppContext;
     private final UserManager mUm;
+    private final DevicePolicyManager mDpm;
     private final ConditionManager mConditionManager;
     private final Receiver mReceiver;
 
@@ -54,6 +58,7 @@
     public WorkModeConditionController(Context appContext, ConditionManager manager) {
         mAppContext = appContext;
         mUm = mAppContext.getSystemService(UserManager.class);
+        mDpm = mAppContext.getSystemService(DevicePolicyManager.class);
         mConditionManager = manager;
         mReceiver = new Receiver();
     }
@@ -84,13 +89,15 @@
 
     @Override
     public ContextualCard buildContextualCard() {
+        String conditionWorkTitle = mDpm.getString(WORK_PROFILE_OFF_CONDITION_TITLE,
+                () -> mAppContext.getString(R.string.condition_work_title));
         return new ConditionalContextualCard.Builder()
                 .setConditionId(ID)
                 .setMetricsConstant(SettingsEnums.SETTINGS_CONDITION_WORK_MODE)
                 .setActionText(mAppContext.getText(R.string.condition_turn_on))
                 .setName(mAppContext.getPackageName() + "/"
-                        + mAppContext.getText(R.string.condition_work_title))
-                .setTitleText(mAppContext.getText(R.string.condition_work_title).toString())
+                        + conditionWorkTitle)
+                .setTitleText(conditionWorkTitle)
                 .setSummaryText(mAppContext.getText(R.string.condition_work_summary).toString())
                 .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_signal_workmode_enable))
                 .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index 10954a1..0daa818 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.notification;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED;
+
 import android.annotation.Nullable;
 import android.app.NotificationManager;
 import android.app.admin.DevicePolicyManager;
@@ -103,7 +106,9 @@
 
         if (UserManager.get(mContext).isManagedProfile()) {
             // Apps in the work profile do not support notification listeners.
-            Toast.makeText(mContext, R.string.notification_settings_work_profile,
+            Toast.makeText(mContext,
+                    mDpm.getString(WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS,
+                            () -> mContext.getString(R.string.notification_settings_work_profile)),
                     Toast.LENGTH_SHORT).show();
             finish();
         }
@@ -163,7 +168,9 @@
             if (managedProfileId != UserHandle.USER_NULL
                     && !mDpm.isNotificationListenerServicePermitted(
                     service.packageName, managedProfileId)) {
-                pref.setSummary(R.string.work_profile_notification_access_blocked_summary);
+                pref.setSummary(mDpm.getString(WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED,
+                        () -> getString(
+                                R.string.work_profile_notification_access_blocked_summary)));
             }
             pref.setOnPreferenceClickListener(preference -> {
                 final Bundle args = new Bundle();
diff --git a/src/com/android/settings/notification/SoundWorkSettingsController.java b/src/com/android/settings/notification/SoundWorkSettingsController.java
index de374e9..bcaf4af 100644
--- a/src/com/android/settings/notification/SoundWorkSettingsController.java
+++ b/src/com/android/settings/notification/SoundWorkSettingsController.java
@@ -16,8 +16,13 @@
 
 package com.android.settings.notification;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_MESSAGE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_ACTIVE_SUMMARY;
+
 import android.annotation.UserIdInt;
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -252,11 +257,16 @@
     private void enableWorkSyncSettings() {
         mWorkUsePersonalSounds.setChecked(true);
 
+        String summary = mContext.getSystemService(DevicePolicyManager.class).getString(
+                WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_ACTIVE_SUMMARY,
+                () -> mContext.getString(R.string.work_sound_same_as_personal)
+        );
+
         if (mWorkPhoneRingtonePreference != null) {
-            mWorkPhoneRingtonePreference.setSummary(R.string.work_sound_same_as_personal);
+            mWorkPhoneRingtonePreference.setSummary(summary);
         }
-        mWorkNotificationRingtonePreference.setSummary(R.string.work_sound_same_as_personal);
-        mWorkAlarmRingtonePreference.setSummary(R.string.work_sound_same_as_personal);
+        mWorkNotificationRingtonePreference.setSummary(summary);
+        mWorkAlarmRingtonePreference.setSummary(summary);
     }
 
     private void disableWorkSync() {
@@ -339,9 +349,18 @@
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
+
+            Context context = getActivity().getApplicationContext();
+            DevicePolicyManager devicePolicyManager =
+                    context.getSystemService(DevicePolicyManager.class);
+
             return new AlertDialog.Builder(getActivity())
-                    .setTitle(R.string.work_sync_dialog_title)
-                    .setMessage(R.string.work_sync_dialog_message)
+                    .setTitle(devicePolicyManager.getString(
+                            ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_TITLE,
+                            () -> context.getString(R.string.work_sync_dialog_title)))
+                    .setMessage(devicePolicyManager.getString(
+                            ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_MESSAGE,
+                            () -> context.getString(R.string.work_sync_dialog_message)))
                     .setPositiveButton(R.string.work_sync_dialog_yes,
                             SoundWorkSettingsController.UnifyWorkDialogFragment.this)
                     .setNegativeButton(android.R.string.no, /* listener= */ null)
diff --git a/src/com/android/settings/notification/zen/ZenAccessSettings.java b/src/com/android/settings/notification/zen/ZenAccessSettings.java
index 1a9fb16..aac6954 100644
--- a/src/com/android/settings/notification/zen/ZenAccessSettings.java
+++ b/src/com/android/settings/notification/zen/ZenAccessSettings.java
@@ -17,7 +17,6 @@
 package com.android.settings.notification.zen;
 
 import android.annotation.Nullable;
-import android.app.ActivityManager;
 import android.app.NotificationManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
@@ -28,8 +27,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.ArraySet;
-import android.view.View;
 import android.util.Log;
+import android.view.View;
 
 import androidx.preference.PreferenceScreen;
 
@@ -138,7 +137,7 @@
             pref.setOnPreferenceClickListener(preference -> {
                 AppInfoBase.startAppInfoFragment(
                         ZenAccessDetails.class  /* fragment */,
-                        R.string.manage_zen_access_title /* titleRes */,
+                        getString(R.string.manage_zen_access_title) /* titleRes */,
                         pkg,
                         app.uid,
                         this /* source */,
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 2d6f6b0..f31abb9 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -22,6 +22,8 @@
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM;
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_IT_ADMIN_CANT_RESET_SCREEN_LOCK;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SCREEN_LOCK_SETUP_MESSAGE;
 
 import static com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED;
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
@@ -29,7 +31,6 @@
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
 
-import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
@@ -394,13 +395,16 @@
                 }
             } else {
                 if (mIsManagedProfile) {
-                    textView.setText(R.string.lock_settings_picker_profile_message);
+                    textView.setText(mDpm.getString(WORK_PROFILE_SCREEN_LOCK_SETUP_MESSAGE,
+                            () -> getString(R.string.lock_settings_picker_profile_message)));
                 } else {
                     int profileUserId = Utils.getManagedProfileId(mUserManager, mUserId);
                     if (mController.isScreenLockRestrictedByAdmin()
                             && profileUserId != UserHandle.USER_NULL) {
-                        final StringBuilder description = new StringBuilder(getText(
-                                R.string.lock_settings_picker_admin_restricted_personal_message));
+                        final StringBuilder description = new StringBuilder(
+                                mDpm.getString(WORK_PROFILE_IT_ADMIN_CANT_RESET_SCREEN_LOCK, () ->
+                                getString(
+                                R.string.lock_settings_picker_admin_restricted_personal_message)));
                         final LinkifyUtils.OnClickListener clickListener = () -> {
                             final Bundle extras = new Bundle();
                             extras.putInt(Intent.EXTRA_USER_ID, profileUserId);
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index a2f9922..50a0bae 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -18,6 +18,13 @@
 
 import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
 import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PASSWORD_RECENTLY_USED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.PIN_RECENTLY_USED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REENTER_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.REENTER_WORK_PROFILE_PIN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PIN_HEADER;
 
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
 import static com.android.internal.widget.PasswordValidationError.CONTAINS_INVALID_CHARACTERS;
@@ -259,11 +266,13 @@
 
             Introduction(
                     R.string.lockpassword_choose_your_password_header, // password
+                    SET_WORK_PROFILE_PASSWORD_HEADER,
                     R.string.lockpassword_choose_your_profile_password_header,
                     R.string.lockpassword_choose_your_password_header_for_fingerprint,
                     R.string.lockpassword_choose_your_password_header_for_face,
                     R.string.lockpassword_choose_your_password_header_for_biometrics,
                     R.string.lockpassword_choose_your_pin_header, // pin
+                    SET_WORK_PROFILE_PIN_HEADER,
                     R.string.lockpassword_choose_your_profile_pin_header,
                     R.string.lockpassword_choose_your_pin_header_for_fingerprint,
                     R.string.lockpassword_choose_your_pin_header_for_face,
@@ -274,11 +283,13 @@
 
             NeedToConfirm(
                     R.string.lockpassword_confirm_your_password_header,
+                    REENTER_WORK_PROFILE_PASSWORD_HEADER,
                     R.string.lockpassword_reenter_your_profile_password_header,
                     R.string.lockpassword_confirm_your_password_header,
                     R.string.lockpassword_confirm_your_password_header,
                     R.string.lockpassword_confirm_your_password_header,
                     R.string.lockpassword_confirm_your_pin_header,
+                    REENTER_WORK_PROFILE_PIN_HEADER,
                     R.string.lockpassword_reenter_your_profile_pin_header,
                     R.string.lockpassword_confirm_your_pin_header,
                     R.string.lockpassword_confirm_your_pin_header,
@@ -289,11 +300,13 @@
 
             ConfirmWrong(
                     R.string.lockpassword_confirm_passwords_dont_match,
+                    UNDEFINED,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_passwords_dont_match,
                     R.string.lockpassword_confirm_pins_dont_match,
+                    UNDEFINED,
                     R.string.lockpassword_confirm_pins_dont_match,
                     R.string.lockpassword_confirm_pins_dont_match,
                     R.string.lockpassword_confirm_pins_dont_match,
@@ -303,11 +316,13 @@
                     R.string.lockpassword_confirm_label);
 
             Stage(int hintInAlpha,
+                    String hintOverrideInAlphaForProfile,
                     int hintInAlphaForProfile,
                     int hintInAlphaForFingerprint,
                     int hintInAlphaForFace,
                     int hintInAlphaForBiometrics,
                     int hintInNumeric,
+                    String hintOverrideInNumericForProfile,
                     int hintInNumericForProfile,
                     int hintInNumericForFingerprint,
                     int hintInNumericForFace,
@@ -317,12 +332,14 @@
                     int nextButtonText) {
 
                 this.alphaHint = hintInAlpha;
+                this.alphaHintOverrideForProfile = hintOverrideInAlphaForProfile;
                 this.alphaHintForProfile = hintInAlphaForProfile;
                 this.alphaHintForFingerprint = hintInAlphaForFingerprint;
                 this.alphaHintForFace = hintInAlphaForFace;
                 this.alphaHintForBiometrics = hintInAlphaForBiometrics;
 
                 this.numericHint = hintInNumeric;
+                this.numericHintOverrideForProfile = hintOverrideInNumericForProfile;
                 this.numericHintForProfile = hintInNumericForProfile;
                 this.numericHintForFingerprint = hintInNumericForFingerprint;
                 this.numericHintForFace = hintInNumericForFace;
@@ -341,6 +358,7 @@
 
             // Password header
             public final int alphaHint;
+            public final String alphaHintOverrideForProfile;
             public final int alphaHintForProfile;
             public final int alphaHintForFingerprint;
             public final int alphaHintForFace;
@@ -348,6 +366,7 @@
 
             // PIN header
             public final int numericHint;
+            public final String numericHintOverrideForProfile;
             public final int numericHintForProfile;
             public final int numericHintForFingerprint;
             public final int numericHintForFace;
@@ -361,26 +380,34 @@
 
             public final int buttonText;
 
-            public @StringRes int getHint(boolean isAlpha, int type, boolean isProfile) {
+            public String getHint(Context context, boolean isAlpha, int type, boolean isProfile) {
                 if (isAlpha) {
                     if (type == TYPE_FINGERPRINT) {
-                        return alphaHintForFingerprint;
+                        return context.getString(alphaHintForFingerprint);
                     } else if (type == TYPE_FACE) {
-                        return alphaHintForFace;
+                        return context.getString(alphaHintForFace);
                     } else if (type == TYPE_BIOMETRIC) {
-                        return alphaHintForBiometrics;
+                        return context.getString(alphaHintForBiometrics);
+                    } else if (isProfile) {
+                        return context.getSystemService(DevicePolicyManager.class)
+                                .getString(alphaHintOverrideForProfile,
+                                        () -> context.getString(alphaHintForProfile));
                     } else {
-                        return isProfile ? alphaHintForProfile : alphaHint;
+                        return context.getString(alphaHint);
                     }
                 } else {
                     if (type == TYPE_FINGERPRINT) {
-                        return numericHintForFingerprint;
+                        return context.getString(numericHintForFingerprint);
                     } else if (type == TYPE_FACE) {
-                        return numericHintForFace;
+                        return context.getString(numericHintForFace);
                     } else if (type == TYPE_BIOMETRIC) {
-                        return numericHintForBiometrics;
+                        return context.getString(numericHintForBiometrics);
+                    } else if (isProfile) {
+                        return context.getSystemService(DevicePolicyManager.class)
+                                .getString(numericHintOverrideForProfile,
+                                        () -> context.getString(numericHintForProfile));
                     } else {
-                        return isProfile ? numericHintForProfile : numericHint;
+                        return  context.getString(numericHint);
                     }
                 }
             }
@@ -556,8 +583,8 @@
 
             if (activity instanceof SettingsActivity) {
                 final SettingsActivity sa = (SettingsActivity) activity;
-                int title = Stage.Introduction.getHint(mIsAlphaMode, getStageType(),
-                        mIsManagedProfile);
+                String title = Stage.Introduction.getHint(
+                        getContext(), mIsAlphaMode, getStageType(), mIsManagedProfile);
                 sa.setTitle(title);
                 mLayout.setHeaderText(title);
             }
@@ -818,9 +845,17 @@
                         messages.add(getString(R.string.lockpassword_pin_no_sequential_digits));
                         break;
                     case RECENTLY_USED:
-                        messages.add(getString(mIsAlphaMode
-                                ? R.string.lockpassword_password_recently_used
-                                : R.string.lockpassword_pin_recently_used));
+                        DevicePolicyManager devicePolicyManager =
+                                getContext().getSystemService(DevicePolicyManager.class);
+                        if (mIsAlphaMode) {
+                            messages.add(devicePolicyManager.getString(
+                                    PASSWORD_RECENTLY_USED,
+                                    () -> getString(R.string.lockpassword_password_recently_used)));
+                        } else {
+                            messages.add(devicePolicyManager.getString(
+                                    PIN_RECENTLY_USED,
+                                    () -> getString(R.string.lockpassword_pin_recently_used)));
+                        }
                         break;
                     default:
                         Log.wtf(TAG, "unknown error validating password: " + error);
@@ -851,8 +886,8 @@
             } else {
                 // Hide password requirement view when we are just asking user to confirm the pw.
                 mPasswordRestrictionView.setVisibility(View.GONE);
-                setHeaderText(getString(mUiStage.getHint(mIsAlphaMode, getStageType(),
-                        mIsManagedProfile)));
+                setHeaderText(mUiStage.getHint(getContext(), mIsAlphaMode, getStageType(),
+                        mIsManagedProfile));
                 setNextEnabled(canInput && length >= LockPatternUtils.MIN_LOCK_PASSWORD_SIZE);
                 mSkipOrClearButton.setVisibility(toVisibility(canInput && length > 0));
             }
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 60b8c6c..64fe9ef 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PATTERN_HEADER;
 import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE;
 
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_UNIFICATION_PROFILE_CREDENTIAL;
@@ -23,6 +24,7 @@
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -474,15 +476,18 @@
         }
 
         private void updateActivityTitle() {
-            final int msg;
+            final String msg;
             if (mForFingerprint) {
-                msg = R.string.lockpassword_choose_your_pattern_header_for_fingerprint;
+                msg = getString(R.string.lockpassword_choose_your_pattern_header_for_fingerprint);
             } else if (mForFace) {
-                msg = R.string.lockpassword_choose_your_pattern_header_for_face;
+                msg = getString(R.string.lockpassword_choose_your_pattern_header_for_face);
+            } else if (mIsManagedProfile) {
+                msg = getContext().getSystemService(DevicePolicyManager.class)
+                        .getString(SET_WORK_PROFILE_PATTERN_HEADER,
+                                () -> getString(
+                                        R.string.lockpassword_choose_your_profile_pattern_header));
             } else {
-                msg = mIsManagedProfile
-                        ? R.string.lockpassword_choose_your_profile_pattern_header
-                        : R.string.lockpassword_choose_your_pattern_header;
+                msg = getString(R.string.lockpassword_choose_your_pattern_header);
             }
             getActivity().setTitle(msg);
         }
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
index 22d87a5..4b06fe0 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
@@ -17,6 +17,13 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PATTERN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PIN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN;
+
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
 
 import android.app.Activity;
@@ -259,19 +266,36 @@
 
     private String getTitleFromCredentialType(@LockPatternUtils.CredentialType int credentialType,
             boolean isEffectiveUserManagedProfile) {
+        int overrideStringId;
+        int defaultStringId;
         switch (credentialType) {
             case LockPatternUtils.CREDENTIAL_TYPE_PIN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_work_pin_header)
-                        : getString(R.string.lockpassword_confirm_your_pin_header);
+
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PIN_HEADER,
+                            () -> getString(R.string.lockpassword_confirm_your_work_pin_header));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pin_header);
             case LockPatternUtils.CREDENTIAL_TYPE_PATTERN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_work_pattern_header)
-                        : getString(R.string.lockpassword_confirm_your_pattern_header);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PATTERN_HEADER,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_work_pattern_header));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pattern_header);
             case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_work_password_header)
-                        : getString(R.string.lockpassword_confirm_your_password_header);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PASSWORD_HEADER,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_work_password_header));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_password_header);
         }
         return null;
     }
@@ -280,17 +304,29 @@
             boolean isEffectiveUserManagedProfile) {
         switch (credentialType) {
             case LockPatternUtils.CREDENTIAL_TYPE_PIN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_pin_generic_profile)
-                        : getString(R.string.lockpassword_confirm_your_pin_generic);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PIN,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_pin_generic_profile));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pin_generic);
             case LockPatternUtils.CREDENTIAL_TYPE_PATTERN:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_pattern_generic_profile)
-                        : getString(R.string.lockpassword_confirm_your_pattern_generic);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PATTERN,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_pattern_generic_profile));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_pattern_generic);
             case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD:
-                return isEffectiveUserManagedProfile
-                        ? getString(R.string.lockpassword_confirm_your_password_generic_profile)
-                        : getString(R.string.lockpassword_confirm_your_password_generic);
+                if (isEffectiveUserManagedProfile) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PASSWORD,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_password_generic_profile));
+                }
+
+                return getString(R.string.lockpassword_confirm_your_password_generic);
         }
         return null;
     }
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index 3440071..9650a4d 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -17,6 +17,8 @@
 // TODO (b/35202196): move this class out of the root of the package.
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCK_ATTEMPTS_FAILED;
+
 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
 
 import android.annotation.Nullable;
@@ -243,13 +245,16 @@
             // Last try
             final String title = getActivity().getString(
                     R.string.lock_last_attempt_before_wipe_warning_title);
-            final int messageId = getLastTryErrorMessage(userType);
-            LastTryDialog.show(fragmentManager, title, messageId,
+            final String overrideMessageId = getLastTryOverrideErrorMessageId(userType);
+            final int defaultMessageId = getLastTryDefaultErrorMessage(userType);
+            final String message = mDevicePolicyManager.getString(
+                    overrideMessageId, () -> getString(defaultMessageId));
+            LastTryDialog.show(fragmentManager, title, message,
                     android.R.string.ok, false /* dismiss */);
         } else {
             // Device, profile, or secondary user is wiped
-            final int messageId = getWipeMessage(userType);
-            LastTryDialog.show(fragmentManager, null /* title */, messageId,
+            final String message = getWipeMessage(userType);
+            LastTryDialog.show(fragmentManager, null /* title */, message,
                     R.string.lock_failed_attempts_now_wiping_dialog_dismiss, true /* dismiss */);
         }
     }
@@ -266,16 +271,18 @@
         }
     }
 
-    protected abstract int getLastTryErrorMessage(int userType);
+    protected abstract String getLastTryOverrideErrorMessageId(int userType);
+    protected abstract int getLastTryDefaultErrorMessage(int userType);
 
-    private int getWipeMessage(int userType) {
+    private String getWipeMessage(int userType) {
         switch (userType) {
             case USER_TYPE_PRIMARY:
-                return R.string.lock_failed_attempts_now_wiping_device;
+                return getString(R.string.lock_failed_attempts_now_wiping_device);
             case USER_TYPE_MANAGED_PROFILE:
-                return R.string.lock_failed_attempts_now_wiping_profile;
+                return mDevicePolicyManager.getString(WORK_PROFILE_LOCK_ATTEMPTS_FAILED,
+                        () -> getString(R.string.lock_failed_attempts_now_wiping_profile));
             case USER_TYPE_SECONDARY:
-                return R.string.lock_failed_attempts_now_wiping_user;
+                return getString(R.string.lock_failed_attempts_now_wiping_user);
             default:
                 throw new IllegalArgumentException("Unrecognized user type:" + userType);
         }
@@ -311,7 +318,7 @@
         private static final String ARG_BUTTON = "button";
         private static final String ARG_DISMISS = "dismiss";
 
-        static boolean show(FragmentManager from, String title, int message, int button,
+        static boolean show(FragmentManager from, String title, String message, int button,
                 boolean dismiss) {
             LastTryDialog existent = (LastTryDialog) from.findFragmentByTag(TAG);
             if (existent != null && !existent.isRemoving()) {
@@ -319,7 +326,7 @@
             }
             Bundle args = new Bundle();
             args.putString(ARG_TITLE, title);
-            args.putInt(ARG_MESSAGE, message);
+            args.putString(ARG_MESSAGE, message);
             args.putInt(ARG_BUTTON, button);
             args.putBoolean(ARG_DISMISS, dismiss);
 
@@ -349,7 +356,7 @@
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             Dialog dialog = new AlertDialog.Builder(getActivity())
                     .setTitle(getArguments().getString(ARG_TITLE))
-                    .setMessage(getArguments().getInt(ARG_MESSAGE))
+                    .setMessage(getArguments().getString(ARG_MESSAGE))
                     .setPositiveButton(getArguments().getInt(ARG_BUTTON), null)
                     .create();
             dialog.setCanceledOnTouchOutside(false);
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index de32f13..df7e2dd 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -16,6 +16,16 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PASSWORD_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PIN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PASSWORD_ATTEMPT_BEFORE_WIPE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PIN_ATTEMPT_BEFORE_WIPE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PASSWORD_REQUIRED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PIN_REQUIRED;
+
 import android.annotation.Nullable;
 import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
@@ -73,6 +83,17 @@
         R.string.lockpassword_strong_auth_required_work_password
     };
 
+    private static final String[] DETAIL_TEXT_OVERRIDES = new String[] {
+            UNDEFINED,
+            UNDEFINED,
+            WORK_PROFILE_CONFIRM_PIN,
+            WORK_PROFILE_CONFIRM_PASSWORD,
+            UNDEFINED,
+            UNDEFINED,
+            WORK_PROFILE_PIN_REQUIRED,
+            WORK_PROFILE_PASSWORD_REQUIRED
+    };
+
     public static class InternalActivity extends ConfirmLockPassword {
     }
 
@@ -160,10 +181,10 @@
                     headerMessage = mDevicePolicyManager.getOrganizationNameForUser(mUserId);
                 }
                 if (TextUtils.isEmpty(headerMessage)) {
-                    headerMessage = getString(getDefaultHeader());
+                    headerMessage = getDefaultHeader();
                 }
                 if (TextUtils.isEmpty(detailsMessage)) {
-                    detailsMessage = getString(getDefaultDetails());
+                    detailsMessage = getDefaultDetails();
                 }
                 mGlifLayout.setHeaderText(headerMessage);
                 mGlifLayout.setDescriptionText(detailsMessage);
@@ -228,29 +249,37 @@
             }, 5000);
         }
 
-        private int getDefaultHeader() {
+        private String getDefaultHeader() {
             if (mFrp) {
-                return mIsAlpha ? R.string.lockpassword_confirm_your_password_header_frp
-                        : R.string.lockpassword_confirm_your_pin_header_frp;
+                return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header_frp)
+                        : getString(R.string.lockpassword_confirm_your_pin_header_frp);
             }
             if (mIsManagedProfile) {
-                return mIsAlpha ? R.string.lockpassword_confirm_your_work_password_header
-                        : R.string.lockpassword_confirm_your_work_pin_header;
+                if (mIsAlpha) {
+                    return mDevicePolicyManager.getString(
+                            CONFIRM_WORK_PROFILE_PASSWORD_HEADER,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_work_password_header));
+                }
+                return mDevicePolicyManager.getString(
+                        CONFIRM_WORK_PROFILE_PIN_HEADER,
+                        () -> getString(R.string.lockpassword_confirm_your_work_pin_header));
             }
-            return mIsAlpha ? R.string.lockpassword_confirm_your_password_header
-                    : R.string.lockpassword_confirm_your_pin_header;
+            return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header)
+                    : getString(R.string.lockpassword_confirm_your_pin_header);
         }
 
-        private int getDefaultDetails() {
+        private String getDefaultDetails() {
             if (mFrp) {
-                return mIsAlpha ? R.string.lockpassword_confirm_your_password_details_frp
-                        : R.string.lockpassword_confirm_your_pin_details_frp;
+                return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_details_frp)
+                        : getString(R.string.lockpassword_confirm_your_pin_details_frp);
             }
             boolean isStrongAuthRequired = isStrongAuthRequired();
             // Map boolean flags to an index by isStrongAuth << 2 + isManagedProfile << 1 + isAlpha.
             int index = ((isStrongAuthRequired ? 1 : 0) << 2) + ((mIsManagedProfile ? 1 : 0) << 1)
                     + (mIsAlpha ? 1 : 0);
-            return DETAIL_TEXTS[index];
+            return mDevicePolicyManager.getString(
+                    DETAIL_TEXT_OVERRIDES[index], () -> getString(DETAIL_TEXTS[index]));
         }
 
         private int getErrorMessage() {
@@ -259,7 +288,17 @@
         }
 
         @Override
-        protected int getLastTryErrorMessage(int userType) {
+        protected String getLastTryOverrideErrorMessageId(int userType) {
+            if (userType == USER_TYPE_MANAGED_PROFILE) {
+                return mIsAlpha ?  WORK_PROFILE_LAST_PASSWORD_ATTEMPT_BEFORE_WIPE
+                        : WORK_PROFILE_LAST_PIN_ATTEMPT_BEFORE_WIPE;
+            }
+
+            return UNDEFINED;
+        }
+
+        @Override
+        protected int getLastTryDefaultErrorMessage(int userType) {
             switch (userType) {
                 case USER_TYPE_PRIMARY:
                     return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_device
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index 6b9140a..f20a2a2 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -16,6 +16,12 @@
 
 package com.android.settings.password;
 
+import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PATTERN_HEADER;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PATTERN_ATTEMPT_BEFORE_WIPE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PATTERN_REQUIRED;
+
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.app.Activity;
@@ -258,19 +264,25 @@
             mGlifLayout.getDescriptionTextView().setAlpha(0f);
         }
 
-        private int getDefaultDetails() {
+        private String getDefaultDetails() {
             if (mFrp) {
-                return R.string.lockpassword_confirm_your_pattern_details_frp;
+                return getString(R.string.lockpassword_confirm_your_pattern_details_frp);
             }
             final boolean isStrongAuthRequired = isStrongAuthRequired();
             if (mIsManagedProfile) {
-                return isStrongAuthRequired
-                        ? R.string.lockpassword_strong_auth_required_work_pattern
-                        : R.string.lockpassword_confirm_your_pattern_generic_profile;
+                if (isStrongAuthRequired) {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_PATTERN_REQUIRED,
+                            () -> getString(
+                                    R.string.lockpassword_strong_auth_required_work_pattern));
+                } else {
+                    return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PATTERN,
+                            () -> getString(
+                                    R.string.lockpassword_confirm_your_pattern_generic_profile));
+                }
             } else {
                 return isStrongAuthRequired
-                        ? R.string.lockpassword_strong_auth_required_device_pattern
-                        : R.string.lockpassword_confirm_your_pattern_generic;
+                        ? getString(R.string.lockpassword_strong_auth_required_device_pattern)
+                        : getString(R.string.lockpassword_confirm_your_pattern_generic);
             }
         }
 
@@ -352,11 +364,16 @@
             mGlifLayout.getHeaderTextView().announceForAccessibility(mGlifLayout.getHeaderText());
         }
 
-        private int getDefaultHeader() {
-            if (mFrp) return R.string.lockpassword_confirm_your_pattern_header_frp;
-            return mIsManagedProfile
-                    ? R.string.lockpassword_confirm_your_work_pattern_header
-                    : R.string.lockpassword_confirm_your_pattern_header;
+        private String getDefaultHeader() {
+            if (mFrp) return getString(R.string.lockpassword_confirm_your_pattern_header_frp);
+
+            if (mIsManagedProfile) {
+                return mDevicePolicyManager.getString(
+                        CONFIRM_WORK_PROFILE_PATTERN_HEADER,
+                        () -> getString(R.string.lockpassword_confirm_your_work_pattern_header));
+            }
+
+            return getString(R.string.lockpassword_confirm_your_pattern_header);
         }
 
         private Runnable mClearPatternRunnable = new Runnable() {
@@ -550,7 +567,16 @@
         }
 
         @Override
-        protected int getLastTryErrorMessage(int userType) {
+        protected String getLastTryOverrideErrorMessageId(int userType) {
+            if (userType == USER_TYPE_MANAGED_PROFILE) {
+                return WORK_PROFILE_LAST_PATTERN_ATTEMPT_BEFORE_WIPE;
+            }
+
+            return UNDEFINED;
+        }
+
+        @Override
+        protected int getLastTryDefaultErrorMessage(int userType) {
             switch (userType) {
                 case USER_TYPE_PRIMARY:
                     return R.string.lock_last_pattern_attempt_before_wipe_device;
diff --git a/src/com/android/settings/security/LockUnificationPreferenceController.java b/src/com/android/settings/security/LockUnificationPreferenceController.java
index 798691f..ec7a6ed 100644
--- a/src/com/android/settings/security/LockUnificationPreferenceController.java
+++ b/src/com/android/settings/security/LockUnificationPreferenceController.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.security;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE;
+
 import static com.android.settings.security.SecuritySettings.UNIFY_LOCK_CONFIRM_PROFILE_REQUEST;
 import static com.android.settings.security.SecuritySettings.UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST;
 
@@ -190,8 +192,8 @@
      */
     public void startUnification() {
         // Confirm profile lock
-        final String title = mContext.getString(
-                R.string.unlock_set_unlock_launch_picker_title_profile);
+        final String title = mDpm.getString(WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE,
+                () -> mContext.getString(R.string.unlock_set_unlock_launch_picker_title_profile));
         final ChooseLockSettingsHelper.Builder builder =
                 new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost);
         final boolean launched = builder.setRequestCode(UNIFY_LOCK_CONFIRM_PROFILE_REQUEST)
diff --git a/src/com/android/settings/security/UnificationConfirmationDialog.java b/src/com/android/settings/security/UnificationConfirmationDialog.java
index d8638bc..929751c 100644
--- a/src/com/android/settings/security/UnificationConfirmationDialog.java
+++ b/src/com/android/settings/security/UnificationConfirmationDialog.java
@@ -16,7 +16,11 @@
 
 package com.android.settings.security;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_DETAIL;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_NONCOMPLIANT;
+
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
 import android.content.DialogInterface;
 import android.os.Bundle;
@@ -53,10 +57,16 @@
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         final SecuritySettings parentFragment = ((SecuritySettings) getParentFragment());
         final boolean compliant = getArguments().getBoolean(EXTRA_COMPLIANT);
+
+        String overrideMessageId = compliant ? WORK_PROFILE_UNIFY_LOCKS_DETAIL
+                : WORK_PROFILE_UNIFY_LOCKS_NONCOMPLIANT;
+        int defaultMessageId = compliant ? R.string.lock_settings_profile_unification_dialog_body
+                : R.string.lock_settings_profile_unification_dialog_uncompliant_body;
+
         return new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.lock_settings_profile_unification_dialog_title)
-                .setMessage(compliant ? R.string.lock_settings_profile_unification_dialog_body
-                        : R.string.lock_settings_profile_unification_dialog_uncompliant_body)
+                .setMessage(getContext().getSystemService(DevicePolicyManager.class)
+                        .getString(overrideMessageId, () -> getString(defaultMessageId)))
                 .setPositiveButton(
                         compliant ? R.string.lock_settings_profile_unification_dialog_confirm
                                 : R.string
diff --git a/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java b/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java
index abeef2d..17e7e01 100644
--- a/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java
+++ b/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.security.screenlock;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 
 import android.app.admin.DevicePolicyManager;
@@ -123,7 +124,8 @@
     private void updateLockAfterPreferenceSummary(TimeoutListPreference preference) {
         final CharSequence summary;
         if (preference.isDisabledByAdmin()) {
-            summary = mContext.getText(R.string.disabled_by_policy_title);
+            summary = mDPM.getString(DISABLED_BY_IT_ADMIN_TITLE,
+                    () -> mContext.getString(R.string.disabled_by_policy_title));
         } else {
             // Update summary message with current value
             long currentTimeout = Settings.Secure.getLong(mContext.getContentResolver(),
diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java
index 6915e95..3c19d7e 100644
--- a/src/com/android/settings/users/UserDialogs.java
+++ b/src/com/android/settings/users/UserDialogs.java
@@ -16,7 +16,11 @@
 
 package com.android.settings.users;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_REMOVE_MESSAGE;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_REMOVE_TITLE;
+
 import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.ApplicationInfo;
@@ -52,17 +56,20 @@
     public static Dialog createRemoveDialog(Context context, int removingUserId,
             DialogInterface.OnClickListener onConfirmListener) {
         UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
         UserInfo userInfo = um.getUserInfo(removingUserId);
         AlertDialog.Builder builder = new AlertDialog.Builder(context)
                 .setPositiveButton(R.string.user_delete_button, onConfirmListener)
                 .setNegativeButton(android.R.string.cancel, null);
         if (userInfo.isManagedProfile()) {
-            builder.setTitle(R.string.work_profile_confirm_remove_title);
+            builder.setTitle(dpm.getString(WORK_PROFILE_CONFIRM_REMOVE_TITLE,
+                    () -> context.getString(R.string.work_profile_confirm_remove_title)));
             View view = createRemoveManagedUserDialogView(context, removingUserId);
             if (view != null) {
                 builder.setView(view);
             } else {
-                builder.setMessage(R.string.work_profile_confirm_remove_message);
+                builder.setMessage(dpm.getString(WORK_PROFILE_CONFIRM_REMOVE_MESSAGE,
+                        () -> context.getString(R.string.work_profile_confirm_remove_message)));
             }
         } else if (UserHandle.myUserId() == removingUserId) {
             builder.setTitle(R.string.user_confirm_remove_self_title);
diff --git a/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java
index e372cb7..06a8fff 100644
--- a/src/com/android/settings/utils/ManagedServiceSettings.java
+++ b/src/com/android/settings/utils/ManagedServiceSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.utils;
 
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED;
+
 import android.annotation.Nullable;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
@@ -134,7 +136,9 @@
             if (managedProfileId != UserHandle.USER_NULL
                     && !mDpm.isNotificationListenerServicePermitted(
                             service.packageName, managedProfileId)) {
-                pref.setSummary(R.string.work_profile_notification_access_blocked_summary);
+                pref.setSummary(mDpm.getString(WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED,
+                        () -> getString(
+                                R.string.work_profile_notification_access_blocked_summary)));
             }
             pref.setOnPreferenceChangeListener((preference, newValue) -> {
                 final boolean enable = (boolean) newValue;
diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java
index 791d6ca..7c3ee79 100644
--- a/src/com/android/settings/widget/EntityHeaderController.java
+++ b/src/com/android/settings/widget/EntityHeaderController.java
@@ -289,7 +289,8 @@
             @Override
             public void onClick(View v) {
                 AppInfoBase.startAppInfoFragment(
-                        AppInfoDashboardFragment.class, R.string.application_info_label,
+                        AppInfoDashboardFragment.class,
+                        mActivity.getString(R.string.application_info_label),
                         mPackageName, mUid, mFragment, 0 /* request */,
                         mMetricsCategory);
             }
