diff --git a/faker/proxy.py b/faker/proxy.py
index 653a5943..03a6e42e 100644
--- a/faker/proxy.py
+++ b/faker/proxy.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
 import copy
 import functools
 import re
@@ -35,7 +37,7 @@ class Faker:
         use_weighting: bool = True,
         **config: Any,
     ) -> None:
-        self._factory_map = OrderedDict()
+        self._factory_map: OrderedDict[str, Generator | Faker] = OrderedDict()
         self._weights = None
         self._unique_proxy = UniqueProxy(self)
         self._optional_proxy = OptionalProxy(self)
@@ -54,7 +56,7 @@ class Faker:
                 if final_locale not in locales:
                     locales.append(final_locale)
 
-        elif isinstance(locale, OrderedDict):
+        elif isinstance(locale, (OrderedDict, dict)):
             assert all(isinstance(v, (int, float)) for v in locale.values())
             odict = OrderedDict()
             for k, v in locale.items():
@@ -66,15 +68,25 @@ class Faker:
         else:
             locales = [DEFAULT_LOCALE]
 
-        for locale in locales:
-            self._factory_map[locale] = Factory.create(
-                locale,
+        if len(locales) == 1:
+            self._factory_map[locales[0]] = Factory.create(
+                locales[0],
                 providers,
                 generator,
                 includes,
                 use_weighting=use_weighting,
                 **config,
             )
+        else:
+            for locale in locales:
+                self._factory_map[locale] = Faker(
+                    locale,
+                    providers,
+                    generator,
+                    includes,
+                    use_weighting=use_weighting,
+                    **config,
+                )
 
         self._locales = locales
         self._factories = list(self._factory_map.values())
@@ -85,8 +97,12 @@ class Faker:
             attributes |= {attr for attr in dir(factory) if not attr.startswith("_")}
         return sorted(attributes)
 
-    def __getitem__(self, locale: str) -> Generator:
-        return self._factory_map[locale.replace("-", "_")]
+    def __getitem__(self, locale: str) -> Faker:
+        if locale.replace("-", "_") in self.locales and len(self.locales) == 1:
+            return self
+        instance = self._factory_map[locale.replace("-", "_")]
+        assert isinstance(instance, Faker)  # for mypy
+        return instance
 
     def __getattribute__(self, attr: str) -> Any:
         """
@@ -273,10 +289,10 @@ class Faker:
         return self._weights
 
     @property
-    def factories(self) -> List[Generator]:
+    def factories(self) -> List[Generator | Faker]:
         return self._factories
 
-    def items(self) -> List[Tuple[str, Generator]]:
+    def items(self) -> List[Tuple[str, Generator | Faker]]:
         return list(self._factory_map.items())
 
 

diff --git a/tests/providers/test_misc.py b/tests/providers/test_misc.py
index ec9fe57a..df735eee 100644
--- a/tests/providers/test_misc.py
+++ b/tests/providers/test_misc.py
@@ -423,7 +423,7 @@ class TestMiscProvider:
     def test_dsv_data_columns(self, faker):
         num_rows = 10
         data_columns = ["{{name}}", "#??-####", "{{address}}", "{{phone_number}}"]
-        with patch.object(faker["en_US"], "pystr_format") as mock_pystr_format:
+        with patch.object(faker["en_US"].factories[0], "pystr_format") as mock_pystr_format:
             mock_pystr_format.assert_not_called()
             faker.dsv(data_columns=data_columns, num_rows=num_rows)
 
diff --git a/tests/providers/test_python.py b/tests/providers/test_python.py
index 6342bfb9..4935528e 100644
--- a/tests/providers/test_python.py
+++ b/tests/providers/test_python.py
@@ -523,7 +523,7 @@ class TestPystrFormat(unittest.TestCase):
         Faker.seed(0)
 
     def test_formatter_invocation(self):
-        with patch.object(self.fake["en_US"], "foo") as mock_foo:
+        with patch.object(self.fake["en_US"].factories[0], "foo") as mock_foo:
             with patch("faker.providers.BaseProvider.bothify", wraps=self.fake.bothify) as mock_bothify:
                 mock_foo.return_value = "barbar"
                 value = self.fake.pystr_format("{{foo}}?#?{{foo}}?#?{{foo}}", letters="abcde")
diff --git a/tests/test_proxy.py b/tests/test_proxy.py
index 322bc396..8b4b6d63 100644
--- a/tests/test_proxy.py
+++ b/tests/test_proxy.py
@@ -103,14 +103,14 @@ class TestFakerProxyClass:
         fake = Faker(locale)
         for locale_name, factory in fake.items():
             assert locale_name in processed_locale
-            assert isinstance(factory, Generator)
+            assert isinstance(factory, (Generator, Faker))
 
     def test_dunder_getitem(self):
         locale = ["de_DE", "en-US", "en-PH", "ja_JP"]
         fake = Faker(locale)
 
         for code in locale:
-            assert isinstance(fake[code], Generator)
+            assert isinstance(fake[code], (Generator, Faker))
 
         with pytest.raises(KeyError):
             fake["en_GB"]

Unicity and localization
* Faker version: 17.4.0
* OS: Archlinux

It seems that uniqueness and localization cannot be used together:

```python
>>> from faker import Faker
... fake = Faker(['it_IT', 'en_US', 'ja_JP'])
>>> fake['it_IT'].name()
'Giuseppina Juvara'
>>> fake['it_IT'].unique.name()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Generator' object has no attribute 'unique'

>>> fake.unique.name()
'石井 翔太'
>>> fake.unique['it_IT'].name()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'UniqueProxy' object is not subscriptable
```

I would lo to be able to use both features at the same time!


tests/providers/test_misc.py::TestMiscProvider::test_dsv_data_columns tests/providers/test_python.py::TestPystrFormat::test_formatter_invocation
tests/providers/test_misc.py::TestMiscProvider::test_uuid4_str tests/providers/test_misc.py::TestMiscProvider::test_uuid4_int tests/providers/test_misc.py::TestMiscProvider::test_uuid4_uuid_object tests/providers/test_misc.py::TestMiscProvider::test_uuid4_seedability tests/providers/test_misc.py::TestMiscProvider::test_zip_invalid_file tests/providers/test_misc.py::TestMiscProvider::test_zip_one_byte_undersized tests/providers/test_misc.py::TestMiscProvider::test_zip_exact_minimum_size tests/providers/test_misc.py::TestMiscProvider::test_zip_over_minimum_size tests/providers/test_misc.py::TestMiscProvider::test_zip_compression_py3 tests/providers/test_misc.py::TestMiscProvider::test_tar_invalid_file tests/providers/test_misc.py::TestMiscProvider::test_tar_one_byte_undersized tests/providers/test_misc.py::TestMiscProvider::test_tar_exact_minimum_size tests/providers/test_misc.py::TestMiscProvider::test_tar_over_minimum_size tests/providers/test_misc.py::TestMiscProvider::test_tar_compression_py3 tests/providers/test_misc.py::TestMiscProvider::test_image_no_pillow tests/providers/test_misc.py::TestMiscProvider::test_dsv_with_invalid_values tests/providers/test_misc.py::TestMiscProvider::test_dsv_no_header tests/providers/test_misc.py::TestMiscProvider::test_dsv_with_valid_header tests/providers/test_misc.py::TestMiscProvider::test_dsv_with_row_ids tests/providers/test_misc.py::TestMiscProvider::test_dsv_csvwriter_kwargs tests/providers/test_misc.py::TestMiscProvider::test_xml_no_xmltodict tests/providers/test_misc.py::TestMiscProvider::test_csv_helper_method tests/providers/test_misc.py::TestMiscProvider::test_tsv_helper_method tests/providers/test_misc.py::TestMiscProvider::test_psv_helper_method tests/providers/test_misc.py::TestMiscProvider::test_json_with_arguments tests/providers/test_misc.py::TestMiscProvider::test_json_multiple_rows tests/providers/test_misc.py::TestMiscProvider::test_json_passthrough_values tests/providers/test_misc.py::TestMiscProvider::test_json_type_integrity_int tests/providers/test_misc.py::TestMiscProvider::test_json_type_integrity_float tests/providers/test_misc.py::TestMiscProvider::test_json_invalid_data_columns tests/providers/test_misc.py::TestMiscProvider::test_json_list_format_invalid_arguments_type tests/providers/test_misc.py::TestMiscProvider::test_json_list_format_nested_list_of_values tests/providers/test_misc.py::TestMiscProvider::test_json_list_format_nested_list_of_objects tests/providers/test_misc.py::TestMiscProvider::test_json_list_format_nested_objects tests/providers/test_misc.py::TestMiscProvider::test_json_dict_format_nested_list_of_values tests/providers/test_misc.py::TestMiscProvider::test_json_dict_format_nested_list_of_objects tests/providers/test_misc.py::TestMiscProvider::test_json_dict_format_nested_objects tests/providers/test_misc.py::TestMiscProvider::test_json_type_integrity_datetime_using_encoder tests/providers/test_misc.py::TestMiscProvider::test_json_type_integrity_datetime_no_encoder tests/providers/test_misc.py::TestMiscProvider::test_json_bytes tests/providers/test_misc.py::TestMiscProvider::test_fixed_width_with_arguments tests/providers/test_misc.py::TestMiscProvider::test_fixed_width_invalid_arguments_type tests/providers/test_misc.py::TestMiscProvider::test_md5 tests/providers/test_misc.py::TestMiscProvider::test_sha1 tests/providers/test_misc.py::TestMiscProvider::test_sha256 tests/providers/test_python.py::test_pyobject[None] tests/providers/test_python.py::test_pyobject[bool] tests/providers/test_python.py::test_pyobject[str] tests/providers/test_python.py::test_pyobject[float] tests/providers/test_python.py::test_pyobject[int] tests/providers/test_python.py::test_pyobject[tuple] tests/providers/test_python.py::test_pyobject[set] tests/providers/test_python.py::test_pyobject[list] tests/providers/test_python.py::test_pyobject[object_type8] tests/providers/test_python.py::test_pyobject[dict] tests/providers/test_python.py::test_pyobject_with_unknown_object_type[object] tests/providers/test_python.py::test_pyobject_with_unknown_object_type[type] tests/providers/test_python.py::test_pyobject_with_unknown_object_type[callable] tests/providers/test_python.py::test_pyfloat_right_and_left_digits_positive[1234567-5-12345] tests/providers/test_python.py::test_pyfloat_right_and_left_digits_positive[1234567-0-1] tests/providers/test_python.py::test_pyfloat_right_and_left_digits_positive[1234567-1-1] tests/providers/test_python.py::test_pyfloat_right_and_left_digits_positive[1234567-2-12] tests/providers/test_python.py::test_pyfloat_right_and_left_digits_positive[0123-1-1] tests/providers/test_python.py::test_pyfloat_right_or_left_digit_overflow tests/providers/test_python.py::TestPyint::test_pyint tests/providers/test_python.py::TestPyint::test_pyint_bound_0 tests/providers/test_python.py::TestPyint::test_pyint_bound_negative tests/providers/test_python.py::TestPyint::test_pyint_bound_positive tests/providers/test_python.py::TestPyint::test_pyint_bounds tests/providers/test_python.py::TestPyint::test_pyint_range tests/providers/test_python.py::TestPyint::test_pyint_step tests/providers/test_python.py::TestPyfloat::test_float_min_and_max_value_with_same_whole tests/providers/test_python.py::TestPyfloat::test_left_digits tests/providers/test_python.py::TestPyfloat::test_max_and_min_value_negative tests/providers/test_python.py::TestPyfloat::test_max_and_min_value_negative_with_decimals tests/providers/test_python.py::TestPyfloat::test_max_and_min_value_positive_with_decimals tests/providers/test_python.py::TestPyfloat::test_max_value tests/providers/test_python.py::TestPyfloat::test_max_value_and_positive tests/providers/test_python.py::TestPyfloat::test_max_value_should_be_greater_than_min_value tests/providers/test_python.py::TestPyfloat::test_max_value_zero_and_left_digits tests/providers/test_python.py::TestPyfloat::test_min_value tests/providers/test_python.py::TestPyfloat::test_min_value_and_left_digits tests/providers/test_python.py::TestPyfloat::test_positive tests/providers/test_python.py::TestPyfloat::test_positive_and_min_value_incompatible tests/providers/test_python.py::TestPyfloat::test_positive_doesnt_return_zero tests/providers/test_python.py::TestPyfloat::test_pyfloat tests/providers/test_python.py::TestPyfloat::test_right_digits tests/providers/test_python.py::TestPydecimal::test_left_digits tests/providers/test_python.py::TestPydecimal::test_left_digits_can_be_zero tests/providers/test_python.py::TestPydecimal::test_max_and_min_value_negative tests/providers/test_python.py::TestPydecimal::test_max_value tests/providers/test_python.py::TestPydecimal::test_max_value_always_returns_a_decimal tests/providers/test_python.py::TestPydecimal::test_max_value_and_positive tests/providers/test_python.py::TestPydecimal::test_max_value_should_be_greater_than_min_value tests/providers/test_python.py::TestPydecimal::test_max_value_zero_and_left_digits tests/providers/test_python.py::TestPydecimal::test_min_value tests/providers/test_python.py::TestPydecimal::test_min_value_10_pow_1000_return_greater_number tests/providers/test_python.py::TestPydecimal::test_min_value_always_returns_a_decimal tests/providers/test_python.py::TestPydecimal::test_min_value_and_left_digits tests/providers/test_python.py::TestPydecimal::test_min_value_minus_one_doesnt_return_positive tests/providers/test_python.py::TestPydecimal::test_min_value_minus_one_hundred_doesnt_return_positive tests/providers/test_python.py::TestPydecimal::test_min_value_one_hundred_doesnt_return_negative tests/providers/test_python.py::TestPydecimal::test_min_value_zero_doesnt_return_negative tests/providers/test_python.py::TestPydecimal::test_positive tests/providers/test_python.py::TestPydecimal::test_positive_and_min_value_incompatible tests/providers/test_python.py::TestPydecimal::test_positive_doesnt_return_zero tests/providers/test_python.py::TestPydecimal::test_pydecimal tests/providers/test_python.py::TestPydecimal::test_right_digits tests/providers/test_python.py::TestPystr::test_exact_length tests/providers/test_python.py::TestPystr::test_invalid_length_limits tests/providers/test_python.py::TestPystr::test_lower_length_limit tests/providers/test_python.py::TestPystr::test_no_parameters tests/providers/test_python.py::TestPystr::test_prefix tests/providers/test_python.py::TestPystr::test_prefix_and_suffix tests/providers/test_python.py::TestPystr::test_suffix tests/providers/test_python.py::TestPystr::test_upper_length_limit tests/providers/test_python.py::TestPython::test_pybool_return_type tests/providers/test_python.py::TestPython::test_pybool_truth_probability_fifty tests/providers/test_python.py::TestPython::test_pybool_truth_probability_hundred tests/providers/test_python.py::TestPython::test_pybool_truth_probability_less_than_zero tests/providers/test_python.py::TestPython::test_pybool_truth_probability_more_than_hundred tests/providers/test_python.py::TestPython::test_pybool_truth_probability_seventy_five tests/providers/test_python.py::TestPython::test_pybool_truth_probability_twenty_five tests/providers/test_python.py::TestPython::test_pybool_truth_probability_zero tests/providers/test_python.py::TestPython::test_pylist tests/providers/test_python.py::TestPython::test_pylist_types tests/providers/test_python.py::TestPython::test_pytuple tests/providers/test_python.py::TestPython::test_pytuple_size tests/test_proxy.py::TestFakerProxyClass::test_unspecified_locale tests/test_proxy.py::TestFakerProxyClass::test_locale_as_string tests/test_proxy.py::TestFakerProxyClass::test_locale_as_list tests/test_proxy.py::TestFakerProxyClass::test_locale_as_list_invalid_value_type tests/test_proxy.py::TestFakerProxyClass::test_locale_as_ordereddict tests/test_proxy.py::TestFakerProxyClass::test_invalid_locale tests/test_proxy.py::TestFakerProxyClass::test_items tests/test_proxy.py::TestFakerProxyClass::test_dunder_getitem tests/test_proxy.py::TestFakerProxyClass::test_seed_classmethod tests/test_proxy.py::TestFakerProxyClass::test_seed_class_locales tests/test_proxy.py::TestFakerProxyClass::test_seed_instance tests/test_proxy.py::TestFakerProxyClass::test_seed_locale tests/test_proxy.py::TestFakerProxyClass::test_single_locale_proxy_behavior tests/test_proxy.py::TestFakerProxyClass::test_multiple_locale_proxy_behavior tests/test_proxy.py::TestFakerProxyClass::test_multiple_locale_caching_behavior tests/test_proxy.py::TestFakerProxyClass::test_multiple_locale_factory_selection_no_weights tests/test_proxy.py::TestFakerProxyClass::test_multiple_locale_factory_selection_with_weights tests/test_proxy.py::TestFakerProxyClass::test_multiple_locale_factory_selection_single_provider tests/test_proxy.py::TestFakerProxyClass::test_multiple_locale_factory_selection_shared_providers tests/test_proxy.py::TestFakerProxyClass::test_multiple_locale_factory_selection_unsupported_method tests/test_proxy.py::TestFakerProxyClass::test_weighting_disabled_single_choice tests/test_proxy.py::TestFakerProxyClass::test_weighting_disabled_with_locales tests/test_proxy.py::TestFakerProxyClass::test_weighting_disabled_multiple_locales tests/test_proxy.py::TestFakerProxyClass::test_weighting_disabled_multiple_choices tests/test_proxy.py::TestFakerProxyClass::test_weighting_enabled_multiple_choices tests/test_proxy.py::TestFakerProxyClass::test_dir_include_all_providers_attribute_in_list tests/test_proxy.py::TestFakerProxyClass::test_copy tests/test_proxy.py::TestFakerProxyClass::test_pickle