Repository: joke2k/faker
Pull request #1104 (2020-01-27 16:29:03)

Provider updates for Russian locale
### What does this changes

Credit Card, Currency and Date-Time Providers were improved and expanded in Russian locale

### What was wrong

There were errors when generating a name of a credit card's owner: e.g. female first name and male last name, also the whole name was in Cyrillic characters when it's supposed to be romanised.
There were no Russian equivalents for currency names and time zone names.

### How this fixes it
 `translit()` method was added to Person provider to generate a romanised name of a credit card's owner
Most common types of credit cards were added to Credit Card Provider. Now there's also card-issuing bank in the credit card information, as issuers are often mentioned in many Russian texts regarding credit cards.
Currency names in Russian were added. Now Currency Provider has `currency_symbol()` method that generates a graphic symbol of some currency, these symbols are used too.
Russian names for time zones in Date-Time Provider were added to `countries` list. `DAY_NAMES` and `MONTH_NAMES` dictionaries were taken out of `day_of_week()` and `month_name()` methods so they could be used for testing.

All tests provided as well


fcurella: Thank you! ✨ 

Patch:
diff --git a/faker/providers/company/ru_RU/__init__.py b/faker/providers/company/ru_RU/__init__.py
index 63034742..91bcbb0f 100644
--- a/faker/providers/company/ru_RU/__init__.py
+++ b/faker/providers/company/ru_RU/__init__.py
@@ -157,6 +157,98 @@ class Provider(CompanyProvider):
         'Авиакомпания Икар',
     )
 
