diff --git a/include/tabulate/table_internal.hpp b/include/tabulate/table_internal.hpp
index 7e8652d..864f7da 100644
--- a/include/tabulate/table_internal.hpp
+++ b/include/tabulate/table_internal.hpp
@@ -297,7 +297,8 @@ inline void Printer::print_row_in_cell(std::ostream &stream, TableInternal &tabl
   auto cell = table[index.first][index.second];
   auto locale = cell.locale();
   auto is_multi_byte_character_support_enabled = cell.is_multi_byte_character_support_enabled();
-  auto old_locale = std::locale::global(std::locale(locale));
+  auto old_locale = std::locale();
+  stream.imbue(std::locale(locale));
   auto format = cell.format();
   auto text_height = splitted_cell_text.size();
   auto padding_top = *format.padding_top_;
@@ -377,7 +378,7 @@ inline void Printer::print_row_in_cell(std::ostream &stream, TableInternal &tabl
       reset_element_style(stream);
     }
   }
-  std::locale::global(old_locale);
+  stream.imbue(old_locale);
 }
 
 inline bool Printer::print_cell_border_top(std::ostream &stream, TableInternal &table,
@@ -386,7 +387,8 @@ inline bool Printer::print_cell_border_top(std::ostream &stream, TableInternal &
                                            size_t num_columns) {
   auto cell = table[index.first][index.second];
   auto locale = cell.locale();
-  auto old_locale = std::locale::global(std::locale(locale));
+  auto old_locale = std::locale();
+  stream.imbue(std::locale(locale));
   auto format = cell.format();
   auto column_width = dimension.second;
 
@@ -439,7 +441,7 @@ inline bool Printer::print_cell_border_top(std::ostream &stream, TableInternal &
       stream << corner;
     reset_element_style(stream);
   }
-  std::locale::global(old_locale);
+  stream.imbue(old_locale);
   return true;
 }
 
@@ -449,7 +451,8 @@ inline bool Printer::print_cell_border_bottom(std::ostream &stream, TableInterna
                                               size_t num_columns) {
   auto cell = table[index.first][index.second];
   auto locale = cell.locale();
-  auto old_locale = std::locale::global(std::locale(locale));
+  auto old_locale = std::locale();
+  stream.imbue(std::locale(locale));
   auto format = cell.format();
   auto column_width = dimension.second;
 
@@ -482,7 +485,7 @@ inline bool Printer::print_cell_border_bottom(std::ostream &stream, TableInterna
     stream << corner;
     reset_element_style(stream);
   }
-  std::locale::global(old_locale);
+  stream.imbue(old_locale);
   return true;
 }