+    catch_phrase_adj = (
+        ('Автоматизированный', 'Автономный', 'Адаптивный', 'Амортизированный', 'Ассимилированный', 'Безопасный',
+         'Бизнес-ориентированный', 'Взаимовыгодный', 'Виртуальный', 'Глубокий', 'Горизонтальный', 'Делегируемый',
+         'Децентрализованный', 'Дублируемый', 'Инверсный', 'Инновационный', 'Интегрированный', 'Интуитивный',
+         'Качественный', 'Клиент-ориентированный', 'Контролируемый', 'Концептуальный', 'Корпоративный',
+         'Кросс-платформенный', 'Межгрупповой', 'Многогранный', 'Многоканальный', 'Многослойный', 'Многоуровневый',
+         'Модернизируемый', 'Настраиваемый', 'Новый', 'Общедоступный', 'Объектный', 'Обязательный', 'Оперативный',
+         'Оптимизированный', 'Опциональный', 'Организованный', 'Органичный', 'Ориентированный', 'Открытый',
+         'Оцифрованный', 'Переключаемый', 'Переосмысленный', 'Переработанный', 'Перспективный', 'Полный', 'Поэтапный',
+         'Превентивный', 'Программируемый', 'Прогрессивный', 'Продвинутый', 'Прочный', 'Разнообразный',
+         'Распределённый', 'Расширенный', 'Реализованный', 'Реконструируемый', 'Самодостаточный', 'Сбалансированный',
+         'Сетевой', 'Синхронизированный', 'Совместимый', 'Сокращенный', 'Сосредоточенный', 'Стабильный',
+         'Стратегический', 'Увеличенный', 'Удобный', 'Улучшенный', 'Улучшенный', 'Уменьшенный', 'Универсальный',
+         'Управляемый', 'Устойчивый', 'Фундаментальный', 'Функциональный', 'Цельный', 'Централизованный',
+         'Эксклюзивный', 'Элегантный', 'Эргономичный'),
+        ('аналитический', 'асимметричный', 'асинхронный', 'бездефектный', 'бескомпромиссный', 'веб-ориентированный',
+         'встречный', 'вторичный', 'высокоуровневый', 'гибкий', 'гибридный', 'глобальный', 'двунаправленный',
+         'действенный', 'динамичный', 'единообразный', 'заметный', 'инструктивный', 'интерактивный', 'исполнительный',
+         'итернациональный', 'клиент-серверный', 'контекстуальный', 'круглосуточный', 'логистический', 'локальный',
+         'максимальный', 'масштабируемый', 'методичный', 'многозадачный', 'мобильный', 'модульный', 'мультимедийный',
+         'наглядный', 'направленный', 'национальный', 'нейтральный', 'нестандартный', 'объектно-ориентированный',
+         'однородный', 'оптимальный', 'основной', 'отказостойкий', 'переходный', 'последовательный', 'потенциальный',
+         'пошаговый', 'прибыльный', 'приоритетный', 'промежуточный', 'радикальный', 'раздвоенный', 'региональный',
+         'связный', 'систематический', 'системный', 'составной', 'социальный', 'специализированный', 'статический',
+         'третичный', 'ультрасовременный', 'целостный', 'широкий', 'широкопрофильный', 'эвристический',
+         'экоцентричный', 'энергонезависимый', 'яркий'),
+    )
+
+    catch_phrase_nouns_masc = (
+        'адаптер', 'алгоритм', 'альянс', 'анализатор', 'архив', 'веб-сайт', 'вызов', 'графический интерфейс',
+        'графический интерфейс пользователя', 'доступ', 'инструментарий', 'интерфейс', 'инфопосредник',
+        'искусственный интеллект', 'массив', 'модератор', 'мониторинг', 'набор инструкций', 'параллелизм', 'подход',
+        'портал', 'прогноз', 'продукт', 'проект', 'протокол', 'ресурс', 'системный движок', 'успех', 'фреймворк', 'хаб',
+        'эталон',
+    )
+
+    catch_phrase_nouns_fem = (
+        'архитектура', 'база данных', 'база знаний', 'вероятность', 'возможность', 'гибкость', 'защищенная линия',
+        'иерархия', 'инициатива', 'инфраструктура', 'кодировка', 'конгломерация', 'концепция', 'координация',
+        'локальная сеть', 'матрица', 'методология', 'миграция', 'модель', 'нейронная сеть', 'парадигма', 'поддержка',
+        'политика', 'проекция', 'производительность', 'прошивка', 'рабочая группа', 'реализация', 'сеть Интранет',
+        'сеть Экстранет', 'служба поддержки', 'служба техподдержки', 'способность', 'стандартизация', 'стратегия',
+        'структура', 'суперструктура', 'установка', 'фокус-группа', 'функциональность', 'функция', 'ценовая структура',
+        'эмуляция',
+    )
+
+    catch_phrase_nouns_neu = (
+        'взаимодействие', 'групповое программное обеспечение', 'интернет-решение', 'использование',
+        'межплатформенное программное обеспечение', 'оборудование', 'определение', 'отношение', 'приложение',
+        'программное обеспечение', 'решение', 'совершенствование процесса', 'сотрудничество', 'управление бюджетом',
+        'хранилище данных', 'шифрование', 'ядро',
+    )
+
+    bsWords = (
+        ('Адаптация', 'Визуализация', 'Включение', 'Внедрение', 'Генерация', 'Инновация', 'Интеграция', 'Использование',
+         'Итерация', 'Конструирование', 'Координация', 'Культивация', 'Максимизация', 'Модернизация', 'Монетизация',
+         'Мотивация', 'Обеспечение', 'Объединение', 'Оптимизация', 'Освоение', 'Охват', 'Оцифровка', 'Перезагрузка',
+         'Переопределение', 'Переосмысление', 'Перепрофилирование', 'Переход', 'Преображение', 'Приспособление',
+         'Продление', 'Производство', 'Развитие', 'Разворачивание', 'Разработка', 'Распределение', 'Реализация',
+         'Революция', 'Синтез', 'Синхронизация', 'Сравнение', 'Трансформация', 'Увеличение', 'Управление', 'Ускорение',
+         'Формирование', 'Шкалирование', 'Эксплуатация'),
+        ('B2B', 'B2C', 'активных', 'безотказных', 'беспроводных', 'богатых', 'веб-ориентированных', 'вертикальных',
+         'виртуальных', 'глобальных', 'действенных', 'динамичных', 'заказных', 'индивидуальных', 'инновационных',
+         'интегрированных', 'интерактивных', 'интуитивных', 'концептуальных', 'корпоративных', 'критически важных',
+         'кроссплатформенных', 'круглогодичных', 'круглосуточных', 'лучших в своём роде', 'масштабируемых',
+         'мультимедийных', 'наглядных', 'надежных', 'онлайн и офлайн', 'ориентированных на пользователя', 'открытых',
+         'передовых', 'подробных', 'популярных', 'престижных', 'прибыльных', 'притягательных', 'прозрачных',
+         'распределённых', 'распространенных', 'расширяемых', 'революционных', 'сенсационных', 'серверных', 'сетевых',
+         'соблазнительных', 'совместных', 'современных', 'стандартных', 'стратегических', 'ультрасовременных',
+         'фронт-энд', 'целостных', 'цельных', 'эффективных'),
+        ('архитектур', 'аудиторий', 'веб-сервисов', 'взаимодействий', 'действий', 'диапазонов', 'знаний', 'инициатив',
+         'интернет-компаний', 'интернет-магазинов', 'интернет-продавцоы', 'интернет-услуг', 'интерфейсов',
+         'инфопосредников', 'инфраструктур', 'каналов', 'методик', 'метрик', 'моделей', 'ниш', 'областей интереса',
+         'отношений', 'парадигм', 'партнерств', 'платформ', 'пользователей', 'порталов', 'приложений', 'результатов',
+         'решений', 'рынков', 'сетей', 'систем', 'систем снабжения', 'сообществ', 'схем', 'технологий', 'функций'))
+
+    def catch_phrase(self):
+        """
+        :example: 'Адаптивный и масштабируемый графический интерфейс'
+        """
+        noun = self.random_element(self.catch_phrase_nouns_masc + self.catch_phrase_nouns_fem +
+                                   self.catch_phrase_nouns_neu)
+        adj_first = self.random_element(self.catch_phrase_adj[0])
+        adj_second = self.random_element(self.catch_phrase_adj[1])
+        if noun in self.catch_phrase_nouns_fem:
+            adj_first = adj_first[:-2] + 'ая'
+            adj_second = adj_second[:-2] + 'ая'
+        elif noun in self.catch_phrase_nouns_neu:
+            adj_first = adj_first[:-2] + 'ое'
+            adj_second = adj_second[:-2] + 'ое'
+        return adj_first + ' и ' + adj_second + ' ' + noun
+
     def large_company(self):
         """
         :example: 'АвтоВАЗ'
diff --git a/faker/providers/credit_card/ru_RU/__init__.py b/faker/providers/credit_card/ru_RU/__init__.py
new file mode 100644
index 00000000..65c96882
--- /dev/null
+++ b/faker/providers/credit_card/ru_RU/__init__.py
@@ -0,0 +1,51 @@
+from collections import OrderedDict
+
+from faker.providers.person.ru_RU import translit
+
+from .. import CreditCard
+from .. import Provider as CreditCardProvider
+
+
+class Provider(CreditCardProvider):
+    # Prefixes from: https://en.wikipedia.org/wiki/Payment_card_number#Issuer_identification_number_(IIN)
+    prefix_visa = ['4']
+    prefix_mastercard = ['51', '52', '53', '54', '55', '222%', '223', '224', '225', '226',
+                         '227', '228', '229', '23', '24', '25', '26', '270', '271', '2720']
+    prefix_mir = ['2200', '2201', '2202', '2203', '2204']
+    prefix_maestro = ['50', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69']
+    prefix_amex = ['34', '37']
+    prefix_unionpay = ['62', '81']
+
+    credit_card_types = OrderedDict((
+        ('visa', CreditCard('Visa', prefix_visa, security_code='CVV2')),
+        ('mastercard', CreditCard('Mastercard', prefix_mastercard, security_code='CVC2')),
+        ('mir', CreditCard('МИР', prefix_mir)),
+        ('maestro', CreditCard('Maestro', prefix_maestro, security_code='CVV2')),
+        ('amex', CreditCard('American Express', prefix_amex, 15, security_code='CID', security_code_length=4)),
+        ('unionpay', CreditCard('Union Pay', prefix_unionpay)),
+    ))
+
+    def credit_card_expire(self, start='now', end='+4y', date_format='%m/%y'):
+        expire_date = self.generator.date_time_between(start, end)
+        return expire_date.strftime(date_format)
+
+    def credit_card_full(self, card_type=None):
+        card = self._credit_card_type(card_type)
+
+        tpl = ('{provider}\n'
+               '{owner}\n'
+               '{number} {expire_date}\n'
+               '{security}: {security_nb}\n'
+               '{issuer}')
+
+        tpl = tpl.format(provider=card.name,
+                         owner=translit(
+                             self.generator.parse(self.random_element(["{{first_name_male}} {{last_name_male}}",
+                                                                       "{{first_name_female}} {{last_name_female}}"]))),
+                         number=self.credit_card_number(card),
+                         expire_date=self.credit_card_expire(),
+                         security=card.security_code,
+                         security_nb=self.credit_card_security_code(card),
+                         issuer=self.generator.parse("{{bank}}"))
+
+        return self.generator.parse(tpl)
diff --git a/faker/providers/currency/__init__.py b/faker/providers/currency/__init__.py
index b26102dd..f6842e0e 100644
--- a/faker/providers/currency/__init__.py
+++ b/faker/providers/currency/__init__.py
@@ -1,5 +1,7 @@
 from .. import BaseProvider
 
+localized = True
+
 
 class Provider(BaseProvider):
     # Format: (code, name)
@@ -217,6 +219,24 @@ class Provider(BaseProvider):
         ('ADA', "Cardano"),
     )
 
+    # List of currency symbols in Unicode, source: https://www.unicode.org/charts/beta/nameslist/n_20A0.html
+    currency_symbols = {
+        'AFN': '\u060B', 'ANG': '\u0192', 'ARS': '\u0024', 'AUD': '\u0024', 'AWG': '\u0192', 'BBD': '\u0024',
+        'BDT': '\u09F3', 'BMD': '\u0024', 'BND': '\u0024', 'BOB': '\u0024', 'BRL': '\u0024', 'BSD': '\u0024',
+        'BZD': '\u0024', 'CAD': '\u0024', 'CLP': '\u0024', 'CNY': '\u00A5', 'COP': '\u0024', 'CRC': '\u20A1',
+        'CUP': '\u0024', 'CVE': '\u0024', 'DOP': '\u0024', 'EGP': '\u00A3', 'EUR': '\u20AC', 'FJD': '\u0024',
+        'FKP': '\u00A3', 'GBP': '\u00A3', 'GHS': '\u20B5', 'GIP': '\u00A3', 'GYD': '\u0024', 'HKD': '\u0024',
+        'HUF': '\u0192', 'IDR': '\u20A8', 'ILS': '\u20AA', 'INR': '\u20B9', 'IRR': '\uFDFC', 'JMD': '\u0024',
+        'JPY': '\u00A5', 'KHR': '\u17DB', 'KPW': '\u20A9', 'KRW': '\u20A9', 'KYD': '\u0024', 'KZT': '\u20B8',
+        'LAK': '\u20AD', 'LBP': '\u00A3', 'LKR': '\u20A8', 'LRD': '\u0024', 'MNT': '\u20AE', 'MOP': '\u0024',
+        'MUR': '\u20A8', 'MXN': '\u0024', 'NAD': '\u0024', 'NGN': '\u20A6', 'NIO': '\u0024', 'NPR': '\u20A8',
+        'NZD': '\u0024', 'OMR': '\uFDFC', 'PHP': '\u20B1', 'PKR': '\u20A8', 'PYG': '\u20B2', 'QAR': '\uFDFC',
+        'RUB': '\u20BD', 'SAR': '\uFDFC', 'SBD': '\u0024', 'SDG': '\u00A3', 'SGD': '\u0024', 'SHP': '\u00A3',
+        'SRD': '\u0024', 'SYP': '\u00A3', 'THB': '\u0E3F', 'TOP': '\u0024', 'TRY': '\u20BA', 'TTD': '\u0024',
+        'TWD': '\u0024', 'UAH': '\u20B4', 'USD': '\u0024', 'UY': '\u0024', 'VND': '\u20AB', 'WST': '\u0024',
+        'XCD': '\u0024', 'YER': '\uFDFC', 'ZWD': '\u0024',
+    }
+
     def currency(self):
         return self.random_element(self.currencies)
 
@@ -226,6 +246,14 @@ class Provider(BaseProvider):
     def currency_name(self):
         return self.currency()[1]
 
+    def currency_symbol(self, code=None):
+        """
+        :example: $
+        """
+        if code is None:
+            code = self.random_element(self.currency_symbols.keys())
+        return self.currency_symbols[code]
+
     def cryptocurrency(self):
         return self.random_element(self.cryptocurrencies)
 
diff --git a/faker/providers/currency/ru_RU/__init__.py b/faker/providers/currency/ru_RU/__init__.py
new file mode 100644
index 00000000..72f3f778
--- /dev/null
+++ b/faker/providers/currency/ru_RU/__init__.py
@@ -0,0 +1,172 @@
+from .. import Provider as CurrencyProvider
+
+
+class Provider(CurrencyProvider):
+    # Format: (code, name)
+    # See currency names in Russian: https://ru.wikipedia.org/wiki/Список_существующих_валют#Валюты
+    currencies = (
+        ("AED", "Дирхам ОАЭ"),
+        ("AFN", "Афгани"),
+        ("ALL", "Лек"),
+        ("AMD", "Армянский драм"),
+        ("ANG", "Нидерландский антильский гульден"),
+        ("AOA", "Кванза"),
+        ("ARS", "Аргентинское песо"),
+        ("AUD", "Австралийский доллар"),
+        ("AWG", "Арубанский флорин"),
+        ("AZN", "Азербайджанский манат"),
+        ("BAM", "Конвертируемая марка Боснии и Герцеговины"),
+        ("BBD", "Барбадосский доллар"),
+        ("BDT", "Така"),
+        ("BGN", "Болгарский лев"),
+        ("BHD", "Бахрейнский динар"),
+        ("BIF", "Бурундийский франк"),
+        ("BMD", "Бермудский доллар"),
+        ("BND", "Брунейский доллар"),
+        ("BOB", "Боливиано"),
+        ("BRL", "Бразильский реал"),
+        ("BSD", "Багамский доллар"),
+        ("BTN", "Нгултрум"),
+        ("BWP", "Пула"),
+        ("BYR", "Белорусский рубль"),
+        ("BZD", "Белизский доллар"),
+        ("CAD", "Канадский доллар"),
+        ("CDF", "Конголезский франк"),
+        ("CHF", "Швейцарский франк"),
+        ("CLP", "Чилийское песо"),
+        ("CNY", "Юань"),
+        ("COP", "Колумбийское песо"),
+        ("CRC", "Коста-риканский колон"),
+        ("CUC", "Кубанское конвертируемое песо"),
+        ("CUP", "Кубанское песо"),
+        ("CVE", "Эскудо Кабо-Верде"),
+        ("CZK", "Чешская крона"),
+        ("DJF", "Франк Джибути"),
+        ("DKK", "Датская крона"),
+        ("DOP", "Доминиканское песо"),
+        ("DZD", "Алжирский динар"),
+        ("EGP", "Египетский фунт"),
+        ("ERN", "Накфа"),
+        ("ETB", "Эфиопский быр"),
+        ("EUR", "Евро"),
+        ("FJD", "Доллар Фиджи"),
+        ("FKP", "Фунт Фолклендских островов"),
+        ("GBP", "Фунт стерлингов"),
+        ("GEL", "Лари"),
+        ("GGP", "Гернсийский фунт"),
+        ("GHS", "Ганский седи"),
+        ("GIP", "Гибралтарский фунт"),
+        ("GMD", "Даласи"),
+        ("GNF", "Гвинейский франк"),
+        ("GTQ", "Кетсаль"),
+        ("GYD", "Гайанский доллар"),
+        ("HKD", "Гонконгский доллар"),
+        ("HNL", "Лемпира"),
+        ("HRK", "Хорватская куна"),
+        ("HTG", "Гурд"),
+        ("HUF", "Форинт"),
+        ("IDR", "Индонезийская рупия"),
+        ("ILS", "Новый израильский шекель"),
+        ("NIS", "Новый израильский шекель"),
+        ("IMP", "Фунт острова Мэн"),
+        ("INR", "Индийская рупия"),
+        ("IQD", "Иракский динар"),
+        ("IRR", "Иранский риал"),
+        ("ISK", "Исландская крона"),
+        ("JEP", "Джерсийский фунт"),
+        ("JMD", "Ямайский доллар"),
+        ("JOD", "Иорданский динар"),
+        ("JPY", "Иена"),
+        ("KES", "Кенийский шиллинг"),
+        ("KGS", "Сом"),
+        ("KHR", "Риель"),
+        ("KMF", "Франк Комор"),
+        ("KPW", "Северокорейская вона"),
+        ("KRW", "Южнокорейская вона"),
+        ("KWD", "Кувейтский динар"),
+        ("KYD", "Доллар Островов Кайман"),
+        ("KZT", "Тенге"),
+        ("LAK", "Кип"),
+        ("LBP", "Ливийский фунт"),
+        ("LKR", "Шри-ланкийская рупия"),
+        ("LRD", "Либерийский доллар"),
+        ("LSL", "Лоти"),
+        ("LTL", "Литовский лит"),
+        ("LYD", "Ливийский динар"),
+        ("MAD", "Марокканский дирхам"),
+        ("MDL", "Молдавский лей"),
+        ("MGA", "Малагасийский ариари"),
+        ("MKD", "Денар"),
+        ("MMK", "Кьят"),
+        ("MNT", "Тугрик"),
+        ("MOP", "Патака"),
+        ("MRO", "Угия"),
+        ("MUR", "Маврикийская рупия"),
+        ("MVR", "Рувия"),
+        ("MWK", "Квача"),
+        ("MXN", "Мексиканское песо"),
+        ("MYR", "Малайзийский ринггит"),
+        ("MZN", "Мозамбикский метикал"),
+        ("NAD", "Доллар Намибии"),
+        ("NGN", "Найра"),
+        ("NIO", "Кордоба"),
+        ("NOK", "Норвежская крона"),
+        ("NPR", "Непальская рупия"),
+        ("NZD", "Новозеландский доллар"),
+        ("OMR", "Оманский риал"),
+        ("PAB", "Бальбоа"),
+        ("PEN", "Соль"),
+        ("PGK", "Кина"),
+        ("PHP", "Филиппинское песо"),
+        ("PKR", "Пакистанская рупия"),
+        ("PLN", "Злотый"),
+        ("PYG", "Гуарани"),
+        ("QAR", "Катарский риал"),
+        ("RON", "Румынский лей"),
+        ("RSD", "Сербский динар"),
+        ("RUB", "Российский рубль"),
+        ("RWF", "Франк Руанды"),
+        ("SAR", "Саудовский риял"),
+        ("SBD", "Доллар Соломоновых Островов"),
+        ("SCR", "Сейшельская рупия"),
+        ("SDG", "Суданский фунт"),
+        ("SEK", "Шведская крона"),
+        ("SGD", "Сингапурский доллар"),
+        ("SHP", "Фунт Святой Елены"),
+        ("SLL", "Леоне"),
+        ("SOS", "Сомалийский шиллинг"),
+        ("SPL", "Луиджино"),
+        ("SRD", "Суринамский доллар"),
+        ("STD", "Добра"),
+        ("SVC", "Сальвадорский колон"),
+        ("SYP", "Сирийский фунт"),
+        ("SZL", "Лилангени"),
+        ("THB", "Бат"),
+        ("TJS", "Сомони"),
+        ("TMT", "Новый туркменский манат"),
+        ("TND", "Тунисский динар"),
+        ("TOP", "Паанга"),
+        ("TRY", "Турецкая лира"),
+        ("TTD", "Доллар Тринидада и Тобаго"),
+        ("TVD", "Доллар Тувалу"),
+        ("TWD", "Новый тайваньский доллар"),
+        ("TZS", "Танзанийский шиллинг"),
+        ("UAH", "Гривна"),
+        ("UGX", "Угандийский шиллинг"),
+        ("USD", "Доллар США"),
+        ("UYU", "Уругвайское песо"),
+        ("UZS", "Узбекский сум"),
+        ("VEF", "Суверенный боливар"),
+        ("VND", "Донг"),
+        ("VUV", "Вату"),
+        ("WST", "Тала"),
+        ("XAF", "Франк КФА ВЕАС"),
+        ("XCD", "Восточно-карибский доллар"),
+        ("XDR", "СДР"),
+        ("XOF", "Франк КФА ВСЕАО"),
+        ("XPF", "Франк КФП"),
+        ("YER", "Йеменский риал"),
+        ("ZAR", "Рэнд"),
+        ("ZMW", "Замбийская квача"),
+        ("ZWD", "Доллар Зимбабве"),
+    )
diff --git a/faker/providers/date_time/ru_RU/__init__.py b/faker/providers/date_time/ru_RU/__init__.py
index 337a5f83..8618c508 100644
--- a/faker/providers/date_time/ru_RU/__init__.py
+++ b/faker/providers/date_time/ru_RU/__init__.py
@@ -3,33 +3,1243 @@ from .. import Provider as DateTimeProvider
 
 class Provider(DateTimeProvider):
 
+    DAY_NAMES = {
+        "0": "Воскресенье",
+        "1": "Понедельник",
+        "2": "Вторник",
+        "3": "Среда",
+        "4": "Четверг",
+        "5": "Пятница",
+        "6": "Суббота",
+    }
+
+    MONTH_NAMES = {
+        "01": "Январь",
+        "02": "Февраль",
+        "03": "Март",
+        "04": "Апрель",
+        "05": "Май",
+        "06": "Июнь",
+        "07": "Июль",
+        "08": "Август",
+        "09": "Сентябрь",
+        "10": "Октябрь",
+        "11": "Ноябрь",
+        "12": "Декабрь",
+    }
+
+    # Timezone names are based on Wiki list, source: https://ru.wikipedia.org/wiki/Список_часовых_поясов_по_странам
+    countries = [{'timezones': ['Андорра (UTC+01)'],
+                  'alpha-2-code': 'AD',
+                  'alpha-3-code': 'AND',
+                  'continent': 'Европа',
+                  'name': 'Андорра',
+                  'capital': 'Андорра-ла-Велья'},
+                 {'timezones': ['Афганистан (UTC+04:30)'],
+                  'alpha-2-code': 'AF',
+                  'alpha-3-code': 'AFG',
+                  'continent': 'Азия',
+                  'name': 'Афганистан',
+                  'capital': 'Кабул'},
+                 {'timezones': ['Антигуа и Барбуда (UTC-04)'],
+                  'alpha-2-code': 'AG',
+                  'alpha-3-code': 'ATG',
+                  'continent': 'Северная Америка',
+                  'name': 'Антигуа и Барбуда',
+                  'capital': "Сент-Джонс"},
+                 {'timezones': ['Албания (UTC+01)'],
+                  'alpha-2-code': 'AL',
+                  'alpha-3-code': 'ALB',
+                  'continent': 'Европа',
+                  'name': 'Албания',
+                  'capital': 'Тирана'},
+                 {'timezones': ['Армения (UTC+04)'],
+                  'alpha-2-code': 'AM',
+                  'alpha-3-code': 'ARM',
+                  'continent': 'Азия',
+                  'name': 'Армения',
+                  'capital': 'Ереван'},
+                 {'timezones': ['Ангола (UTC+01)'],
+                  'alpha-2-code': 'AO',
+                  'alpha-3-code': 'AGO',
+                  'continent': 'Африка',
+                  'name': 'Ангола',
+                  'capital': 'Луанда'},
+                 {'timezones': ['Аргентина (UTC-03)'],
+                  'alpha-2-code': 'AR',
+                  'alpha-3-code': 'ARG',
+                  'continent': 'Южная Америка',
+                  'name': 'Аргентина',
+                  'capital': 'Буэнос Айрес'},
+                 {'timezones': ['Австрия (UTC+01)'],
+                  'alpha-2-code': 'AT',
+                  'alpha-3-code': 'AUT',
+                  'continent': 'Европа',
+                  'name': 'Австрия',
+                  'capital': 'Вена'},
+                 {'timezones': ['Австралия (UTC+05)',
+                                'Австралия (UTC+06:30)',
+                                'Австралия (UTC+07)',
+                                'Австралия (UTC+08)',
+                                'Австралия (UTC+9:30)',
+                                'Австралия (UTC+10)',
+                                'Австралия (UTC+10:30)',
+                                'Австралия (UTC+11:30)'],
+                  'alpha-2-code': 'AU',
+                  'alpha-3-code': 'AUS',
+                  'continent': 'Океания',
+                  'name': 'Австралия',
+                  'capital': 'Канберра'},
+                 {'timezones': ['Азербайджан (UTC+04)'],
+                  'alpha-2-code': 'AZ',
+                  'alpha-3-code': 'AZE',
+                  'continent': 'Азия',
+                  'name': 'Азербайджан',
+                  'capital': 'Баку'},
+                 {'timezones': ['Барбадос (UTC-04)'],
+                  'alpha-2-code': 'BB',
+                  'alpha-3-code': 'BRB',
+                  'continent': 'Северная Америка',
+                  'name': 'Барбадос',
+                  'capital': 'Бриджтаун'},
+                 {'timezones': ['Бангладеш (UTC+06)'],
+                  'alpha-2-code': 'BD',
+                  'alpha-3-code': 'BGD',
+                  'continent': 'Азия',
+                  'name': 'Бангладеш',
+                  'capital': 'Дака'},
+                 {'timezones': ['Бельгия (UTC+01)'],
+                  'alpha-2-code': 'BE',
+                  'alpha-3-code': 'BEL',
+                  'continent': 'Европа',
+                  'name': 'Бельгия',
+                  'capital': 'Брюссель'},
+                 {'timezones': ['Буркина-Фасо (UTC)'],
+                  'alpha-2-code': 'BF',
+                  'alpha-3-code': 'BFA',
+                  'continent': 'Африка',
+                  'name': 'Буркина-Фасо',
+                  'capital': 'Уагадугу'},
+                 {'timezones': ['Болгария (UTC+02)'],
+                  'alpha-2-code': 'BG',
+                  'alpha-3-code': 'BGR',
+                  'continent': 'Европа',
+                  'name': 'Болгария',
+                  'capital': 'София'},
+                 {'timezones': ['Бахрейн (UTC+03)'],
+                  'alpha-2-code': 'BH',
+                  'alpha-3-code': 'BHR',
+                  'continent': 'Азия',
+                  'name': 'Бахрейн',
+                  'capital': 'Манама'},
+                 {'timezones': ['Бурунди (UTC+02)'],
+                  'alpha-2-code': 'BI',
+                  'alpha-3-code': 'BDI',
+                  'continent': 'Африка',
+                  'name': 'Бурунди',
+                  'capital': 'Гитега'},
+                 {'timezones': ['Бенин (UTC+01)'],
+                  'alpha-2-code': 'BJ',
+                  'alpha-3-code': 'BEN',
+                  'continent': 'Африка',
+                  'name': 'Бенин',
+                  'capital': 'Порто-Ново'},
+                 {'timezones': ['Бруней (UTC+08)'],
+                  'alpha-2-code': 'BN',
+                  'alpha-3-code': 'BRN',
+                  'continent': 'Азия',
+                  'name': 'Бруней',
+                  'capital': 'Бандар-Сери-Бегаван'},
+                 {'timezones': ['Боливия (UTC-04)'],
+                  'alpha-2-code': 'BO',
+                  'alpha-3-code': 'BOL',
+                  'continent': 'Южная Америка',
+                  'name': 'Боливия',
+                  'capital': 'Сукре'},
+                 {'timezones': ['Бразилия (UTC-05)',
+                                'Бразилия (UTC-04)',
+                                'Бразилия (UTC-03)',
+                                'Бразилия (UTC-02)'],
+                  'alpha-2-code': 'BR',
+                  'alpha-3-code': 'BRA',
+                  'continent': 'Южная Америка',
+                  'name': 'Бразилия',
+                  'capital': 'Бразилиа'},
+                 {'timezones': ['Багамские Острова (UTC-05)'],
+                  'alpha-2-code': 'BS',
+                  'alpha-3-code': 'BHS',
+                  'continent': 'Северная Америка',
+                  'name': 'Багамские Острова',
+                  'capital': 'Нассау'},
+                 {'timezones': ['Бутан (UTC+06)'],
+                  'alpha-2-code': 'BT',
+                  'alpha-3-code': 'BTN',
+                  'continent': 'Азия',
+                  'name': 'Бутан',
+                  'capital': 'Тхимпху'},
+                 {'timezones': ['Ботсвана (UTC+02)'],
+                  'alpha-2-code': 'BW',
+                  'alpha-3-code': 'BWA',
+                  'continent': 'Африка',
+                  'name': 'Ботсвана',
+                  'capital': 'Габороне'},
+                 {'timezones': ['Белоруссия (UTC+03)'],
+                  'alpha-2-code': 'BY',
+                  'alpha-3-code': 'BLR',
+                  'continent': 'Европа',
+                  'name': 'Белоруссия',
+                  'capital': 'Минск'},
+                 {'timezones': ['Белиз (UTC-06)'],
+                  'alpha-2-code': 'BZ',
+                  'alpha-3-code': 'BLZ',
+                  'continent': 'Северная Америка',
+                  'name': 'Белиз',
+                  'capital': 'Бельмопан'},
+                 {'timezones': ['Канада (UTC-08)',
+                                'Канада (UTC-07)',
+                                'Канада (UTC-06)',
+                                'Канада (UTC-05)',
+                                'Канада (UTC-04)',
+                                'Канада (UTC-03:30)'],
+                  'alpha-2-code': 'CA',
+                  'alpha-3-code': 'CAN',
+                  'continent': 'Северная Америка',
+                  'name': 'Канада',
+                  'capital': 'Оттава'},
+                 {'timezones': ['Демократическая Республика Конго (UTC+01)',
+                                'Демократическая Республика Конго (UTC+02)'],
+                  'alpha-2-code': 'CD',
+                  'alpha-3-code': 'COD',
+                  'continent': 'Африка',
+                  'name': 'Демократическая Республика Конго',
+                  'capital': 'Киншаса'},
+                 {'timezones': ['Республика Конго (UTC+01)'],
+                  'alpha-2-code': 'CG',
+                  'alpha-3-code': 'COG',
+                  'continent': 'Африка',
+                  'name': 'Руспублика Конго',
+                  'capital': 'Браззавиль'},
+                 {'timezones': ["Кот-д'Ивуар (UTC)"],
+                  'alpha-2-code': 'CI',
+                  'alpha-3-code': 'CIV',
+                  'continent': 'Африка',
+                  'name': "Кот-д'Ивуар",
+                  'capital': 'Ямусукро'},
+                 {'timezones': ['Чили (UTC-06)',
+                                'Чили (UTC-04)'],
+                  'alpha-2-code': 'CL',
+                  'alpha-3-code': 'CHL',
+                  'continent': 'Южная Америка',
+                  'name': 'Чили',
+                  'capital': 'Сантьяго'},
+                 {'timezones': ['Камерун (UTC+01)'],
+                  'alpha-2-code': 'CM',
+                  'alpha-3-code': 'CMR',
+                  'continent': 'Африка',
+                  'name': 'Камерун',
+                  'capital': 'Яунде'},
+                 {'timezones': ['Китай (UTC+08)'],
+                  'alpha-2-code': 'CN',
+                  'alpha-3-code': 'CHN',
+                  'continent': 'Азия',
+                  'name': "Китайская Народная Республика",
+                  'capital': 'Пекин'},
+                 {'timezones': ['Колумбия (UTC-05)'],
+                  'alpha-2-code': 'CO',
+                  'alpha-3-code': 'COL',
+                  'continent': 'Южная Америка',
+                  'name': 'Колумбия',
+                  'capital': 'Богота'},
+                 {'timezones': ['Коста-Рика (UTC-06)'],
+                  'alpha-2-code': 'CR',
+                  'alpha-3-code': 'CRI',
+                  'continent': 'Северная Америка',
+                  'name': 'Коста-Рика',
+                  'capital': 'Сан-Хосе'},
+                 {'timezones': ['Куба (UTC-05)'],
+                  'alpha-2-code': 'CU',
+                  'alpha-3-code': 'CUB',
+                  'continent': 'Северная Америка',
+                  'name': 'Куба',
+                  'capital': 'Гавана'},
+                 {'timezones': ['Кабо-Верде (UTC-01)'],
+                  'alpha-2-code': 'CV',
+                  'alpha-3-code': 'CPV',
+                  'continent': 'Африка',
+                  'name': 'Кабо-Верде',
+                  'capital': 'Прая'},
+                 {'timezones': ['Кипр (UTC+02)'],
+                  'alpha-2-code': 'CY',
+                  'alpha-3-code': 'CYP',
+                  'continent': 'Азия',
+                  'name': 'Кипр',
+                  'capital': 'Никосия'},
+                 {'timezones': ['Чехия (UTC+01)'],
+                  'alpha-2-code': 'CZ',
+                  'alpha-3-code': 'CZE',
+                  'continent': 'Европа',
+                  'name': 'Чехия',
+                  'capital': 'Прага'},
+                 {'timezones': ['Германия (UTC+01)'],
+                  'alpha-2-code': 'DE',
+                  'alpha-3-code': 'DEU',
+                  'continent': 'Европа',
+                  'name': 'Германия',
+                  'capital': 'Берлин'},
+                 {'timezones': ['Джибути (UTC+03)'],
+                  'alpha-2-code': 'DJ',
+                  'alpha-3-code': 'DJI',
+                  'continent': 'Африка',
+                  'name': 'Джибути',
+                  'capital': 'Джибути'},
+                 {'timezones': ['Дания (UTC+01)'],
+                  'alpha-2-code': 'DK',
+                  'alpha-3-code': 'DNK',
+                  'continent': 'Европа',
+                  'name': 'Дания',
+                  'capital': 'Копенгаген'},
+                 {'timezones': ['Доминика (UTC-04)'],
+                  'alpha-2-code': 'DM',
+                  'alpha-3-code': 'DMA',
+                  'continent': 'Северная Америка',
+                  'name': 'Доминика',
+                  'capital': 'Розо'},
+                 {'timezones': ['Доминиканская Республика (UTC-04)'],
+                  'alpha-2-code': 'DO',
+                  'alpha-3-code': 'DOM',
+                  'continent': 'Северная Америка',
+                  'name': 'Доминиканская Республика',
+                  'capital': 'Санто-Доминго'},
+                 {'timezones': ['Эквадор (UTC-06)',
+                                'Эквадор (UTC-05)'],
+                  'alpha-2-code': 'EC',
+                  'alpha-3-code': 'ECU',
+                  'continent': 'Южная Америка',
+                  'name': 'Эквадор',
+                  'capital': 'Кито'},
+                 {'timezones': ['Эстония (UTC+02)'],
+                  'alpha-2-code': 'EE',
+                  'alpha-3-code': 'EST',
+                  'continent': 'Европа',
+                  'name': 'Эстония',
+                  'capital': 'Таллинн'},
+                 {'timezones': ['Египет (UTC+02)'],
+                  'alpha-2-code': 'EG',
+                  'alpha-3-code': 'EGY',
+                  'continent': 'Африка',
+                  'name': 'Египет',
+                  'capital': 'Каир'},
+                 {'timezones': ['Эритрея (UTC+03)'],
+                  'alpha-2-code': 'ER',
+                  'alpha-3-code': 'ERI',
+                  'continent': 'Африка',
+                  'name': 'Эритрея',
+                  'capital': 'Асмэра'},
+                 {'timezones': ['Эфиопия (UTC+03)'],
+                  'alpha-2-code': 'ET',
+                  'alpha-3-code': 'ETH',
+                  'continent': 'Африка',
+                  'name': 'Эфиопия',
+                  'capital': 'Аддис-Абеба'},
+                 {'timezones': ['Финляндия (UTC+02)'],
+                  'alpha-2-code': 'FI',
+                  'alpha-3-code': 'FIN',
+                  'continent': 'Европа',
+                  'name': 'Финляндия',
+                  'capital': 'Хельсинки'},
+                 {'timezones': ['Фиджи (UTC+12)'],
+                  'alpha-2-code': 'FJ',
+                  'alpha-3-code': 'FJI',
+                  'continent': 'Океания',
+                  'name': 'Фиджи',
+                  'capital': 'Сува'},
+                 {'timezones': ['Франция (UTC+01)'],
+                  'alpha-2-code': 'FR',
+                  'alpha-3-code': 'FRA',
+                  'continent': 'Европа',
+                  'name': 'Франция',
+                  'capital': 'Париж'},
+                 {'timezones': ['Габон (UTC+01)'],
+                  'alpha-2-code': 'GA',
+                  'alpha-3-code': 'GAB',
+                  'continent': 'Африка',
+                  'name': 'Габон',
+                  'capital': 'Либревиль'},
+                 {'timezones': ['Грузия (UTC+04)'],
+                  'alpha-2-code': 'GE',
+                  'alpha-3-code': 'GEO',
+                  'continent': 'Азия',
+                  'name': 'Грузия',
+                  'capital': 'Тбилиси'},
+                 {'timezones': ['Гана (UTC)'],
+                  'alpha-2-code': 'GH',
+                  'alpha-3-code': 'GHA',
+                  'continent': 'Африка',
+                  'name': 'Гана',
+                  'capital': 'Аккра'},
+                 {'timezones': ['Гамбия (UTC)'],
+                  'alpha-2-code': 'GM',
+                  'alpha-3-code': 'GMB',
+                  'continent': 'Африка',
+                  'name': 'Гамбия',
+                  'capital': 'Банджул'},
+                 {'timezones': ['Гвинея (UTC)'],
+                  'alpha-2-code': 'GN',
+                  'alpha-3-code': 'GIN',
+                  'continent': 'Африка',
+                  'name': 'Гвинея',
+                  'capital': 'Конакри'},
+                 {'timezones': ['Греция (UTC+02)'],
+                  'alpha-2-code': 'GR',
+                  'alpha-3-code': 'GRC',
+                  'continent': 'Европа',
+                  'name': 'Греция',
+                  'capital': 'Афины'},
+                 {'timezones': ['Гватемала (UTC-06)'],
+                  'alpha-2-code': 'GT',
+                  'alpha-3-code': 'GTM',
+                  'continent': 'Северная Америка',
+                  'name': 'Гватемала',
+                  'capital': 'Гватемала'},
+                 {'timezones': ['Гаити (UTC-05)'],
+                  'alpha-2-code': 'HT',
+                  'alpha-3-code': 'HTI',
+                  'continent': 'Северная Америка',
+                  'name': 'Гаити',
+                  'capital': 'Порт-о-Пренс'},
+                 {'timezones': ['Гвинея-Бисау (UTC)'],
+                  'alpha-2-code': 'GW',
+                  'alpha-3-code': 'GNB',
+                  'continent': 'Африка',
+                  'name': 'Гвинея-Бисау',
+                  'capital': 'Бисау'},
+                 {'timezones': ['Гайана (UTC-04)'],
+                  'alpha-2-code': 'GY',
+                  'alpha-3-code': 'GUY',
+                  'continent': 'Южная Америка',
+                  'name': 'Гайана',
+                  'capital': 'Джорджтаун'},
+                 {'timezones': ['Гондурас (UTC-06)'],
+                  'alpha-2-code': 'HN',
+                  'alpha-3-code': 'HND',
+                  'continent': 'Северная Америка',
+                  'name': 'Гондурас',
+                  'capital': 'Тегусигальпа'},
+                 {'timezones': ['Венгрия (UTC+01)'],
+                  'alpha-2-code': 'HU',
+                  'alpha-3-code': 'HUN',
+                  'continent': 'Европа',
+                  'name': 'Венгрия',
+                  'capital': 'Будапешт'},
+                 {'timezones': ['Индонезия (UTC+07)',
+                                'Индонезия (UTC+08)',
+                                'Индонезия (UTC+09)'],
+                  'alpha-2-code': 'ID',
+                  'alpha-3-code': 'IDN',
+                  'continent': 'Азия',
+                  'name': 'Индонезия',
+                  'capital': 'Джакарта'},
+                 {'timezones': ['Ирландия (UTC)'],
+                  'alpha-2-code': 'IE',
+                  'alpha-3-code': 'IRL',
+                  'continent': 'Европа',
+                  'name': 'Ирландия',
+                  'capital': 'Дублин'},
+                 {'timezones': ['Израиль (UTC+02)'],
+                  'alpha-2-code': 'IL',
+                  'alpha-3-code': 'ISR',
+                  'continent': 'Азия',
+                  'name': 'Израиль',
+                  'capital': 'Иерусалим'},
+                 {'timezones': ['Индия (UTC+05:30'],
+                  'alpha-2-code': 'IN',
+                  'alpha-3-code': 'IND',
+                  'continent': 'Азия',
+                  'name': 'Индия',
+                  'capital': 'Дели'},
+                 {'timezones': ['Ирак (UTC+03)'],
+                  'alpha-2-code': 'IQ',
+                  'alpha-3-code': 'IRQ',
+                  'continent': 'Азия',
+                  'name': 'Ирак',
+                  'capital': 'Багдад'},
+                 {'timezones': ['Иран (UTC+03:30)'],
+                  'alpha-2-code': 'IR',
+                  'alpha-3-code': 'IRN',
+                  'continent': 'Азия',
+                  'name': 'Иран',
+                  'capital': 'Тегеран'},
+                 {'timezones': ['Исландия (UTC)'],
+                  'alpha-2-code': 'IS',
+                  'alpha-3-code': 'ISL',
+                  'continent': 'Европа',
+                  'name': 'Исландия',
+                  'capital': 'Рейкьявик'},
+                 {'timezones': ['Италия (UTC+01)'],
+                  'alpha-2-code': 'IT',
+                  'alpha-3-code': 'ITA',
+                  'continent': 'Европа',
+                  'name': 'Италия',
+                  'capital': 'Рим'},
+                 {'timezones': ['Ямайка (UTC-05)'],
+                  'alpha-2-code': 'JM',
+                  'alpha-3-code': 'JAM',
+                  'continent': 'Северная Америка',
+                  'name': 'Ямайка',
+                  'capital': 'Кингстон'},
+                 {'timezones': ['Иордания (UTC+02)'],
+                  'alpha-2-code': 'JO',
+                  'alpha-3-code': 'JOR',
+                  'continent': 'Азия',
+                  'name': 'Иордания',
+                  'capital': 'Амман'},
+                 {'timezones': ['Япония (UTC+09)'],
+                  'alpha-2-code': 'JP',
+                  'alpha-3-code': 'JPN',
+                  'continent': 'Азия',
+                  'name': 'Япония',
+                  'capital': 'Токио'},
+                 {'timezones': ['Кения (UTC+03)'],
+                  'alpha-2-code': 'KE',
+                  'alpha-3-code': 'KEN',
+                  'continent': 'Африка',
+                  'name': 'Кения',
+                  'capital': 'Найроби'},
+                 {'timezones': ['Киргизия (UTC+06)'],
+                  'alpha-2-code': 'KG',
+                  'alpha-3-code': 'KGZ',
+                  'continent': 'Азия',
+                  'name': 'Киргизия',
+                  'capital': 'Бишкек'},
+                 {'timezones': ['Кирибати (UTC+12)',
+                                'Кирибати (UTC+13)',
+                                'Кирибати (UTC+14)'],
+                  'alpha-2-code': 'KI',
+                  'alpha-3-code': 'KIR',
+                  'continent': 'Океания',
+                  'name': 'Кирибати',
+                  'capital': 'Южная Тарава'},
+                 {'timezones': ['КНДР (UTC+09)'],
+                  'alpha-2-code': 'KP',
+                  'alpha-3-code': 'PRK',
+                  'continent': 'Азия',
+                  'name': 'КНДР',
+                  'capital': 'Пхеньян'},
+                 {'timezones': ['Республика Корея (UTC+09)'],
+                  'alpha-2-code': 'KR',
+                  'alpha-3-code': 'KOR',
+                  'continent': 'Азия',
+                  'name': 'Республика Корея',
+                  'capital': 'Сеул'},
+                 {'timezones': ['Кувейт (UTC+03)'],
+                  'alpha-2-code': 'KW',
+                  'alpha-3-code': 'KWT',
+                  'continent': 'Азия',
+                  'name': 'Кувейт',
+                  'capital': 'Эль-Кувейт'},
+                 {'timezones': ['Ливан (UTC+02)'],
+                  'alpha-2-code': 'LB',
+                  'alpha-3-code': 'LBN',
+                  'continent': 'Азия',
+                  'name': 'Ливан',
+                  'capital': 'Бейрут'},
+                 {'timezones': ['Лихтенштейн (UTC+01)'],
+                  'alpha-2-code': 'LI',
+                  'alpha-3-code': 'LIE',
+                  'continent': 'Европа',
+                  'name': 'Лихтенштейн',
+                  'capital': 'Вадуц'},
+                 {'timezones': ['Либерия (UTC)'],
+                  'alpha-2-code': 'LR',
+                  'alpha-3-code': 'LBR',
+                  'continent': 'Африка',
+                  'name': 'Либерия',
+                  'capital': 'Монровия'},
+                 {'timezones': ['Лесото (UTC+02)'],
+                  'alpha-2-code': 'LS',
+                  'alpha-3-code': 'LSO',
+                  'continent': 'Африка',
+                  'name': 'Лесото',
+                  'capital': 'Масеру'},
+                 {'timezones': ['Литва (UTC+02)'],
+                  'alpha-2-code': 'LT',
+                  'alpha-3-code': 'LTU',
+                  'continent': 'Европа',
+                  'name': 'Литва',
+                  'capital': 'Вильнюс'},
+                 {'timezones': ['Люксембург (UTC+01)'],
+                  'alpha-2-code': 'LU',
+                  'alpha-3-code': 'LUX',
+                  'continent': 'Европа',
+                  'name': 'Люксембург',
+                  'capital': 'Люксембург'},
+                 {'timezones': ['Латвия (UTC+02)'],
+                  'alpha-2-code': 'LV',
+                  'alpha-3-code': 'LVA',
+                  'continent': 'Европа',
+                  'name': 'Латвия',
+                  'capital': 'Рига'},
+                 {'timezones': ['Ливия (UTC+02)'],
+                  'alpha-2-code': 'LY',
+                  'alpha-3-code': 'LBY',
+                  'continent': 'Африка',
+                  'name': 'Ливия',
+                  'capital': 'Триполи'},
+                 {'timezones': ['Мадагаскар (UTC+03)'],
+                  'alpha-2-code': 'MG',
+                  'alpha-3-code': 'MDG',
+                  'continent': 'Африка',
+                  'name': 'Мадагаскар',
+                  'capital': 'Антананариву'},
+                 {'timezones': ['Маршалловы Острова (UTC+12)'],
+                  'alpha-2-code': 'MH',
+                  'alpha-3-code': 'MHL',
+                  'continent': 'Океания',
+                  'name': 'Маршалловы Острова',
+                  'capital': 'Маджуро'},
+                 {'timezones': ['Северная Македония (UTC+01)'],
+                  'alpha-2-code': 'MK',
+                  'alpha-3-code': 'MKD',
+                  'continent': 'Европа',
+                  'name': 'Северная Македония',
+                  'capital': 'Скопье'},
+                 {'timezones': ['Мали (UTC)'],
+                  'alpha-2-code': 'ML',
+                  'alpha-3-code': 'MLI',
+                  'continent': 'Африка',
+                  'name': 'Мали',
+                  'capital': 'Бамако'},
+                 {'timezones': ['Мьянма (UTC+06:30)'],
+                  'alpha-2-code': 'MM',
+                  'alpha-3-code': 'MMR',
+                  'continent': 'Азия',
+                  'name': 'Мьянма',
+                  'capital': 'Нейпьидо'},
+                 {'timezones': ['Монголия (UTC+07)',
+                                'Монголия (UTC+08)'],
+                  'alpha-2-code': 'MN',
+                  'alpha-3-code': 'MNG',
+                  'continent': 'Азия',
+                  'name': 'Монголия',
+                  'capital': 'Улан-Батор'},
+                 {'timezones': ['Мавритания (UTC)'],
+                  'alpha-2-code': 'MR',
+                  'alpha-3-code': 'MRT',
+                  'continent': 'Африка',
+                  'name': 'Мавритания',
+                  'capital': 'Нуакшот'},
+                 {'timezones': ['Мальта (UTC+01)'],
+                  'alpha-2-code': 'MT',
+                  'alpha-3-code': 'MLT',
+                  'continent': 'Европа',
+                  'name': 'Мальта',
+                  'capital': 'Валлетта'},
+                 {'timezones': ['Маврикий (UTC+04)'],
+                  'alpha-2-code': 'MU',
+                  'alpha-3-code': 'MUS',
+                  'continent': 'Африка',
+                  'name': 'Маврикий',
+                  'capital': 'Порт-Луи'},
+                 {'timezones': ['Мальдивы (UTC+05)'],
+                  'alpha-2-code': 'MV',
+                  'alpha-3-code': 'MDV',
+                  'continent': 'Азия',
+                  'name': 'Мальдивы',
+                  'capital': 'Мале'},
+                 {'timezones': ['Малави (UTC+02)'],
+                  'alpha-2-code': 'MW',
+                  'alpha-3-code': 'MWI',
+                  'continent': 'Африка',
+                  'name': 'Малави',
+                  'capital': 'Лилонгве'},
+                 {'timezones': ['Мексика (UTC-08)',
+                                'Мексика (UTC-07)',
+                                'Мексика (UTC-06)'],
+                  'alpha-2-code': 'MX',
+                  'alpha-3-code': 'MEX',
+                  'continent': 'Северная Америка',
+                  'name': 'Мексика',
+                  'capital': 'Мехико'},
+                 {'timezones': ['Малайзия (UTC+08)'],
+                  'alpha-2-code': 'MY',
+                  'alpha-3-code': 'MYS',
+                  'continent': 'Азия',
+                  'name': 'Малайзия',
+                  'capital': 'Куала-Лумпур'},
+                 {'timezones': ['Мозамбик (UTC+02)'],
+                  'alpha-2-code': 'MZ',
+                  'alpha-3-code': 'MOZ',
+                  'continent': 'Африка',
+                  'name': 'Мозамбик',
+                  'capital': 'Мапуту'},
+                 {'timezones': ['Намибия (UTC+01)'],
+                  'alpha-2-code': 'NA',
+                  'alpha-3-code': 'NAM',
+                  'continent': 'Африка',
+                  'name': 'Намибия',
+                  'capital': 'Виндхук'},
+                 {'timezones': ['Нигер (UTC+01)'],
+                  'alpha-2-code': 'NE',
+                  'alpha-3-code': 'NER',
+                  'continent': 'Африка',
+                  'name': 'Нигер',
+                  'capital': 'Ниамей'},
+                 {'timezones': ['Нигерия (UTC+01)'],
+                  'alpha-2-code': 'NG',
+                  'alpha-3-code': 'NGA',
+                  'continent': 'Африка',
+                  'name': 'Нигерия',
+                  'capital': 'Абуджа'},
+                 {'timezones': ['Никарагуа (UTC-06)'],
+                  'alpha-2-code': 'NI',
+                  'alpha-3-code': 'NIC',
+                  'continent': 'Северная Америка',
+                  'name': 'Никарагуа',
+                  'capital': 'Манагуа'},
+                 {'timezones': ['Нидерланды (UTC+01)'],
+                  'alpha-2-code': 'NL',
+                  'alpha-3-code': 'NLD',
+                  'continent': 'Европа',
+                  'name': 'Нидерланды',
+                  'capital': 'Амстердам'},
+                 {'timezones': ['Норвегия (UTC+01)'],
+                  'alpha-2-code': 'NO',
+                  'alpha-3-code': 'NOR',
+                  'continent': 'Европа',
+                  'name': 'Норвегия',
+                  'capital': 'Осло'},
+                 {'timezones': ['Непал (UTC+05:45'],
+                  'alpha-2-code': 'NP',
+                  'alpha-3-code': 'NPL',
+                  'continent': 'Азия',
+                  'name': 'Непал',
+                  'capital': 'Катманду'},
+                 {'timezones': ['Науру (UTC+12)'],
+                  'alpha-2-code': 'NR',
+                  'alpha-3-code': 'NRU',
+                  'continent': 'Океания',
+                  'name': 'Науру',
+                  'capital': 'Ярен'},
+                 {'timezones': ['Новая Зеландия (UTC+12)'],
+                  'alpha-2-code': 'NZ',
+                  'alpha-3-code': 'NZL',
+                  'continent': 'Океания',
+                  'name': 'Новая Зеландия',
+                  'capital': 'Веллингтон'},
+                 {'timezones': ['Оман (UTC+04'],
+                  'alpha-2-code': 'OM',
+                  'alpha-3-code': 'OMN',
+                  'continent': 'Азия',
+                  'name': 'Оман',
+                  'capital': 'Маскат'},
+                 {'timezones': ['Панама (UTC-05)'],
+                  'alpha-2-code': 'PA',
+                  'alpha-3-code': 'PAN',
+                  'continent': 'Северная Америка',
+                  'name': 'Панама',
+                  'capital': 'Панама'},
+                 {'timezones': ['Перу (UTC-05)'],
+                  'alpha-2-code': 'PE',
+                  'alpha-3-code': 'PER',
+                  'continent': 'Южная Америка',
+                  'name': 'Перу',
+                  'capital': 'Лима'},
+                 {'timezones': ['Папуа - Новая Гвинея (UTC+10)'],
+                  'alpha-2-code': 'PG',
+                  'alpha-3-code': 'PNG',
+                  'continent': 'Океания',
+                  'name': 'Папуа - Новая Гвинея',
+                  'capital': 'Порт-Морсби'},
+                 {'timezones': ['Филиппины (UTC+08)'],
+                  'alpha-2-code': 'PH',
+                  'alpha-3-code': 'PHL',
+                  'continent': 'Азия',
+                  'name': 'Филиппины',
+                  'capital': 'Манила'},
+                 {'timezones': ['Пакистан (UTC+05)'],
+                  'alpha-2-code': 'PK',
+                  'alpha-3-code': 'PAK',
+                  'continent': 'Азия',
+                  'name': 'Пакистан',
+                  'capital': 'Исламабад'},
+                 {'timezones': ['Польша (UTC+01)'],
+                  'alpha-2-code': 'PL',
+                  'alpha-3-code': 'POL',
+                  'continent': 'Европа',
+                  'name': 'Польша',
+                  'capital': 'Варшава'},
+                 {'timezones': ['Португалия (UTC)'],
+                  'alpha-2-code': 'PT',
+                  'alpha-3-code': 'PRT',
+                  'continent': 'Европа',
+                  'name': 'Португалия',
+                  'capital': 'Лиссабон'},
+                 {'timezones': ['Палау (UTC+09)'],
+                  'alpha-2-code': 'PW',
+                  'alpha-3-code': 'PLW',
+                  'continent': 'Океания',
+                  'name': 'Палау',
+                  'capital': 'Кампала'},
+                 {'timezones': ['Парагвай (UTC-04)'],
+                  'alpha-2-code': 'PY',
+                  'alpha-3-code': 'PRY',
+                  'continent': 'Южная Америка',
+                  'name': 'Парагвай',
+                  'capital': 'Асунсьон'},
+                 {'timezones': ['Катар (UTC+03)'],
+                  'alpha-2-code': 'QA',
+                  'alpha-3-code': 'QAT',
+                  'continent': 'Азия',
+                  'name': 'Катар',
+                  'capital': 'Доха'},
+                 {'timezones': ['Румыния (UTC+02)'],
+                  'alpha-2-code': 'RO',
+                  'alpha-3-code': 'ROU',
+                  'continent': 'Европа',
+                  'name': 'Румыния',
+                  'capital': 'Бухарест'},
+                 {'timezones': ['Россия (UTC+02)',
+                                'Россия (UTC+03)',
+                                'Россия (UTC+04)',
+                                'Россия (UTC+05)',
+                                'Россия (UTC+06)',
+                                'Россия (UTC+07)',
+                                'Россия (UTC+08)',
+                                'Россия (UTC+09)',
+                                'Россия (UTC+10)',
+                                'Россия (UTC+11)',
+                                'Россия (UTC+12)'],
+                  'alpha-2-code': 'RU',
+                  'alpha-3-code': 'RUS',
+                  'continent': 'Европа',
+                  'name': 'Россия',
+                  'capital': 'Москва'},
+                 {'timezones': ['Руанда (UTC+02)'],
+                  'alpha-2-code': 'RW',
+                  'alpha-3-code': 'RWA',
+                  'continent': 'Африка',
+                  'name': 'Руанда',
+                  'capital': 'Кигали'},
+                 {'timezones': ['Саудовская Аравия (UTC+03)'],
+                  'alpha-2-code': 'SA',
+                  'alpha-3-code': 'SAU',
+                  'continent': 'Азия',
+                  'name': 'Саудовская Аравия',
+                  'capital': 'Эр-Рияд'},
+                 {'timezones': ['Соломоновы Острова (UTC+11)'],
+                  'alpha-2-code': 'SB',
+                  'alpha-3-code': 'SLB',
+                  'continent': 'Океания',
+                  'name': 'Соломоновы Острова',
+                  'capital': 'Хониара'},
+                 {'timezones': ['Сейшельские острова (UTC+04)'],
+                  'alpha-2-code': 'SC',
+                  'alpha-3-code': 'SYC',
+                  'continent': 'Африка',
+                  'name': 'Сейшельские острова',
+                  'capital': 'Виктория'},
+                 {'timezones': ['Судан (UTC+03)'],
+                  'alpha-2-code': 'SD',
+                  'alpha-3-code': 'SDN',
+                  'continent': 'Африка',
+                  'name': 'Судан',
+                  'capital': 'Хартум'},
+                 {'timezones': ['Швеция (UTC+01)'],
+                  'alpha-2-code': 'SE',
+                  'alpha-3-code': 'SWE',
+                  'continent': 'Европа',
+                  'name': 'Швеци',
+                  'capital': 'Стокгольм'},
+                 {'timezones': ['Сингапур (UTC+08)'],
+                  'alpha-2-code': 'SG',
+                  'alpha-3-code': 'SGP',
+                  'continent': 'Азия',
+                  'name': 'Сингапур',
+                  'capital': 'Сингапур'},
+                 {'timezones': ['Словения (UTC+01)'],
+                  'alpha-2-code': 'SI',
+                  'alpha-3-code': 'SVN',
+                  'continent': 'Европа',
+                  'name': 'Словения',
+                  'capital': 'Любляна'},
+                 {'timezones': ['Словакия (UTC+01)'],
+                  'alpha-2-code': 'SK',
+                  'alpha-3-code': 'SVK',
+                  'continent': 'Европа',
+                  'name': 'Словакия',
+                  'capital': 'Братислава'},
+                 {'timezones': ['Сьерра-Леоне (UTC)'],
+                  'alpha-2-code': 'SL',
+                  'alpha-3-code': 'SLE',
+                  'continent': 'Африка',
+                  'name': 'Сьерра Леоне',
+                  'capital': 'Фритаун'},
+                 {'timezones': ['Сан-Марино (UTC+01)'],
+                  'alpha-2-code': 'SM',
+                  'alpha-3-code': 'SMR',
+                  'continent': 'Европа',
+                  'name': 'Сан-Марино',
+                  'capital': 'Сан-Марино'},
+                 {'timezones': ['Сенегал (UTC)'],
+                  'alpha-2-code': 'SN',
+                  'alpha-3-code': 'SEN',
+                  'continent': 'Африка',
+                  'name': 'Сенегал',
+                  'capital': 'Дакар'},
+                 {'timezones': ['Сомали (UTC+03)'],
+                  'alpha-2-code': 'SO',
+                  'alpha-3-code': 'SOM',
+                  'continent': 'Африка',
+                  'name': 'Сомали',
+                  'capital': 'Могадишо'},
+                 {'timezones': ['Суринам (UTC-03)'],
+                  'alpha-2-code': 'SR',
+                  'alpha-3-code': 'SUR',
+                  'continent': 'Южная Америка',
+                  'name': 'Суринам',
+                  'capital': 'Парамарибо'},
+                 {'timezones': ['Сан-Томе и Принсипи (UTC)'],
+                  'alpha-2-code': 'ST',
+                  'alpha-3-code': 'STP',
+                  'continent': 'Африка',
+                  'name': 'Сан-Томе и Принсипи',
+                  'capital': 'Сан-Томе'},
+                 {'timezones': ['Сирия (UTC+02)'],
+                  'alpha-2-code': 'SY',
+                  'alpha-3-code': 'SYR',
+                  'continent': 'Азия',
+                  'name': 'Сирия',
+                  'capital': 'Дамаск'},
+                 {'timezones': ['Того (UTC)'],
+                  'alpha-2-code': 'TG',
+                  'alpha-3-code': 'TGO',
+                  'continent': 'Африка',
+                  'name': 'Того',
+                  'capital': 'Ломе'},
+                 {'timezones': ['Таиланд (UTC+07)'],
+                  'alpha-2-code': 'TH',
+                  'alpha-3-code': 'THA',
+                  'continent': 'Азия',
+                  'name': 'Таиланд',
+                  'capital': 'Бангкок'},
+                 {'timezones': ['Таджикистан (UTC+05)'],
+                  'alpha-2-code': 'TJ',
+                  'alpha-3-code': 'TJK',
+                  'continent': 'Азия',
+                  'name': 'Таджикистан',
+                  'capital': 'Душанбе'},
+                 {'timezones': ['Туркмения (UTC+05)'],
+                  'alpha-2-code': 'TM',
+                  'alpha-3-code': 'TKM',
+                  'continent': 'Азия',
+                  'name': 'Туркмения',
+                  'capital': 'Ашхабад'},
+                 {'timezones': ['Тунис (UTC+01)'],
+                  'alpha-2-code': 'TN',
+                  'alpha-3-code': 'TUN',
+                  'continent': 'Африка',
+                  'name': 'Тунис',
+                  'capital': 'Тунис'},
+                 {'timezones': ['Тонга (UTC+13)'],
+                  'alpha-2-code': 'TO',
+                  'alpha-3-code': 'TON',
+                  'continent': 'Океания',
+                  'name': 'Тонга',
+                  'capital': 'Нукуалофа'},
+                 {'timezones': ['Турция (UTC+02)'],
+                  'alpha-2-code': 'TR',
+                  'alpha-3-code': 'TUR',
+                  'continent': 'Азия',
+                  'name': 'Турция',
+                  'capital': 'Анкара'},
+                 {'timezones': ['Тринидад и Тобаго (UTC-04)'],
+                  'alpha-2-code': 'TT',
+                  'alpha-3-code': 'TTO',
+                  'continent': 'Северная Америка',
+                  'name': 'Тринидад и Тобаго',
+                  'capital': 'Порт-оф-Спейн'},
+                 {'timezones': ['Тувалу (UTC+12)'],
+                  'alpha-2-code': 'TV',
+                  'alpha-3-code': 'TUV',
+                  'continent': 'Океания',
+                  'name': 'Тувалу',
+                  'capital': 'Фунафути'},
+                 {'timezones': ['Танзания (UTC+03)'],
+                  'alpha-2-code': 'TZ',
+                  'alpha-3-code': 'TZA',
+                  'continent': 'Африка',
+                  'name': 'Танзания',
+                  'capital': 'Додома'},
+                 {'timezones': ['Украина (UTC+02)',
+                                'Украина (UTC+03)'],
+                  'alpha-2-code': 'UA',
+                  'alpha-3-code': 'UKR',
+                  'continent': 'Европа',
+                  'name': 'Украина',
+                  'capital': 'Киев'},
+                 {'timezones': ['Уганда (UTC+03)'],
+                  'alpha-2-code': 'UG',
+                  'alpha-3-code': 'UGA',
+                  'continent': 'Африка',
+                  'name': 'Уганда',
+                  'capital': 'Кампала'},
+                 {'timezones': ['США (UTC-11)',
+                                'США (UTC-10)',
+                                'США (UTC-09)',
+                                'США (UTC-08)',
+                                'США (UTC-07)',
+                                'США (UTC-06)',
+                                'США (UTC-05)',
+                                'США (UTC-04)',
+                                'США (UTC+10)'],
+                  'alpha-2-code': 'US',
+                  'alpha-3-code': 'USA',
+                  'continent': 'Северная Америка',
+                  'name': 'США',
+                  'capital': 'Вашингтон'},
+                 {'timezones': ['Уругвай (UTC-03)'],
+                  'alpha-2-code': 'UY',
+                  'alpha-3-code': 'URY',
+                  'continent': 'Южная Америка',
+                  'name': 'Уругвай',
+                  'capital': 'Монтевидео'},
+                 {'timezones': ['Узбекистан (UTC+05)'],
+                  'alpha-2-code': 'UZ',
+                  'alpha-3-code': 'UZB',
+                  'continent': 'Азия',
+                  'name': 'Узбекистан',
+                  'capital': 'Ташкент'},
+                 {'timezones': ['Ватикан (UTC+01)'],
+                  'alpha-2-code': 'VA',
+                  'alpha-3-code': 'VAT',
+                  'continent': 'Европа',
+                  'name': 'Ватикан',
+                  'capital': 'Ватикан'},
+                 {'timezones': ['Венесуэла (UTC-04:30)'],
+                  'alpha-2-code': 'VE',
+                  'alpha-3-code': 'VEN',
+                  'continent': 'Южная Америка',
+                  'name': 'Венесуэла',
+                  'capital': 'Каракас'},
+                 {'timezones': ['Вьетнам (UTC+07)'],
+                  'alpha-2-code': 'VN',
+                  'alpha-3-code': 'VNM',
+                  'continent': 'Азия',
+                  'name': 'Вьетнам',
+                  'capital': 'Ханой'},
+                 {'timezones': ['Вануату (UTC+11)'],
+                  'alpha-2-code': 'VU',
+                  'alpha-3-code': 'VUT',
+                  'continent': 'Океания',
+                  'name': 'Вануату',
+                  'capital': 'Порт-Вила'},
+                 {'timezones': ['Йемен (UTC+03)'],
+                  'alpha-2-code': 'YE',
+                  'alpha-3-code': 'YEM',
+                  'continent': 'Азия',
+                  'name': 'Йемен',
+                  'capital': "Сана"},
+                 {'timezones': ['Замбия (UTC+02)'],
+                  'alpha-2-code': 'ZM',
+                  'alpha-3-code': 'ZMB',
+                  'continent': 'Африка',
+                  'name': 'Замбия',
+                  'capital': 'Лусака'},
+                 {'timezones': ['Зимбабве (UTC+02)'],
+                  'alpha-2-code': 'ZW',
+                  'alpha-3-code': 'ZWE',
+                  'continent': 'Африка',
+                  'name': 'Зимбабве',
+                  'capital': 'Хараре'},
+                 {'timezones': ['Алжир (UTC+01)'],
+                  'alpha-2-code': 'DZ',
+                  'alpha-3-code': 'DZA',
+                  'continent': 'Африка',
+                  'name': 'Алжир',
+                  'capital': 'Алжир'},
+                 {'timezones': ['Босния и Герцеговина (UTC+01)'],
+                  'alpha-2-code': 'BA',
+                  'alpha-3-code': 'BIH',
+                  'continent': 'Европа',
+                  'name': 'Босния и Герцеговина',
+                  'capital': 'Сараево'},
+                 {'timezones': ['Камбоджа (UTC+07)'],
+                  'alpha-2-code': 'KH',
+                  'alpha-3-code': 'KHM',
+                  'continent': 'Азия',
+                  'name': 'Камбоджа',
+                  'capital': 'Пномпень'},
+                 {'timezones': ['ЦАР (UTC+01)'],
+                  'alpha-2-code': 'CF',
+                  'alpha-3-code': 'CAF',
+                  'continent': 'Африка',
+                  'name': 'ЦАР',
+                  'capital': 'Банги'},
+                 {'timezones': ['Чад (UTC+01)'],
+                  'alpha-2-code': 'TD',
+                  'alpha-3-code': 'TCD',
+                  'continent': 'Африка',
+                  'name': 'Чад',
+                  'capital': "Нджамена"},
+                 {'timezones': ['Коморы (UTC+03)'],
+                  'alpha-2-code': 'KM',
+                  'alpha-3-code': 'COM',
+                  'continent': 'Африка',
+                  'name': 'Коморы',
+                  'capital': 'Морони'},
+                 {'timezones': ['Хорватия (UTC+01)'],
+                  'alpha-2-code': 'HR',
+                  'alpha-3-code': 'HRV',
+                  'continent': 'Европа',
+                  'name': 'Хорватия',
+                  'capital': 'Загреб'},
+                 {'timezones': ['Восточный Тимор (UTC+09)'],
+                  'alpha-2-code': 'TL',
+                  'alpha-3-code': 'TLS',
+                  'continent': 'Азия',
+                  'name': 'Восточный Тимор',
+                  'capital': 'Дили'},
+                 {'timezones': ['Сальвадор (UTC-06)'],
+                  'alpha-2-code': 'SV',
+                  'alpha-3-code': 'SLV',
+                  'continent': 'Северная Америка',
+                  'name': 'Сальвадор',
+                  'capital': 'Сан-Сальвадор'},
+                 {'timezones': ['Экваториальная Гвинея (UTC+01)'],
+                  'alpha-2-code': 'GQ',
+                  'alpha-3-code': 'GNQ',
+                  'continent': 'Африка',
+                  'name': 'Экваториальная Гвинея',
+                  'capital': 'Малабо'},
+                 {'timezones': ['Гренада (UTC-04)'],
+                  'alpha-2-code': 'GD',
+                  'alpha-3-code': 'GRD',
+                  'continent': 'Северная Америка',
+                  'name': 'Гренада',
+                  'capital': "Сент-Джорджес"},
+                 {'timezones': ['Казахстан (UTC+05)',
+                                'Казахстан (UTC+06)'],
+                  'alpha-2-code': 'KZ',
+                  'alpha-3-code': 'KAZ',
+                  'continent': 'Азия',
+                  'name': 'Казахстан',
+                  'capital': 'Нур-Султан (Астана)'},
+                 {'timezones': ['Лаос (UTC+07)'],
+                  'alpha-2-code': 'LA',
+                  'alpha-3-code': 'LAO',
+                  'continent': 'Азия',
+                  'name': 'Лаос',
+                  'capital': 'Вьентьян'},
+                 {'timezones': ['Микронезия (UTC+10)',
+                                'Микронезия (UTC+11)'],
+                  'alpha-2-code': 'FM',
+                  'alpha-3-code': 'FSM',
+                  'continent': 'Океания',
+                  'name': 'Микронезия',
+                  'capital': 'Паликир'},
+                 {'timezones': ['Молдавия (UTC+02)'],
+                  'alpha-2-code': 'MD',
+                  'alpha-3-code': 'MDA',
+                  'continent': 'Европа',
+                  'name': 'Молдавия',
+                  'capital': 'Кишинев'},
+                 {'timezones': ['Монако (UTC+01)'],
+                  'alpha-2-code': 'MC',
+                  'alpha-3-code': 'MCO',
+                  'continent': 'Европа',
+                  'name': 'Монако',
+                  'capital': 'Монако'},
+                 {'timezones': ['Черногория (UTC+01)'],
+                  'alpha-2-code': 'ME',
+                  'alpha-3-code': 'MNE',
+                  'continent': 'Европа',
+                  'name': 'Черногория',
+                  'capital': 'Подгорица'},
+                 {'timezones': ['Марокко (UTC)'],
+                  'alpha-2-code': 'MA',
+                  'alpha-3-code': 'MAR',
+                  'continent': 'Африка',
+                  'name': 'Марокко',
+                  'capital': 'Рабат'},
+                 {'timezones': ['Сент-Китс и Невис (UTC-04)'],
+                  'alpha-2-code': 'KN',
+                  'alpha-3-code': 'KNA',
+                  'continent': 'Северная Америка',
+                  'name': 'Сент-Китс и Невис',
+                  'capital': 'Бастер'},
+                 {'timezones': ['Сент-Люсия (UTC-04)'],
+                  'alpha-2-code': 'LC',
+                  'alpha-3-code': 'LCA',
+                  'continent': 'Северная Америка',
+                  'name': 'Сент-Люсия',
+                  'capital': 'Кастри'},
+                 {'timezones': ['Сент-Винсент и Гренадины (UTC-04)'],
+                  'alpha-2-code': 'VC',
+                  'alpha-3-code': 'VCT',
+                  'continent': 'Северная Америка',
+                  'name': 'Сент-Винсент и Гренадины',
+                  'capital': 'Кингстаун'},
+                 {'timezones': ['Самоа (UTC+13)'],
+                  'alpha-2-code': 'WS',
+                  'alpha-3-code': 'WSM',
+                  'continent': 'Океания',
+                  'name': 'Самоа',
+                  'capital': 'Апиа'},
+                 {'timezones': ['Сербия (UTC+01)'],
+                  'alpha-2-code': 'RS',
+                  'alpha-3-code': 'SRB',
+                  'continent': 'Европа',
+                  'name': 'Сербия',
+                  'capital': 'Белград'},
+                 {'timezones': ['ЮАР (UTC+02)'],
+                  'alpha-2-code': 'ZA',
+                  'alpha-3-code': 'ZAF',
+                  'continent': 'Африка',
+                  'name': 'ЮАР',
+                  'capital': 'Претория'},
+                 {'timezones': ['Испания (UTC)',
+                                'Испания (UTC+01)'],
+                  'alpha-2-code': 'ES',
+                  'alpha-3-code': 'ESP',
+                  'continent': 'Европа',
+                  'name': 'Испания',
+                  'capital': 'Мадрид'},
+                 {'timezones': ['Шри-Ланка (UTC+05:30)'],
+                  'alpha-2-code': 'LK',
+                  'alpha-3-code': 'LKA',
+                  'continent': 'Азия',
+                  'name': 'Шри-Ланка',
+                  'capital': 'Шри-Джаяварденепура-Котте'},
+                 {'timezones': ['Эсватини (Свазиленд) (UTC+02)'],
+                  'alpha-2-code': 'SZ',
+                  'alpha-3-code': 'SWZ',
+                  'continent': 'Африка',
+                  'name': 'Эсватини (Свазиленд)',
+                  'capital': 'Мбабане'},
+                 {'timezones': ['Швейцария (UTC+01)'],
+                  'alpha-2-code': 'CH',
+                  'alpha-3-code': 'CHE',
+                  'continent': 'Европа',
+                  'name': 'Швейцария',
+                  'capital': 'Берн'},
+                 {'timezones': ['ОАЭ (UTC+04)'],
+                  'alpha-2-code': 'AE',
+                  'alpha-3-code': 'ARE',
+                  'continent': 'Азия',
+                  'name': 'ОАЭ',
+                  'capital': 'Абу-Даби'},
+                 {'timezones': ['Великобритания (UTC)'],
+                  'alpha-2-code': 'GB',
+                  'alpha-3-code': 'GBR',
+                  'continent': 'Европа',
+                  'name': 'Великобритания',
+                  'capital': 'Лондон'},
+                 ]
+
     def day_of_week(self):
         day = self.date('%w')
-        DAY_NAMES = {
-            "0": "Воскресенье",
-            "1": "Понедельник",
-            "2": "Вторник",
-            "3": "Среда",
-            "4": "Четверг",
-            "5": "Пятница",
-            "6": "Суббота",
-        }
-        return DAY_NAMES[day]
+        return self.DAY_NAMES[day]
 
     def month_name(self):
         month = self.month()
-        MONTH_NAMES = {
-            "01": "Январь",
-            "02": "Февраль",
-            "03": "Март",
-            "04": "Апрель",
-            "05": "Май",
-            "06": "Июнь",
-            "07": "Июль",
-            "08": "Август",
-            "09": "Сентябрь",
-            "10": "Октябрь",
-            "11": "Ноябрь",
-            "12": "Декабрь",
-        }
-        return MONTH_NAMES[month]
+        return self.MONTH_NAMES[month]
diff --git a/faker/providers/person/ru_RU/__init__.py b/faker/providers/person/ru_RU/__init__.py
index 62c68d2b..b122f32c 100644
--- a/faker/providers/person/ru_RU/__init__.py
+++ b/faker/providers/person/ru_RU/__init__.py
@@ -3,15 +3,33 @@ from collections import OrderedDict
 from .. import Provider as PersonProvider
 
 
+# See transliteration table https://en.wikipedia.org/wiki/Romanization_of_Russian#Transliteration_table
+def translit(text):
+    translit_dict = {
+      'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'y',
+      'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f',
+      'х': 'kh', 'ц': 'ts', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu',
+      'я': 'ya', 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'Ye', 'Ë': 'E', 'Ж': 'Zh', 'З': 'Z', 'И': 'I',
+      'Й': 'Y', 'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',
+      'Ф': 'F', 'Х': 'Kh', 'Ц': 'Ts', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Shch', 'Ы': 'Y', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya',
+      ' ': ' ', '-': '-', "'": "'",
+     }
+    for letter in text:
+        text = text.replace(letter, translit_dict[letter])
+    return text
+
+
 class Provider(PersonProvider):
     formats_male = OrderedDict((
-        ('{{last_name_male}} {{first_name_male}} {{middle_name_male}}', 0.97),
-        ('{{prefix_male}} {{last_name_male}} {{first_name_male}} {{middle_name_male}}', 0.03),
+        ('{{last_name_male}} {{first_name_male}} {{middle_name_male}}', 0.49),
+        ('{{first_name_male}} {{middle_name_male}} {{last_name_male}}', 0.49),
+        ('{{prefix_male}} {{last_name_male}} {{first_name_male}} {{middle_name_male}}', 0.02),
     ))
 
     formats_female = OrderedDict((
-        ('{{last_name_female}} {{first_name_female}} {{middle_name_female}}', 0.97),
-        ('{{prefix_female}} {{last_name_female}} {{first_name_female}} {{middle_name_female}}', 0.03),
+        ('{{last_name_female}} {{first_name_female}} {{middle_name_female}}', 0.49),
+        ('{{first_name_female}} {{middle_name_female}} {{last_name_female}}', 0.49),
+        ('{{prefix_female}} {{last_name_female}} {{first_name_female}} {{middle_name_female}}', 0.02),
     ))
 
     # Using random_element's dictionary weighting means that the
@@ -254,7 +272,7 @@ class Provider(PersonProvider):
 
     middle_names = middle_names_male + middle_names_female
 
-    prefixes_male = ('г-н.', 'тов.')
+    prefixes_male = ('г-н', 'тов.')
 
     prefixes_female = ('г-жа', 'тов.')
 


Test patch:
diff --git a/tests/providers/test_company.py b/tests/providers/test_company.py
index c97730b7..5bc28613 100644
--- a/tests/providers/test_company.py
+++ b/tests/providers/test_company.py
@@ -342,3 +342,16 @@ class TestRuRu(unittest.TestCase):
             company = self.fake.large_company()
             assert isinstance(company, str)
             assert company in companies
+
+    def test_catchphrase(self):
+        for i in range(self.num_sample_runs):
+            catchphrase = self.fake.catch_phrase()
+            assert isinstance(catchphrase, str)
+            assert ' и ' in catchphrase
+
+    def test_bs(self):
+        for i in range(self.num_sample_runs):
+            bs = self.fake.bs()
+            bs_words = bs.split()
+            assert isinstance(bs, str)
+            assert bs_words[0] in RuProvider.bsWords[0]
diff --git a/tests/providers/test_credit_card.py b/tests/providers/test_credit_card.py
index 62316bf7..afd925df 100644
--- a/tests/providers/test_credit_card.py
+++ b/tests/providers/test_credit_card.py
@@ -2,6 +2,7 @@ import re
 import unittest
 
 from faker import Faker
+from faker.providers.bank.ru_RU import Provider as RuBank
 
 
 class TestCreditCardProvider(unittest.TestCase):
@@ -55,3 +56,49 @@ class TestCreditCardProvider(unittest.TestCase):
         for prefix in self.provider.prefix_jcb15:
             number = self.provider._generate_number(prefix, 15)
             assert re.match(self.jcb_pattern, number)
+
+
+class TestRuRu(unittest.TestCase):
+    """ Tests credit card in the ru_RU locale """
+
+    def setUp(self):
+        self.fake = Faker('ru_RU')
+        Faker.seed(0)
+        self.visa_pattern = r'^4[0-9]{15}$'
+        self.mastercard_pattern = r'^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$'
+        self.mir_pattern = r'^220[0-4][0-9]{12}$'
+        self.maestro_pattern = r'^50|5[6-9]|6[0-9][0-9]{14}$'
+        self.amex_pattern = r'^3[4|7][0-9]{13}$'
+        self.unionpay_pattern = r'^62|81[0-9]{14}$'
+
+    def test_visa(self):
+        number = self.fake.credit_card_number('visa')
+        assert re.match(self.visa_pattern, number)
+
+    def test_mastercard(self):
+        number = self.fake.credit_card_number('mastercard')
+        assert re.match(self.mastercard_pattern, number)
+
+    def test_mir(self):
+        number = self.fake.credit_card_number('mir')
+        assert re.match(self.mir_pattern, number)
+
+    def test_maestro(self):
+        number = self.fake.credit_card_number('maestro')
+        assert re.match(self.maestro_pattern, number)
+
+    def test_amex(self):
+        number = self.fake.credit_card_number('amex')
+        assert re.match(self.amex_pattern, number)
+
+    def test_unionpay(self):
+        number = self.fake.credit_card_number('unionpay')
+        assert re.match(self.unionpay_pattern, number)
+
+    def test_owner(self):
+        card_data = self.fake.credit_card_full().split('\n')
+        assert re.match('[A-Za-z]+', card_data[1])
+
+    def test_issuer(self):
+        card_data = self.fake.credit_card_full().split('\n')
+        assert card_data[4] in RuBank.banks
diff --git a/tests/providers/test_currency.py b/tests/providers/test_currency.py
index d2ae78b6..7068f18d 100644
--- a/tests/providers/test_currency.py
+++ b/tests/providers/test_currency.py
@@ -1,3 +1,4 @@
+import re
 import unittest
 
 from faker import Faker
@@ -25,6 +26,12 @@ class TestCurrencyProvider(unittest.TestCase):
             name = self.fake.currency_name()
             assert isinstance(name, str)
 
+    def test_currency_symbol(self):
+        for _ in range(99):
+            symbol = self.fake.currency_symbol()
+            assert isinstance(symbol, str)
+            assert symbol in CurrencyProvider.currency_symbols.values()
+
     def test_cryptocurrency(self):
         for _ in range(99):
             cur = self.fake.cryptocurrency()
@@ -40,3 +47,23 @@ class TestCurrencyProvider(unittest.TestCase):
         for _ in range(99):
             name = self.fake.cryptocurrency_name()
             assert isinstance(name, str)
+
+
+class TestRuRu(unittest.TestCase):
+    """ Tests currency in the ru_RU locale """
+
+    def setUp(self):
+        self.fake = Faker('ru_RU')
+        Faker.seed(0)
+
+    def test_currency(self):
+        for _ in range(99):
+            cur = self.fake.currency()
+            assert isinstance(cur, tuple)
+            assert re.match(r'[А-Яа-я]', cur[1])
+
+    def test_currency_name(self):
+        for _ in range(99):
+            name = self.fake.currency_name()
+            assert isinstance(name, str)
+            assert re.match(r'[А-Яа-я]', name)
diff --git a/tests/providers/test_date_time.py b/tests/providers/test_date_time.py
index fff50f5b..30e9cf09 100644
--- a/tests/providers/test_date_time.py
+++ b/tests/providers/test_date_time.py
@@ -1,6 +1,7 @@
 import os
 import platform
 import random
+import re
 import sys
 import time
 import unittest
@@ -17,6 +18,7 @@ from faker.providers.date_time.ar_AA import Provider as ArProvider
 from faker.providers.date_time.ar_EG import Provider as EgProvider
 from faker.providers.date_time.hy_AM import Provider as HyAmProvider
 from faker.providers.date_time.pl_PL import Provider as PlProvider
+from faker.providers.date_time.ru_RU import Provider as RuProvider
 from faker.providers.date_time.ta_IN import Provider as TaInProvider
 
 
@@ -716,3 +718,29 @@ class TestTaIN(unittest.TestCase):
         month = self.fake.month_name()
         assert isinstance(month, str)
         assert month in TaInProvider.MONTH_NAMES.values()
+
+
+class TestRuRu(unittest.TestCase):
+    """ Tests date_time in the ru_RU locale """
+
+    def setUp(self):
+        self.fake = Faker('ru_RU')
+        Faker.seed(0)
+
+    def test_day(self):
+        for _ in range(50):
+            day = self.fake.day_of_week()
+            assert isinstance(day, str)
+            assert day in RuProvider.DAY_NAMES.values()
+
+    def test_month(self):
+        for _ in range(50):
+            month = self.fake.month_name()
+            assert isinstance(month, str)
+            assert month in RuProvider.MONTH_NAMES.values()
+
+    def test_timezone(self):
+        for _ in range(100):
+            timezone = self.fake.timezone()
+            assert isinstance(timezone, str)
+            assert re.match(r'[А-Яа-я]', timezone)
diff --git a/tests/providers/test_person.py b/tests/providers/test_person.py
index b0b6c5dc..dfc314fd 100644
--- a/tests/providers/test_person.py
+++ b/tests/providers/test_person.py
@@ -12,6 +12,8 @@ from faker.providers.person.hy_AM import Provider as HyAmProvider
 from faker.providers.person.ne_NP import Provider as NeProvider
 from faker.providers.person.pl_PL import Provider as PlPLProvider
 from faker.providers.person.pl_PL import checksum_identity_card_number as pl_checksum_identity_card_number
+from faker.providers.person.ru_RU import Provider as RuProvider
+from faker.providers.person.ru_RU import translit
 from faker.providers.person.sv_SE import Provider as SvSEProvider
 from faker.providers.person.ta_IN import Provider as TaINProvider
 from faker.providers.person.zh_CN import Provider as ZhCNProvider
@@ -554,3 +556,41 @@ class TestTaIN(unittest.TestCase):
         assert name in TaINProvider.first_names_male
         name = self.fake.first_name()
         assert name in TaINProvider.first_names
+
+
+class TestRuRU(unittest.TestCase):
+    """ Tests person in the ru_RU locale """
+
+    def setUp(self):
+        self.fake = Faker('ru_RU')
+        Faker.seed(0)
+
+    def test_translit(self):
+        assert translit('Александр Сергеевич Пушкин') == 'Aleksandr Sergeevich Pushkin'
+        assert translit('Анна Андреевна Ахматова') == 'Anna Andreevna Akhmatova'
+        assert translit('Михаил') == 'Mikhail'
+        assert translit('Фёдор') == 'Fedor'
+        assert translit('Екатерина') == 'Yekaterina'
+        assert translit('Анастасия') == 'Anastasiya'
+        assert translit('Юрьевич') == 'Yurevich'
+        assert translit('Никитична') == 'Nikitichna'
+        assert translit('Щербакова') == 'Shcherbakova'
+        assert translit('Маяковский') == 'Mayakovskiy'
+        assert translit('Петров-Водкин') == 'Petrov-Vodkin'
+        assert translit('Воронцова-Дашкова') == 'Vorontsova-Dashkova'
+
+    def test_name_female(self):
+        first_name = self.fake.first_name_female()
+        assert first_name in RuProvider.first_names_female
+        middle_name = self.fake.middle_name_female()
+        assert middle_name in RuProvider.middle_names_female
+        last_name = self.fake.last_name_female()
+        assert last_name in RuProvider.last_names_female
+
+    def test_name_male(self):
+        first_name = self.fake.first_name_male()
+        assert first_name in RuProvider.first_names_male
+        middle_name = self.fake.middle_name_male()
+        assert middle_name in RuProvider.middle_names_male
+        last_name = self.fake.last_name_male()
+        assert last_name in RuProvider.last_names_male