Merge pull request #518 from VladiMihaylenko/tts-settings

TTS (iOS)
This commit is contained in:
therearesomewhocallmetim 2015-11-13 18:28:13 +03:00
commit e7f2f77987
90 changed files with 1462 additions and 221 deletions

View file

@ -310,6 +310,9 @@
<string name="menu_search">بحث</string>
<string name="pref_zoom_title">أزرار التكبير</string>
<string name="pref_zoom_summary">عرض على الشاشة</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">آخر</string>
<string name="pref_tts_how_to_set_up_voice">كيفية ضبط الصوت</string>
<string name="placepage_distance">المسافة</string>
<string name="placepage_coordinates">الإحداثيات</string>
<string name="placepage_unsorted">لم يتم فرزها</string>

View file

@ -307,6 +307,9 @@
<string name="menu_search">Vyhledávání</string>
<string name="pref_zoom_title">Tlačítka přiblížení/oddálení</string>
<string name="pref_zoom_summary">Zobrazit na obrazovce</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Ostatní</string>
<string name="pref_tts_how_to_set_up_voice">Jak nastavit hlas</string>
<string name="placepage_distance">Vzdálenost</string>
<string name="placepage_coordinates">Souřadnice</string>
<string name="placepage_unsorted">Nezařazené</string>

View file

@ -308,6 +308,9 @@
<string name="menu_search">Søg</string>
<string name="pref_zoom_title">Zoom knapper</string>
<string name="pref_zoom_summary">Vis på skærmen</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Andet</string>
<string name="pref_tts_how_to_set_up_voice">Sådan indstiller du tale</string>
<string name="placepage_distance">Afstand</string>
<string name="placepage_coordinates">Koordinater</string>
<string name="placepage_unsorted">Usorteret</string>

View file

@ -301,6 +301,9 @@
<string name="menu_search">Suche</string>
<string name="pref_zoom_title">Zoom-Tasten</string>
<string name="pref_zoom_summary">Auf dem Bildschirm anzeigen</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Weitere</string>
<string name="pref_tts_how_to_set_up_voice">Navi-Stimme einstellen</string>
<string name="placepage_distance">Distanz</string>
<string name="placepage_coordinates">Koordinaten</string>
<string name="placepage_unsorted">Unsortiert</string>

View file

@ -299,6 +299,9 @@
<string name="menu_search">Buscar</string>
<string name="pref_zoom_title">Botones de zoom</string>
<string name="pref_zoom_summary">Visualización en la pantalla</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Otros</string>
<string name="pref_tts_how_to_set_up_voice">Cómo configurar la voz</string>
<string name="placepage_distance">Distancia</string>
<string name="placepage_coordinates">Coordenadas</string>
<string name="placepage_unsorted">Sin clasificar</string>

View file

@ -306,6 +306,9 @@
<string name="menu_search">Haku</string>
<string name="pref_zoom_title">Zoomauspainikkeet</string>
<string name="pref_zoom_summary">Näytä ruudulla</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Egyéb</string>
<string name="pref_tts_how_to_set_up_voice">Így állítsd be a hangot</string>
<string name="placepage_distance">Etäisyys</string>
<string name="placepage_coordinates">Koordinaatit</string>
<string name="placepage_unsorted">Järjestelemätön</string>

View file

@ -311,6 +311,9 @@
<string name="menu_search">Rechercher</string>
<string name="pref_zoom_title">Boutons de zoom</string>
<string name="pref_zoom_summary">Afficher à l\&#39;écran</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Autre</string>
<string name="pref_tts_how_to_set_up_voice">Comment configurer la voix</string>
<string name="placepage_distance">Distance</string>
<string name="placepage_coordinates">Coordonnées</string>
<string name="placepage_unsorted">Non trié</string>

View file

@ -307,6 +307,9 @@
<string name="menu_search">Keresés</string>
<string name="pref_zoom_title">Nagyítás/kicsinyítés gombok</string>
<string name="pref_zoom_summary">Mutassa a kijelzőn</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Egyéb</string>
<string name="pref_tts_how_to_set_up_voice">Így állítsd be a hangot</string>
<string name="placepage_distance">Távolság</string>
<string name="placepage_coordinates">Koordináták</string>
<string name="placepage_unsorted">Osztályozatlan</string>

View file

@ -306,6 +306,9 @@
<string name="menu_search">Cari</string>
<string name="pref_zoom_title">Tombol perbesaran</string>
<string name="pref_zoom_summary">Tampilkan pada layar</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Lainnya</string>
<string name="pref_tts_how_to_set_up_voice">Cara mengatur suara</string>
<string name="placepage_distance">Jarak</string>
<string name="placepage_coordinates">Koordinat</string>
<string name="placepage_unsorted">Tidak diurutkan</string>

View file

@ -303,6 +303,9 @@
<string name="menu_search">Cerca</string>
<string name="pref_zoom_title">Pulsanti per lo zoom</string>
<string name="pref_zoom_summary">Condividi la mia location</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Altro</string>
<string name="pref_tts_how_to_set_up_voice">Come impostare la voce</string>
<string name="placepage_distance">Distanza</string>
<string name="placepage_coordinates">Coordinate</string>
<string name="placepage_unsorted">Non classificato</string>

View file

@ -297,6 +297,9 @@
<string name="menu_search">検索</string>
<string name="pref_zoom_title">ズームボタン</string>
<string name="pref_zoom_summary">画面上に表示</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">その他</string>
<string name="pref_tts_how_to_set_up_voice">音声設定の仕方</string>
<string name="placepage_distance">距離</string>
<string name="placepage_coordinates">コーディネート</string>
<string name="placepage_unsorted">未分類</string>

View file

@ -296,6 +296,9 @@
<string name="menu_search">검색</string>
<string name="pref_zoom_title">확대/축소 버튼</string>
<string name="pref_zoom_summary">화면에 표시</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">다른 언어</string>
<string name="pref_tts_how_to_set_up_voice">음성 설정 방법</string>
<string name="placepage_distance">거리</string>
<string name="placepage_coordinates">좌표</string>
<string name="placepage_unsorted">분류되지 않음</string>

View file

@ -306,6 +306,9 @@
<string name="menu_search">Søk</string>
<string name="pref_zoom_title">Zoom-knapper</string>
<string name="pref_zoom_summary">Vis på skjermen</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Andre</string>
<string name="pref_tts_how_to_set_up_voice">Slik installerer du stemme</string>
<string name="placepage_distance">Avstand</string>
<string name="placepage_coordinates">Koordinater</string>
<string name="placepage_unsorted">Usortert</string>

View file

@ -298,6 +298,9 @@
<string name="menu_search">Zoek</string>
<string name="pref_zoom_title">Zoomknoppen</string>
<string name="pref_zoom_summary">Weergave op het scherm</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Andere</string>
<string name="pref_tts_how_to_set_up_voice">Hoe stel je de stem in</string>
<string name="placepage_distance">Afstand</string>
<string name="placepage_coordinates">Coördinaten</string>
<string name="placepage_unsorted">Ongeclassificeerd</string>

View file

@ -307,6 +307,9 @@
<string name="menu_search">Szukaj</string>
<string name="pref_zoom_title">Przyciski powiększania</string>
<string name="pref_zoom_summary">Wyświetl na ekranie</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Inny</string>
<string name="pref_tts_how_to_set_up_voice">Jak skonfigurować usługę głosową</string>
<string name="placepage_distance">Dystans</string>
<string name="placepage_coordinates">Współrzędne</string>
<string name="placepage_unsorted">Niesklasyfikowane</string>

View file

@ -303,6 +303,9 @@
<string name="menu_search">Pesquisar</string>
<string name="pref_zoom_title">Botões de zoom</string>
<string name="pref_zoom_summary">Mostrar no ecrã</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Outro</string>
<string name="pref_tts_how_to_set_up_voice">Como configurar a voz</string>
<string name="placepage_distance">Distância</string>
<string name="placepage_coordinates">Coordenadas</string>
<string name="placepage_unsorted">Não classificado</string>

View file

@ -306,6 +306,9 @@
<string name="menu_search">Căutare</string>
<string name="pref_zoom_title">Butoane zoom</string>
<string name="pref_zoom_summary">Afișare pe ecran</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Alta</string>
<string name="pref_tts_how_to_set_up_voice">Modalitatea de configurare a vocii</string>
<string name="placepage_distance">Distanță</string>
<string name="placepage_coordinates">Coordonate</string>
<string name="placepage_unsorted">Nesortate</string>

View file

@ -335,6 +335,9 @@
<string name="pref_tts_language_title">Язык подсказок</string>
<!-- Settings «Route» category: «Tts unavailable» subtitle -->
<string name="pref_tts_unavailable">Голосовые подсказки недоступны</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Другой</string>
<string name="pref_tts_how_to_set_up_voice">Как настроить голос</string>
<string name="placepage_distance">Расстояние</string>
<string name="placepage_coordinates">Координаты</string>
<string name="placepage_unsorted">Без категории</string>

View file

@ -305,6 +305,9 @@
<string name="menu_search">Vyhľadávanie</string>
<string name="pref_zoom_title">Tlačítka priblíženia/oddialenia</string>
<string name="pref_zoom_summary">Zobraziť na obrazovke</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Iný</string>
<string name="pref_tts_how_to_set_up_voice">Ako nastaviť hlas</string>
<string name="placepage_distance">Vzdialenosť</string>
<string name="placepage_coordinates">Súradnice</string>
<string name="placepage_unsorted">Nezaradené</string>

View file

@ -306,6 +306,9 @@
<string name="menu_search">Sök</string>
<string name="pref_zoom_title">Zoom-knappar</string>
<string name="pref_zoom_summary">Visa på skärmen</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Övrigt</string>
<string name="pref_tts_how_to_set_up_voice">Hur man ställer in ljud</string>
<string name="placepage_distance">Avstånd</string>
<string name="placepage_coordinates">Koordinater</string>
<string name="placepage_unsorted">Osorterade</string>

View file

@ -308,6 +308,9 @@
<string name="menu_search">ค้นหา</string>
<string name="pref_zoom_title">ปุ่มซูม</string>
<string name="pref_zoom_summary">แสดงบนหน้าจอ</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">อื่น ๆ</string>
<string name="pref_tts_how_to_set_up_voice">วิธีตั้งค่าเสียง</string>
<string name="placepage_distance">ระยะห่าง</string>
<string name="placepage_coordinates">พิกัด</string>
<string name="placepage_unsorted">ไม่เรียงลำดับ</string>

View file

@ -310,6 +310,9 @@
<string name="menu_search">Ara</string>
<string name="pref_zoom_title">Yakınlaştırma butonları</string>
<string name="pref_zoom_summary">Ekranda göster</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Diğer</string>
<string name="pref_tts_how_to_set_up_voice">Ses nasıl ayarlanır</string>
<string name="placepage_distance">Mesafe</string>
<string name="placepage_coordinates">Koordinatlar</string>
<string name="placepage_unsorted">Sıralanmamış</string>

View file

@ -311,6 +311,9 @@
<string name="menu_search">Пошук</string>
<string name="pref_zoom_title">Кнопки трансфокації</string>
<string name="pref_zoom_summary">Відображення на екрані</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Інша</string>
<string name="pref_tts_how_to_set_up_voice">Як налаштувати голосовий контроль</string>
<string name="placepage_distance">Відстань</string>
<string name="placepage_coordinates">Координати</string>
<string name="placepage_unsorted">Без категорії</string>

View file

@ -306,6 +306,9 @@
<string name="menu_search">Tìm kiếm</string>
<string name="pref_zoom_title">Nút Phóng to/Thu nhỏ</string>
<string name="pref_zoom_summary">Hiển thị trên màn hình</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Khác</string>
<string name="pref_tts_how_to_set_up_voice">Làm thế nào để thiết lập tiếng nói</string>
<string name="placepage_distance">Khoảng cách</string>
<string name="placepage_coordinates">Tọa độ</string>
<string name="placepage_unsorted">Chưa phân loại</string>

View file

@ -290,6 +290,9 @@
<string name="menu_search">搜尋</string>
<string name="pref_zoom_title">縮放按鈕</string>
<string name="pref_zoom_summary">在螢幕上顯示</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">其他</string>
<string name="pref_tts_how_to_set_up_voice">如何設置語音</string>
<string name="placepage_distance">距离</string>
<string name="placepage_coordinates">坐标</string>
<string name="placepage_unsorted">未分类的</string>

View file

@ -306,6 +306,9 @@
<string name="menu_search">搜索</string>
<string name="pref_zoom_title">缩放按钮</string>
<string name="pref_zoom_summary">在屏幕上显示</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">其他</string>
<string name="pref_tts_how_to_set_up_voice">如何设置语音</string>
<string name="placepage_distance">距离</string>
<string name="placepage_coordinates">坐标</string>
<string name="placepage_unsorted">未分类</string>

View file

@ -337,6 +337,9 @@
<string name="pref_tts_language_title">Voice language</string>
<!-- Settings «Route» category: «Tts unavailable» subtitle -->
<string name="pref_tts_unavailable">TTS unavailable</string>
<!-- Title for "Other" section in TTS settings. -->
<string name="pref_tts_other_section_title">Other</string>
<string name="pref_tts_how_to_set_up_voice">How to set up voice</string>
<string name="placepage_distance">Distance</string>
<string name="placepage_coordinates">Coordinates</string>
<string name="placepage_unsorted">Unsorted</string>

View file

@ -72,24 +72,6 @@ static inline NSString * formattedSize(uint64_t size)
return [sizeString uppercaseString];
}
static inline NSString * bcp47ToTwineLanguage(NSString const * bcp47LangName)
{
if (bcp47LangName == nil || [bcp47LangName length] < 2)
return nil;
if ([bcp47LangName isEqualToString:@"zh-CN"] || [bcp47LangName isEqualToString:@"zh-CHS"]
|| [bcp47LangName isEqualToString:@"zh-SG"])
{
return @"zh-Hans"; // Chinese simplified
}
if ([bcp47LangName hasPrefix:@"zh"])
return @"zh-Hant"; // Chinese traditional
// Taking two first symbols of a language name. For example ru-RU -> ru
return [bcp47LangName substringToIndex:2];
}
// Use only for screen dimensions CGFloat comparison
static inline BOOL equalScreenDimensions(CGFloat left, CGFloat right)
{

View file

@ -37,7 +37,6 @@
#pragma mark - MWMNavigationDashboardManager
- (void)setupRoutingDashboard:(location::FollowingInfo const &)info;
- (void)playTurnNotifications;
- (void)routingHidden;
- (void)routingReady;
- (void)routingPrepare;

View file

@ -322,11 +322,6 @@ extern NSString * const kAlohalyticsTapEventKey;
[self.menuController setStreetName:@(info.m_sourceName.c_str())];
}
- (void)playTurnNotifications
{
[self.navigationManager playTurnNotifications];
}
- (void)handleRoutingError
{
self.navigationManager.state = MWMNavigationDashboardStateError;

View file

@ -3,9 +3,6 @@
#include "Framework.h"
extern NSString * const kMwmTextToSpeechEnable;
extern NSString * const kMwmTextToSpeechDisable;
@implementation MWMConsole
+ (BOOL)performCommand:(NSString *)cmd
@ -13,9 +10,6 @@ extern NSString * const kMwmTextToSpeechDisable;
if ([self performMapStyle:cmd])
return YES;
if ([self performSound:cmd])
return YES;
return NO;
}
@ -35,21 +29,4 @@ extern NSString * const kMwmTextToSpeechDisable;
return YES;
}
+ (BOOL)performSound:(NSString *)cmd
{
// Hook for shell command on change map style
BOOL const sound = [cmd isEqualToString:@"?sound"];
BOOL const nosound = sound ? NO : [cmd isEqualToString:@"?nosound"];
if (!sound && !nosound)
return NO;
if (sound)
[[NSNotificationCenter defaultCenter] postNotificationName:kMwmTextToSpeechEnable object:nil];
if (nosound)
[[NSNotificationCenter defaultCenter] postNotificationName:kMwmTextToSpeechDisable object:nil];
return YES;
}
@end

View file

@ -51,8 +51,13 @@ using namespace routing::turns;
// _lanes = info.m_lanes;
_nextTurnImage = image(info.m_nextTurn, true);
}
_turnImage = image(info.m_turn, false);
if (info.m_turn == TurnDirection::EnterRoundAbout || info.m_turn == TurnDirection::LeaveRoundAbout)
TurnDirection const turn = info.m_turn;
_turnImage = image(turn, false);
BOOL const isRound = turn == TurnDirection::EnterRoundAbout ||
turn == TurnDirection::StayOnRoundAbout ||
turn == TurnDirection::LeaveRoundAbout;
if (isRound)
_roundExitNumber = info.m_exitNum;
else
_roundExitNumber = 0;

View file

@ -43,7 +43,6 @@ typedef NS_ENUM(NSUInteger, MWMNavigationDashboardState)
- (instancetype)initWithParentView:(UIView *)view delegate:(id<MWMNavigationDashboardManagerProtocol, MWMRoutePreviewDataSource>)delegate;
- (void)setupDashboard:(location::FollowingInfo const &)info;
- (void)updateDashboard;
- (void)playTurnNotifications;
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation;
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator;

View file

@ -32,7 +32,6 @@ static NSString * const kNavigationDashboardIPADXibName = @"MWMNiPadNavigationDa
@property (weak, nonatomic) UIView * ownerView;
@property (nonatomic) MWMNavigationDashboardEntity * entity;
@property (nonatomic) MWMTextToSpeech * tts;
//@property (nonatomic) MWMLanesPanel * lanesPanel;
@property (nonatomic) MWMNextTurnPanel * nextTurnPanel;
@property (nonatomic) MWMRouteHelperPanelsDrawer * drawer;
@ -78,12 +77,26 @@ static NSString * const kNavigationDashboardIPADXibName = @"MWMNiPadNavigationDa
_navigationDashboard = isPortrait ? _navigationDashboardPortrait : _navigationDashboardLandscape;
_navigationDashboardPortrait.delegate = _navigationDashboardLandscape.delegate = delegate;
}
_tts = [[MWMTextToSpeech alloc] init];
_helperPanels = [NSMutableArray array];
}
return self;
}
- (void)changedTTSStatus:(NSNotification *)notification
{
if (self.state != MWMNavigationDashboardStateNavigation)
return;
NSDictionary<NSString *, NSNumber *> * userInfo = notification.userInfo;
BOOL const enabled = userInfo[@"on"].boolValue;
self.navigationDashboardPortrait.soundButton.selected = enabled;
self.navigationDashboardLandscape.soundButton.selected = enabled;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark - Layout
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
@ -142,12 +155,6 @@ static NSString * const kNavigationDashboardIPADXibName = @"MWMNiPadNavigationDa
[self updateDashboard];
}
- (void)playTurnNotifications
{
if (self.state == MWMNavigationDashboardStateNavigation)
[self.tts playTurnNotifications];
}
- (void)handleError
{
[self.routePreview stateError];
@ -192,10 +199,7 @@ static NSString * const kNavigationDashboardIPADXibName = @"MWMNiPadNavigationDa
return;
case 1:
if (![self.helperPanels.firstObject isKindOfClass:panel.class])
{
[self.helperPanels addObject:panel];
return;
}
return;
case 2:
for (MWMRouteHelperPanel * p in self.helperPanels)
@ -272,6 +276,17 @@ static NSString * const kNavigationDashboardIPADXibName = @"MWMNiPadNavigationDa
[self.delegate didCancelRouting];
}
- (IBAction)soundTap:(UIButton *)sender
{
BOOL const isEnable = !sender.selected;
MWMTextToSpeech * tts = [MWMTextToSpeech tts];
if (isEnable)
[tts enable];
else
[tts disable];
sender.selected = isEnable;
}
#pragma mark - MWMNavigationGo
- (IBAction)navigationGoPressed:(UIButton *)sender
@ -316,6 +331,13 @@ static NSString * const kNavigationDashboardIPADXibName = @"MWMNiPadNavigationDa
- (void)showStateNavigation
{
[self.routePreview remove];
MWMTextToSpeech * tts = [MWMTextToSpeech tts];
BOOL const isNeedToEnable = tts.isNeedToEnable;
self.navigationDashboardPortrait.soundButton.selected = isNeedToEnable;
self.navigationDashboardLandscape.soundButton.selected = isNeedToEnable;
if (isNeedToEnable)
[tts enable];
[self.navigationDashboard addToView:self.ownerView];
}
@ -324,13 +346,9 @@ static NSString * const kNavigationDashboardIPADXibName = @"MWMNiPadNavigationDa
switch (GetFramework().GetRouter())
{
case routing::RouterType::Pedestrian:
// self.routePreview.pedestrianProgressView.state = MWMCircularProgressStateSelected;
// self.routePreview.vehicleProgressView.state = MWMCircularProgressStateNormal;
self.activeRouteTypeButton = self.routePreview.pedestrianProgressView;
break;
case routing::RouterType::Vehicle:
// self.routePreview.vehicleProgressView.state = MWMCircularProgressStateSelected;
// self.routePreview.pedestrianProgressView.state = MWMCircularProgressStateNormal;
self.activeRouteTypeButton = self.routePreview.vehicleProgressView;
break;
}

View file

@ -1,14 +1,33 @@
#import <Foundation/Foundation.h>
#include "std/string.hpp"
#include "std/vector.hpp"
@interface MWMTextToSpeech : NSObject
- (instancetype)init;
+ (instancetype)tts;
+ (void)activateAudioSession;
- (vector<std::pair<string, string>>)availableLanguages;
- (NSString *)savedLanguage;
- (void)setNotificationsLocale:(NSString *)locale;
- (BOOL)isNeedToEnable;
- (void)setNeedToEnable:(BOOL)need;
- (BOOL)isEnable;
- (void)enable;
- (void)disable;
- (void)playTurnNotifications;
- (instancetype)init __attribute__((unavailable("call tts instead")));
- (instancetype)copy __attribute__((unavailable("call tts instead")));
- (instancetype)copyWithZone:(NSZone *)zone __attribute__((unavailable("call tts instead")));
+ (instancetype)alloc __attribute__((unavailable("call tts instead")));
+ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable("call tts instead")));
+ (instancetype)new __attribute__((unavailable("call tts instead")));
@end
namespace tts
{
string bcp47ToTwineLanguage(NSString const * bcp47LangName);
string translatedTwine(string const & twine);
} // namespace tts

View file

@ -1,53 +1,87 @@
#import <AVFoundation/AVFoundation.h>
#import "Common.h"
#import <AVFoundation/AVFoundation.h>
#import "MWMTextToSpeech.h"
#include "Framework.h"
#include "sound/tts/languages.hpp"
extern NSString * const kMwmTextToSpeechEnable = @"MWMTEXTTOSPEECH_ENABLE";
extern NSString * const kMwmTextToSpeechDisable = @"MWMTEXTTOSPEECH_DISABLE";
extern NSString * const kUserDefaultsTTSLanguage = @"UserDefaultsTTSLanguage";
extern NSString * const kUserDafaultsNeedToEnableTTS = @"UserDefaultsNeedToEnableTTS";
@interface MWMTextToSpeech()
{
vector<pair<string, string>> _availableLanguages;
}
@property (nonatomic) AVSpeechSynthesizer * speechSynthesizer;
@property (nonatomic) AVSpeechSynthesisVoice * speechVoice;
@property (nonatomic) float speechRate;
@end
@implementation MWMTextToSpeech
- (instancetype)init
+ (instancetype)tts
{
static dispatch_once_t onceToken;
static MWMTextToSpeech * tts = nil;
dispatch_once(&onceToken, ^
{
tts = [[super alloc] initTTS];
});
return tts;
}
- (instancetype)initTTS
{
self = [super init];
if (self)
{
// Activating audio session.
NSError * err = nil;
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
if (![audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err])
LOG(LWARNING, ("[ setCategory]] error.", [err localizedDescription]));
if (![audioSession setActive:YES error:&err])
LOG(LWARNING, ("[[AVAudioSession sharedInstance] setActive]] error.", [err localizedDescription]));
_availableLanguages = availableLanguages();
NSString * saved = self.savedLanguage;
string preferedLanguage;
if (saved.length)
preferedLanguage = saved.UTF8String;
else
preferedLanguage = tts::bcp47ToTwineLanguage([AVSpeechSynthesisVoice currentLanguageCode]);
pair<string, string> const lan {preferedLanguage, tts::translatedTwine(preferedLanguage)};
if (find(_availableLanguages.begin(), _availableLanguages.end(), lan) != _availableLanguages.end())
[self setNotificationsLocale:@(preferedLanguage.c_str())];
else
[self setNotificationsLocale:@"en"];
// Before 9.0 version iOS has an issue with speechRate. AVSpeechUtteranceDefaultSpeechRate does not work correctly.
// It's a work around for iOS 7.x and 8.x.
self.speechRate = isIOSVersionLessThan(@"7.1.1") ? 0.3 : (isIOSVersionLessThan(@"9.0.0") ? 0.15 : AVSpeechUtteranceDefaultSpeechRate);
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(enable)
name:kMwmTextToSpeechEnable
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(disable)
name:kMwmTextToSpeechDisable
object:nil];
_speechRate = isIOSVersionLessThan(@"7.1.1") ? 0.3 : (isIOSVersionLessThan(@"9.0.0") ? 0.15 : AVSpeechUtteranceDefaultSpeechRate);
}
return self;
}
-(void)dealloc
+ (void)activateAudioSession
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
NSError * err = nil;
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
if (![audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err])
{
LOG(LWARNING, ("[ setCategory]] error.", [err localizedDescription]));
return;
}
if (![audioSession setActive:YES error:&err])
LOG(LWARNING, ("[[AVAudioSession sharedInstance] setActive]] error.", [err localizedDescription]));
}
- (vector<pair<string, string>>)availableLanguages
{
return _availableLanguages;
}
- (void)setNotificationsLocale:(NSString *)locale
{
NSUserDefaults * ud = [NSUserDefaults standardUserDefaults];
[ud setObject:locale forKey:kUserDefaultsTTSLanguage];
[ud synchronize];
[self createVoice:locale];
}
- (BOOL)isValid
@ -55,16 +89,29 @@ extern NSString * const kMwmTextToSpeechDisable = @"MWMTEXTTOSPEECH_DISABLE";
return _speechSynthesizer != nil && _speechVoice != nil;
}
- (BOOL)isNeedToEnable
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kUserDafaultsNeedToEnableTTS];
}
- (void)setNeedToEnable:(BOOL)need
{
NSUserDefaults * ud = [NSUserDefaults standardUserDefaults];
[ud setBool:need forKey:kUserDafaultsNeedToEnableTTS];
[ud synchronize];
}
- (void)enable
{
[self setNeedToEnable:YES];
if (![self isValid])
[self createSynthesizer];
GetFramework().EnableTurnNotifications(true);
}
- (void)disable
{
[self setNeedToEnable:NO];
GetFramework().EnableTurnNotifications(false);
}
@ -73,13 +120,20 @@ extern NSString * const kMwmTextToSpeechDisable = @"MWMTEXTTOSPEECH_DISABLE";
return GetFramework().AreTurnNotificationsEnabled() ? YES : NO;
}
- (NSString *)savedLanguage
{
return [[NSUserDefaults standardUserDefaults] stringForKey:kUserDefaultsTTSLanguage];
}
- (void)createSynthesizer
{
self.speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
self.speechSynthesizer = [[AVSpeechSynthesizer alloc] init];
[self createVoice:self.savedLanguage];
});
// TODO(vbykoianko) Use [NSLocale preferredLanguages] instead of [AVSpeechSynthesisVoice currentLanguageCode].
// [AVSpeechSynthesisVoice currentLanguageCode] is used now because of we need a language code in BCP-47.
[self createVoice:[AVSpeechSynthesisVoice currentLanguageCode]];
}
- (void)createVoice:(NSString *)locale
@ -113,13 +167,13 @@ extern NSString * const kMwmTextToSpeechDisable = @"MWMTEXTTOSPEECH_DISABLE";
}
self.speechVoice = [AVSpeechSynthesisVoice voiceWithLanguage:locale];
NSString const * twineLang = bcp47ToTwineLanguage(locale);
if (twineLang == nil)
string const twineLang = tts::bcp47ToTwineLanguage(locale);
if (twineLang.empty())
{
LOG(LERROR, ("Cannot convert UI locale or default locale to twine language. MWMTestToSpeech is invalid."));
return; // self is not valid.
}
GetFramework().SetTurnNotificationsLocale([twineLang UTF8String]);
GetFramework().SetTurnNotificationsLocale(twineLang);
}
- (void)speakOneString:(NSString *)textToSpeak
@ -150,4 +204,59 @@ extern NSString * const kMwmTextToSpeechDisable = @"MWMTEXTTOSPEECH_DISABLE";
[self speakOneString:@(text.c_str())];
}
static vector<pair<string, string>> availableLanguages()
{
NSArray<AVSpeechSynthesisVoice *> * voices = [AVSpeechSynthesisVoice speechVoices];
vector<string> native(voices.count);
for (AVSpeechSynthesisVoice * v in voices)
native.push_back(tts::bcp47ToTwineLanguage(v.language));
sort(native.begin(), native.end());
using namespace routing::turns::sound;
vector<pair<string, string>> result;
for (auto const & p : kLanguageList)
{
if (find(native.begin(), native.end(), p.first) != native.end())
result.push_back(p);
}
return result;
}
@end
namespace tts
{
string bcp47ToTwineLanguage(NSString const * bcp47LangName)
{
if (bcp47LangName == nil || [bcp47LangName length] < 2)
return string("");
if ([bcp47LangName isEqualToString:@"zh-CN"] || [bcp47LangName isEqualToString:@"zh-CHS"]
|| [bcp47LangName isEqualToString:@"zh-SG"])
{
return string("zh-Hans"); // Chinese simplified
}
if ([bcp47LangName hasPrefix:@"zh"])
return string("zh-Hant"); // Chinese traditional
// Taking two first symbols of a language name. For example ru-RU -> ru
return [[bcp47LangName substringToIndex:2] UTF8String];
}
string translatedTwine(string const & twine)
{
auto const & list = routing::turns::sound::kLanguageList;
auto const it = find_if(list.begin(), list.end(), [&twine](pair<string, string> const & pair)
{
return pair.first == twine;
});
if (it != list.end())
return it->second;
else
return "";
}
} // namespace tts

View file

@ -50,8 +50,69 @@
<constraint firstAttribute="height" constant="30" id="7Y8-Wb-stp"/>
</constraints>
</slider>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UPF-5v-zhS" userLabel="Distance Box">
<rect key="frame" x="536" y="8" width="152" height="44"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 min" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e1o-3M-J3b">
<rect key="frame" x="0.0" y="0.0" width="152" height="20"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="20" id="ocR-64-jZf"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold17"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="00:00" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F95-AG-2uX">
<rect key="frame" x="108" y="24" width="44" height="20"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="20" id="KUh-HY-Mub"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="44" id="ctu-76-aWf"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold17"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 km" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SdK-Ad-rnt">
<rect key="frame" x="46" y="24" width="50" height="20.5"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="20.5" id="EZs-14-596"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="x1u-Qg-Hig"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="F95-AG-2uX" firstAttribute="top" secondItem="e1o-3M-J3b" secondAttribute="bottom" constant="4" id="05i-w7-UH7"/>
<constraint firstAttribute="trailing" secondItem="e1o-3M-J3b" secondAttribute="trailing" id="87Y-MO-kyQ"/>
<constraint firstAttribute="width" constant="152" id="G6x-cE-7Zw"/>
<constraint firstAttribute="trailing" secondItem="F95-AG-2uX" secondAttribute="trailing" id="aEs-Do-FXa"/>
<constraint firstItem="e1o-3M-J3b" firstAttribute="top" secondItem="UPF-5v-zhS" secondAttribute="top" id="bOw-XB-QWR"/>
<constraint firstItem="F95-AG-2uX" firstAttribute="leading" secondItem="SdK-Ad-rnt" secondAttribute="trailing" constant="12" id="nrV-GH-2A1"/>
<constraint firstItem="SdK-Ad-rnt" firstAttribute="top" secondItem="e1o-3M-J3b" secondAttribute="bottom" constant="4" id="p3s-lB-7Kd"/>
<constraint firstItem="e1o-3M-J3b" firstAttribute="leading" secondItem="UPF-5v-zhS" secondAttribute="leading" id="uuc-Gx-OSU"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Kth-rd-TPo" userLabel="Azimut Box">
<rect key="frame" x="52" y="0.0" width="539" height="90"/>
<rect key="frame" x="52" y="0.0" width="484" height="90"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SKb-P8-fcu" userLabel="exit">
<rect key="frame" x="0.0" y="32" width="64" height="21"/>
@ -95,7 +156,7 @@
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Овчинниковская наб." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="M9V-Kt-LIt">
<rect key="frame" x="80" y="60" width="459" height="20"/>
<rect key="frame" x="80" y="60" width="404" height="20"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
@ -123,84 +184,23 @@
<constraint firstAttribute="trailing" secondItem="M9V-Kt-LIt" secondAttribute="trailing" id="itL-f9-gDA"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UPF-5v-zhS" userLabel="Distance Box">
<rect key="frame" x="596" y="0.0" width="132" height="90"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 km" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SdK-Ad-rnt">
<rect key="frame" x="84" y="10" width="48" height="20"/>
<animations/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="47" id="gVc-eW-TLR"/>
<constraint firstAttribute="height" constant="20" id="uu2-wU-UQO"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold17"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F95-AG-2uX">
<rect key="frame" x="0.0" y="60" width="132" height="20"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="20" id="dhj-lT-vwd"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold17"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 min" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e1o-3M-J3b">
<rect key="frame" x="0.0" y="10" width="53" height="20"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="20" id="6QY-Oq-Yhp"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="52" id="XHJ-J8-7YZ"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="SdK-Ad-rnt" firstAttribute="top" secondItem="UPF-5v-zhS" secondAttribute="top" constant="10" id="2nY-Rd-Fdm"/>
<constraint firstItem="SdK-Ad-rnt" firstAttribute="leading" secondItem="e1o-3M-J3b" secondAttribute="trailing" constant="31.5" id="C6J-OD-6d5"/>
<constraint firstAttribute="trailing" secondItem="F95-AG-2uX" secondAttribute="trailing" id="SWJ-hI-r3f"/>
<constraint firstItem="SdK-Ad-rnt" firstAttribute="baseline" secondItem="e1o-3M-J3b" secondAttribute="baseline" id="cIm-DD-F5s"/>
<constraint firstItem="e1o-3M-J3b" firstAttribute="leading" secondItem="UPF-5v-zhS" secondAttribute="leading" id="lQ6-Oe-e43"/>
<constraint firstAttribute="trailing" secondItem="SdK-Ad-rnt" secondAttribute="trailing" id="qa4-cj-UU5"/>
<constraint firstItem="F95-AG-2uX" firstAttribute="leading" secondItem="UPF-5v-zhS" secondAttribute="leading" id="ucb-cA-HW5"/>
</constraints>
</view>
</subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="Kth-rd-TPo" secondAttribute="bottom" id="1pX-f2-Neu"/>
<constraint firstItem="UPF-5v-zhS" firstAttribute="leading" secondItem="Kth-rd-TPo" secondAttribute="trailing" constant="5" id="1rL-Gb-G4e"/>
<constraint firstAttribute="centerY" secondItem="qvD-ft-rlE" secondAttribute="centerY" id="6tk-qf-Wce"/>
<constraint firstItem="jmt-cn-uun" firstAttribute="top" secondItem="iZT-dR-FZ0" secondAttribute="top" constant="-12" id="CHY-YV-Tec"/>
<constraint firstItem="Kth-rd-TPo" firstAttribute="leading" secondItem="qvD-ft-rlE" secondAttribute="trailing" constant="8" id="Jgn-Lf-0wx"/>
<constraint firstAttribute="bottom" secondItem="UPF-5v-zhS" secondAttribute="bottom" id="Mz2-K5-7k8"/>
<constraint firstAttribute="trailing" secondItem="UPF-5v-zhS" secondAttribute="trailing" constant="48" id="Ulg-vs-6Lq"/>
<constraint firstAttribute="height" constant="90" id="Uxs-v3-ZmZ"/>
<constraint firstItem="qvD-ft-rlE" firstAttribute="leading" secondItem="iZT-dR-FZ0" secondAttribute="leading" id="W1d-ek-qDB"/>
<constraint firstItem="jmt-cn-uun" firstAttribute="leading" secondItem="iZT-dR-FZ0" secondAttribute="leading" id="aFw-Pb-4UH"/>
<constraint firstItem="UPF-5v-zhS" firstAttribute="top" secondItem="iZT-dR-FZ0" secondAttribute="top" id="d6y-pz-KFQ"/>
<constraint firstAttribute="trailing" secondItem="UPF-5v-zhS" secondAttribute="trailing" constant="8" id="iPx-T3-lqz"/>
<constraint firstAttribute="trailing" secondItem="jmt-cn-uun" secondAttribute="trailing" id="nXj-Qu-PVE"/>
<constraint firstItem="F95-AG-2uX" firstAttribute="baseline" secondItem="M9V-Kt-LIt" secondAttribute="baseline" id="qJz-jC-YP7"/>
<constraint firstAttribute="bottom" secondItem="UPF-5v-zhS" secondAttribute="bottom" constant="38" id="rm8-qZ-PTO"/>
<constraint firstItem="Kth-rd-TPo" firstAttribute="top" secondItem="iZT-dR-FZ0" secondAttribute="top" id="udQ-PI-fyC"/>
<constraint firstItem="UPF-5v-zhS" firstAttribute="top" secondItem="iZT-dR-FZ0" secondAttribute="top" constant="8" id="xpL-Fj-yiD"/>
<constraint firstItem="UPF-5v-zhS" firstAttribute="leading" secondItem="Kth-rd-TPo" secondAttribute="trailing" id="z7r-Ia-yYs"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.shadowRadius">
@ -217,6 +217,20 @@
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<button opaque="NO" contentMode="scaleToFill" selected="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ULL-In-aAg">
<rect key="frame" x="692" y="22" width="44" height="44"/>
<animations/>
<constraints>
<constraint firstAttribute="width" constant="44" id="MB8-2E-wAL"/>
<constraint firstAttribute="height" constant="44" id="e81-Yl-6wc"/>
</constraints>
<state key="normal" image="ic_voice_off"/>
<state key="selected" image="ic_voice_on"/>
<state key="highlighted" image="ic_voice_off_press"/>
<connections>
<action selector="soundTap:" destination="-1" eventType="touchUpInside" id="WA3-uq-qo0"/>
</connections>
</button>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
@ -224,6 +238,8 @@
<constraint firstAttribute="trailing" secondItem="iZT-dR-FZ0" secondAttribute="trailing" id="FjX-ex-8Um"/>
<constraint firstItem="iZT-dR-FZ0" firstAttribute="leading" secondItem="e3c-EN-9M6" secondAttribute="leading" id="U47-TB-4Wm"/>
<constraint firstItem="iZT-dR-FZ0" firstAttribute="top" secondItem="e3c-EN-9M6" secondAttribute="top" id="cVw-eZ-FjA"/>
<constraint firstItem="ULL-In-aAg" firstAttribute="top" secondItem="e3c-EN-9M6" secondAttribute="top" constant="22" id="jgI-5T-YNO"/>
<constraint firstAttribute="trailing" secondItem="ULL-In-aAg" secondAttribute="trailing" id="oco-ih-4xM"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
@ -237,6 +253,7 @@
<outlet property="eta" destination="e1o-3M-J3b" id="Noc-jA-c24"/>
<outlet property="progress" destination="jmt-cn-uun" id="3N9-YL-PJt"/>
<outlet property="roundRoadLabel" destination="SKb-P8-fcu" id="8TZ-c3-tij"/>
<outlet property="soundButton" destination="ULL-In-aAg" id="ep9-Zf-w9p"/>
<outlet property="streetLabel" destination="M9V-Kt-LIt" id="Yh6-Dn-Z4L"/>
</connections>
<point key="canvasLocation" x="369" y="261"/>
@ -245,5 +262,8 @@
<resources>
<image name="ic_direction" width="96" height="96"/>
<image name="ic_nav_bar_close_light" width="44" height="44"/>
<image name="ic_voice_off" width="44" height="44"/>
<image name="ic_voice_off_press" width="44" height="44"/>
<image name="ic_voice_on" width="28" height="28"/>
</resources>
</document>

View file

@ -12,6 +12,7 @@
@property (weak, nonatomic) IBOutlet UILabel * arrivalsTimeLabel;
@property (weak, nonatomic) IBOutlet UILabel * roundRoadLabel;
@property (weak, nonatomic) IBOutlet UILabel * streetLabel;
@property (weak, nonatomic) IBOutlet UIButton * soundButton;
@property (weak, nonatomic) IBOutlet UISlider * progress;
- (void)configureWithEntity:(MWMNavigationDashboardEntity *)entity;

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15A284" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment version="2048" identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
@ -31,6 +31,7 @@
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xLk-1L-mbP" userLabel="Cancel">
<rect key="frame" x="6" y="6" width="44" height="44"/>
<animations/>
<state key="normal" image="ic_nav_bar_close_light">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
@ -42,7 +43,8 @@
<rect key="frame" x="50" y="0.0" width="262" height="56"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 min" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="79d-Oo-yBr">
<rect key="frame" x="104" y="18" width="53" height="21"/>
<rect key="frame" x="104.5" y="18.5" width="52.5" height="20.5"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -52,7 +54,8 @@
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="12:24" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QMy-7M-aoF" userLabel="12:24">
<rect key="frame" x="196" y="18" width="43" height="21"/>
<rect key="frame" x="196" y="18.5" width="43" height="20.5"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -62,7 +65,8 @@
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 km" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AZa-ok-2IV">
<rect key="frame" x="19" y="18" width="48" height="21"/>
<rect key="frame" x="19.5" y="18.5" width="48" height="20.5"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -72,6 +76,7 @@
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="centerX" secondItem="QMy-7M-aoF" secondAttribute="centerX" multiplier="3:5" id="8ys-Ye-XAu"/>
@ -84,8 +89,23 @@
<constraint firstAttribute="centerX" secondItem="AZa-ok-2IV" secondAttribute="centerX" multiplier="3:1" id="sVn-sG-v3Q"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" selected="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aqb-lr-tzL">
<rect key="frame" x="312" y="6" width="44" height="44"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="44" id="UqN-lJ-bXU"/>
<constraint firstAttribute="width" constant="44" id="dIf-ht-BU5"/>
</constraints>
<state key="normal" image="ic_voice_off"/>
<state key="selected" image="ic_voice_on"/>
<state key="highlighted" image="ic_voice_off_press"/>
<connections>
<action selector="soundTap:" destination="-1" eventType="touchUpInside" id="aqG-hG-ebJ"/>
</connections>
</button>
<slider opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="Kup-95-EXj">
<rect key="frame" x="-3" y="42" width="366" height="31"/>
<animations/>
<color key="tintColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="fxr-ir-Wwz"/>
@ -96,7 +116,8 @@
<rect key="frame" x="0.0" y="58" width="360" height="128"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4si-G5-bxC">
<rect key="frame" x="120" y="8" width="23" height="53"/>
<rect key="frame" x="120" y="8" width="22.5" height="53"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="53" id="7ro-YL-TGI"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="22" id="iwD-qu-xpb"/>
@ -110,7 +131,8 @@
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="km" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9ue-Ra-INo">
<rect key="frame" x="150" y="29" width="34" height="28"/>
<rect key="frame" x="149.5" y="29" width="34" height="28"/>
<animations/>
<constraints>
<constraint firstAttribute="width" constant="34" id="Ktk-eK-oxD"/>
<constraint firstAttribute="height" constant="28" id="nYU-QS-ods"/>
@ -125,9 +147,11 @@
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="slight_left" translatesAutoresizingMaskIntoConstraints="NO" id="t9X-xe-M4K" customClass="MWMImageView">
<rect key="frame" x="16" y="16" width="96" height="96"/>
<animations/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oPs-Pe-p41" userLabel="exit">
<rect key="frame" x="49" y="49" width="30" height="30"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Bold" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.12549019610000001" green="0.58823529409999997" blue="0.95294117649999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -137,7 +161,8 @@
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="top" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Овчинниковская наб." lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fV0-mJ-yGN">
<rect key="frame" x="120" y="59" width="232" height="21"/>
<rect key="frame" x="120" y="59" width="232" height="20.5"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -147,6 +172,7 @@
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="9ue-Ra-INo" firstAttribute="leading" secondItem="4si-G5-bxC" secondAttribute="trailing" constant="7.5" id="87L-8C-oDt"/>
@ -161,6 +187,7 @@
</constraints>
</view>
</subviews>
<animations/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="Kup-95-EXj" secondAttribute="trailing" constant="-1" id="04U-qJ-FUs"/>
@ -169,7 +196,9 @@
<constraint firstItem="aSt-Xc-ReH" firstAttribute="top" secondItem="9Ou-1e-eFR" secondAttribute="top" id="Iab-dC-K0N"/>
<constraint firstItem="Kup-95-EXj" firstAttribute="leading" secondItem="9Ou-1e-eFR" secondAttribute="leading" constant="-1" id="MVR-4t-kSn"/>
<constraint firstItem="Zlu-3F-Lws" firstAttribute="leading" secondItem="9Ou-1e-eFR" secondAttribute="leading" id="UYi-Uv-hcL"/>
<constraint firstItem="aqb-lr-tzL" firstAttribute="top" secondItem="9Ou-1e-eFR" secondAttribute="top" constant="6" id="VlR-rs-YMX"/>
<constraint firstAttribute="height" constant="186" id="gxT-i0-grl"/>
<constraint firstAttribute="trailing" secondItem="aqb-lr-tzL" secondAttribute="trailing" constant="4" id="mMx-Tx-10B"/>
<constraint firstItem="Kup-95-EXj" firstAttribute="top" secondItem="9Ou-1e-eFR" secondAttribute="top" constant="42" id="qa0-jI-boa"/>
<constraint firstItem="Zlu-3F-Lws" firstAttribute="top" secondItem="aSt-Xc-ReH" secondAttribute="bottom" constant="2" id="r0d-tK-79C"/>
<constraint firstAttribute="bottom" secondItem="Zlu-3F-Lws" secondAttribute="bottom" id="uDF-PO-xXf"/>
@ -190,6 +219,7 @@
</userDefinedRuntimeAttributes>
</view>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="9Ou-1e-eFR" firstAttribute="top" secondItem="zx5-8Q-rUK" secondAttribute="top" id="e8M-4E-Yc5"/>
@ -207,6 +237,7 @@
<outlet property="eta" destination="79d-Oo-yBr" id="P9I-aa-8oC"/>
<outlet property="progress" destination="Kup-95-EXj" id="hh3-qY-ll2"/>
<outlet property="roundRoadLabel" destination="oPs-Pe-p41" id="hAe-GQ-oHd"/>
<outlet property="soundButton" destination="aqb-lr-tzL" id="Twe-20-K3t"/>
<outlet property="streetLabel" destination="fV0-mJ-yGN" id="bw9-9h-2dA"/>
</connections>
<point key="canvasLocation" x="957" y="243"/>
@ -214,6 +245,9 @@
</objects>
<resources>
<image name="ic_nav_bar_close_light" width="44" height="44"/>
<image name="ic_voice_off" width="44" height="44"/>
<image name="ic_voice_off_press" width="44" height="44"/>
<image name="ic_voice_on" width="28" height="28"/>
<image name="slight_left" width="96" height="96"/>
</resources>
</document>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15A284" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
@ -31,6 +31,7 @@
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="CJi-qt-H0B" userLabel="Cancel">
<rect key="frame" x="0.0" y="0.0" width="44" height="44"/>
<animations/>
<constraints>
<constraint firstAttribute="width" constant="44" id="Ok9-eV-7ac"/>
<constraint firstAttribute="height" constant="44" id="TNH-gl-jy5"/>
@ -47,6 +48,7 @@
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 km" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="w2P-mo-JWt">
<rect key="frame" x="16" y="12" width="45" height="19.5"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -57,6 +59,7 @@
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10 min" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fLt-4z-zaW">
<rect key="frame" x="91" y="12" width="49.5" height="19.5"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -67,6 +70,7 @@
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="12:24" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yG6-pM-WjM" userLabel="12:24">
<rect key="frame" x="172" y="12" width="40.5" height="19.5"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -76,6 +80,7 @@
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="centerY" secondItem="yG6-pM-WjM" secondAttribute="centerY" id="I3I-Z7-hE1"/>
@ -92,6 +97,7 @@
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tmo-Mk-HBF" userLabel="exit">
<rect key="frame" x="4" y="21.5" width="64" height="21"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Bold" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.12549019610000001" green="0.58823529409999997" blue="0.95294117649999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -101,7 +107,8 @@
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="w7a-mi-GxC">
<rect key="frame" x="80" y="0.0" width="23" height="48"/>
<rect key="frame" x="80" y="0.0" width="22.5" height="48"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="48" id="ESA-SR-dUT"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="20" id="ttG-eK-Cdv"/>
@ -115,7 +122,8 @@
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="km" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vQs-gj-DUL">
<rect key="frame" x="108" y="22" width="26" height="22"/>
<rect key="frame" x="108" y="21" width="26" height="21.5"/>
<animations/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="26" id="JFu-EH-q55"/>
</constraints>
@ -129,6 +137,7 @@
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Овчинниковская наб." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FKF-bV-YL5">
<rect key="frame" x="80" y="46" width="228" height="19"/>
<animations/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@ -139,8 +148,10 @@
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="ic_direction" translatesAutoresizingMaskIntoConstraints="NO" id="vcg-Bu-8CX" customClass="MWMImageView">
<rect key="frame" x="4" y="0.0" width="64" height="64"/>
<animations/>
</imageView>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="FKF-bV-YL5" firstAttribute="top" secondItem="vQs-gj-DUL" secondAttribute="bottom" constant="3" id="Hdz-8J-buM"/>
@ -156,6 +167,7 @@
</view>
<slider opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="50" minValue="0.0" maxValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="Ik8-WE-G9H">
<rect key="frame" x="-2" y="30" width="324" height="31"/>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="tintColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
@ -164,7 +176,22 @@
<color key="minimumTrackTintColor" red="0.0" green="0.0" blue="0.0" alpha="0.56000000000000005" colorSpace="custom" customColorSpace="sRGB"/>
<color key="maximumTrackTintColor" red="0.0" green="0.0" blue="0.0" alpha="0.080000000000000002" colorSpace="calibratedRGB"/>
</slider>
<button opaque="NO" contentMode="scaleToFill" selected="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YYH-DO-DXQ">
<rect key="frame" x="276" y="2" width="44" height="44"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="44" id="g60-zB-ibp"/>
<constraint firstAttribute="width" constant="44" id="zOC-d6-xfc"/>
</constraints>
<state key="normal" image="ic_voice_off"/>
<state key="selected" image="ic_voice_on"/>
<state key="highlighted" image="ic_voice_off_press"/>
<connections>
<action selector="soundTap:" destination="-1" eventType="touchUpInside" id="mDK-P2-VpS"/>
</connections>
</button>
</subviews>
<animations/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="BLc-UX-Tny" firstAttribute="top" secondItem="9t0-Kj-KTa" secondAttribute="top" id="01q-QQ-V0Z"/>
@ -172,6 +199,7 @@
<constraint firstAttribute="trailing" secondItem="Ik8-WE-G9H" secondAttribute="trailing" id="5yS-Lq-qD4"/>
<constraint firstItem="BLc-UX-Tny" firstAttribute="leading" secondItem="CJi-qt-H0B" secondAttribute="trailing" id="DmZ-bp-xAO"/>
<constraint firstAttribute="bottom" secondItem="Ik8-WE-G9H" secondAttribute="bottom" constant="72" id="KLJ-AI-XSH"/>
<constraint firstAttribute="trailing" secondItem="YYH-DO-DXQ" secondAttribute="trailing" id="SYd-n9-M54"/>
<constraint firstItem="CJi-qt-H0B" firstAttribute="top" secondItem="9t0-Kj-KTa" secondAttribute="top" id="Vjp-9R-fvx"/>
<constraint firstAttribute="height" constant="132" id="WMw-Bg-kQl"/>
<constraint firstItem="Ik8-WE-G9H" firstAttribute="leading" secondItem="9t0-Kj-KTa" secondAttribute="leading" id="d3u-OI-Wu8"/>
@ -179,6 +207,7 @@
<constraint firstAttribute="bottom" secondItem="8Zr-ul-QD4" secondAttribute="bottom" constant="8" id="leE-2g-Q1m"/>
<constraint firstAttribute="centerX" secondItem="8Zr-ul-QD4" secondAttribute="centerX" id="oSW-At-b0b"/>
<constraint firstItem="8Zr-ul-QD4" firstAttribute="top" secondItem="BLc-UX-Tny" secondAttribute="bottom" constant="11" id="od5-8S-wS0"/>
<constraint firstItem="YYH-DO-DXQ" firstAttribute="top" secondItem="9t0-Kj-KTa" secondAttribute="top" constant="2" id="qeI-AI-qi0"/>
<constraint firstItem="Ik8-WE-G9H" firstAttribute="top" secondItem="9t0-Kj-KTa" secondAttribute="top" constant="30" id="xRo-Yi-yYb"/>
</constraints>
<userDefinedRuntimeAttributes>
@ -197,6 +226,7 @@
</userDefinedRuntimeAttributes>
</view>
</subviews>
<animations/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="9t0-Kj-KTa" firstAttribute="leading" secondItem="wul-fx-3xk" secondAttribute="leading" id="P5E-A4-wvE"/>
@ -215,6 +245,7 @@
<outlet property="eta" destination="fLt-4z-zaW" id="C1L-bX-xd5"/>
<outlet property="progress" destination="Ik8-WE-G9H" id="7RN-KS-cn3"/>
<outlet property="roundRoadLabel" destination="Tmo-Mk-HBF" id="K74-y4-vwk"/>
<outlet property="soundButton" destination="YYH-DO-DXQ" id="Uqw-J0-sZW"/>
<outlet property="streetLabel" destination="FKF-bV-YL5" id="tIi-aG-G0v"/>
</connections>
<point key="canvasLocation" x="436" y="288"/>
@ -223,5 +254,8 @@
<resources>
<image name="ic_direction" width="96" height="96"/>
<image name="ic_nav_bar_close_light" width="44" height="44"/>
<image name="ic_voice_off" width="44" height="44"/>
<image name="ic_voice_off_press" width="44" height="44"/>
<image name="ic_voice_on" width="28" height="28"/>
</resources>
</document>

View file

@ -6,6 +6,7 @@
#import "MWMAPIBar.h"
#import "MWMMapViewControlsManager.h"
#import "RouteState.h"
#import "MWMTextToSpeech.h"
#import "UIFont+MapsMeFonts.h"
#import "UIViewController+Navigation.h"
@ -142,8 +143,9 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction)
if (res.IsValid())
[self.controlsManager setupRoutingDashboard:res];
[self.controlsManager playTurnNotifications];
if (frm.IsOnRoute())
[[MWMTextToSpeech tts] playTurnNotifications];
}
- (void)onCompassUpdate:(location::CompassInfo const &)info

View file

@ -5,6 +5,7 @@
#import "MapsAppDelegate.h"
#import "MapViewController.h"
#import "MWMAlertViewController.h"
#import "MWMTextToSpeech.h"
#import "MWMWatchEventInfo.h"
#import "Preferences.h"
#import "RouteState.h"
@ -47,6 +48,8 @@ static NSString * const kBundleVersion = @"BundleVersion";
extern string const kCountryCodeKey;
extern string const kUniqueIdKey;
extern string const kLanguageKey;
extern NSString * const kUserDefaultsTTSLanguage;
extern NSString * const kUserDafaultsNeedToEnableTTS;
/// Adds needed localized strings to C++ code
/// @TODO Refactor localization mechanism to make it simpler
@ -202,11 +205,14 @@ void InitLocalizedStrings()
[self incrementSessionCount];
[self showAlertIfRequired];
}
Framework & f = GetFramework();
application.applicationIconBadgeNumber = f.GetCountryTree().GetActiveMapLayout().GetOutOfDateCount();
f.GetLocationState()->InvalidatePosition();
[self enableTTSForTheFirstTime];
[MWMTextToSpeech activateAudioSession];
return returnValue;
}
@ -529,6 +535,17 @@ void InitLocalizedStrings()
[RouteState remove];
}
#pragma mark - TTS
- (void)enableTTSForTheFirstTime
{
NSUserDefaults * ud = [NSUserDefaults standardUserDefaults];
if ([ud stringForKey:kUserDefaultsTTSLanguage].length)
return;
[ud setBool:YES forKey:kUserDafaultsNeedToEnableTTS];
[ud synchronize];
}
#pragma mark - Standby
- (void)enableStandby

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_voice_off.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_voice_off@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_voice_off@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_voice_off_press.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_voice_off_press@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_voice_off_press@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 888 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_voice_on.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_voice_on@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_voice_on@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,5 @@
#import "TableViewController.h"
@interface MWMTTSLanguageViewController : TableViewController
@end

View file

@ -0,0 +1,39 @@
#import "MWMTextToSpeech.h"
#import "MWMTTSLanguageViewController.h"
#import "MWMTTSSettingsViewController.h"
#import "SelectableCell.h"
static NSString * const kUnwingSegueIdentifier = @"UnwindToTTSSettings";
@implementation MWMTTSLanguageViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = L(@"pref_tts_other_section_title");
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(SelectableCell *)sender
{
if (![segue.identifier isEqualToString:kUnwingSegueIdentifier])
return;
MWMTTSSettingsViewController * dest = segue.destinationViewController;
NSUInteger const row = [self.tableView indexPathForCell:sender].row;
[dest setAdditionalTTSLanguage:[[MWMTextToSpeech tts] availableLanguages][row]];
}
#pragma mark - UITableViewDataSource && UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[MWMTextToSpeech tts] availableLanguages].size();
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
SelectableCell * cell = (SelectableCell *)[tableView dequeueReusableCellWithIdentifier:[SelectableCell className]];
cell.titleLabel.text = @([[MWMTextToSpeech tts] availableLanguages][indexPath.row].second.c_str());
return cell;
}
@end

View file

@ -0,0 +1,7 @@
#import "TableViewController.h"
@interface MWMTTSSettingsViewController : TableViewController
- (void)setAdditionalTTSLanguage:(std::pair<string, string> const &)l;
@end

View file

@ -0,0 +1,135 @@
#import <AVFoundation/AVFoundation.h>
#import "LinkCell.h"
#import "MWMTextToSpeech.h"
#import "MWMTTSSettingsViewController.h"
#import "SelectableCell.h"
static NSString * kSelectTTSLanguageSegueName = @"TTSLanguage";
using namespace std;
@interface MWMTTSSettingsViewController ()
{
pair<string, string> _additionalTTSLanguage;
vector<pair<string, string>> _languages;
}
@property (nonatomic) BOOL isLocaleLanguageAbsent;
@end
@implementation MWMTTSSettingsViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = L(@"pref_tts_language_title");
MWMTextToSpeech * tts = [MWMTextToSpeech tts];
_languages.reserve(3);
auto const & v = tts.availableLanguages;
NSAssert(!v.empty(), @"Vector can't be empty!");
pair<string, string> const standart = v.front();
_languages.push_back(standart);
using namespace tts;
string const current = bcp47ToTwineLanguage([AVSpeechSynthesisVoice currentLanguageCode]);
if (current != standart.first && !current.empty())
{
string const translated = translatedTwine(current);
pair<string, string> const cur {current, translated};
if (translated.empty() || find(v.begin(), v.end(), cur) != v.end())
_languages.push_back(cur);
else
self.isLocaleLanguageAbsent = YES;
}
string const savedLanguage = tts.savedLanguage.UTF8String;
if (savedLanguage != current && savedLanguage != standart.first && !savedLanguage.empty())
_languages.push_back({savedLanguage, translatedTwine(savedLanguage)});
}
- (IBAction)unwind:(id)sender
{
size_t const size = _languages.size();
switch (size)
{
case 1:
_languages.push_back(_additionalTTSLanguage);
break;
case 2:
if (self.isLocaleLanguageAbsent)
_languages[size - 1] = _additionalTTSLanguage;
else
_languages.push_back(_additionalTTSLanguage);
break;
case 3:
_languages[size - 1] = _additionalTTSLanguage;
break;
default:
NSAssert(false, @"Incorrect language's count");
break;
}
[self.tableView reloadData];
}
- (void)setAdditionalTTSLanguage:(pair<string, string> const &)l
{
[[MWMTextToSpeech tts] setNotificationsLocale:@(l.first.c_str())];
_additionalTTSLanguage = l;
}
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0)
return _languages.size() + 1;
else
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0 && indexPath.row != _languages.size())
{
SelectableCell * cell = (SelectableCell *)[tableView dequeueReusableCellWithIdentifier:[SelectableCell className]];
pair<string, string> const p = _languages[indexPath.row];
cell.titleLabel.text = @(p.second.c_str());
BOOL const isSelected = [@(p.first.c_str()) isEqualToString:[[MWMTextToSpeech tts] savedLanguage]];
cell.accessoryType = isSelected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
return cell;
}
else
{
LinkCell * cell = (LinkCell *)[tableView dequeueReusableCellWithIdentifier:[LinkCell className]];
cell.titleLabel.text = indexPath.section == 0 ? L(@"pref_tts_other_section_title") : L(@"pref_tts_how_to_set_up_voice");
return cell;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
if (indexPath.row == _languages.size())
{
[self performSegueWithIdentifier:kSelectTTSLanguageSegueName sender:nil];
}
else
{
[[MWMTextToSpeech tts] setNotificationsLocale:@(_languages[indexPath.row].first.c_str())];
[tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}
}
#warning need to add help
// else
// {
// }
}
@end

View file

@ -243,6 +243,7 @@
F63732961AE9431E00A03764 /* MWMBasePlacePageView.mm in Sources */ = {isa = PBXBuildFile; fileRef = F63732951AE9431E00A03764 /* MWMBasePlacePageView.mm */; };
F63774E71B59375E00BCF54D /* MWMRoutingDisclaimerAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F63774E61B59375E00BCF54D /* MWMRoutingDisclaimerAlert.xib */; };
F63774EA1B59376F00BCF54D /* MWMRoutingDisclaimerAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F63774E91B59376F00BCF54D /* MWMRoutingDisclaimerAlert.mm */; };
F63BA3711BCD5B520044C504 /* MWMTTSLanguageViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F63BA3701BCD5B520044C504 /* MWMTTSLanguageViewController.mm */; };
F64A37D01B9EE24C00180464 /* MWMRouteHelperPanelsDrawer.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64A37CF1B9EE24C00180464 /* MWMRouteHelperPanelsDrawer.mm */; };
F64F19991AB81A00006EAF7E /* MWMAlertViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F64F19821AB81A00006EAF7E /* MWMAlertViewController.mm */; };
F64F199A1AB81A00006EAF7E /* MWMAlertViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F64F19831AB81A00006EAF7E /* MWMAlertViewController.xib */; };
@ -263,6 +264,7 @@
F6588E371B15D87A00EE1E58 /* MWMBookmarkColorCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6588E351B15D87A00EE1E58 /* MWMBookmarkColorCell.mm */; };
F6588E381B15D87A00EE1E58 /* MWMBookmarkColorCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6588E361B15D87A00EE1E58 /* MWMBookmarkColorCell.xib */; };
F6671C6B1BA2EFD500548008 /* libFlurry_7.1.0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F6671C6A1BA2EFD500548008 /* libFlurry_7.1.0.a */; };
F668F6561BCD4507002D6FFC /* MWMTTSSettingsViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F668F6551BCD4507002D6FFC /* MWMTTSSettingsViewController.mm */; };
F66A8FA81B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F66A8FA71B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm */; };
F66A8FAC1B09F137001B9C97 /* MWMiPadPlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F66A8FAB1B09F137001B9C97 /* MWMiPadPlacePage.mm */; };
F66A8FB01B09F268001B9C97 /* MWMPlacePage.mm in Sources */ = {isa = PBXBuildFile; fileRef = F66A8FAF1B09F268001B9C97 /* MWMPlacePage.mm */; };
@ -729,6 +731,8 @@
F63774E61B59375E00BCF54D /* MWMRoutingDisclaimerAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMRoutingDisclaimerAlert.xib; sourceTree = "<group>"; };
F63774E81B59376F00BCF54D /* MWMRoutingDisclaimerAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMRoutingDisclaimerAlert.h; sourceTree = "<group>"; };
F63774E91B59376F00BCF54D /* MWMRoutingDisclaimerAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMRoutingDisclaimerAlert.mm; sourceTree = "<group>"; };
F63BA36F1BCD5B520044C504 /* MWMTTSLanguageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMTTSLanguageViewController.h; sourceTree = "<group>"; };
F63BA3701BCD5B520044C504 /* MWMTTSLanguageViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMTTSLanguageViewController.mm; sourceTree = "<group>"; };
F63BA3721BCE6F770044C504 /* MWMRoutePoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MWMRoutePoint.h; path = APIBar/MWMRoutePoint.h; sourceTree = "<group>"; };
F63BA3731BCE70D60044C504 /* MWMRoutingProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMRoutingProtocol.h; sourceTree = "<group>"; };
F64A37CE1B9EE24C00180464 /* MWMRouteHelperPanelsDrawer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMRouteHelperPanelsDrawer.h; sourceTree = "<group>"; };
@ -763,6 +767,8 @@
F6588E351B15D87A00EE1E58 /* MWMBookmarkColorCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMBookmarkColorCell.mm; sourceTree = "<group>"; };
F6588E361B15D87A00EE1E58 /* MWMBookmarkColorCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMBookmarkColorCell.xib; sourceTree = "<group>"; };
F6671C6A1BA2EFD500548008 /* libFlurry_7.1.0.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libFlurry_7.1.0.a; path = Statistics/libFlurry_7.1.0.a; sourceTree = "<group>"; };
F668F6541BCD4507002D6FFC /* MWMTTSSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMTTSSettingsViewController.h; sourceTree = "<group>"; };
F668F6551BCD4507002D6FFC /* MWMTTSSettingsViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMTTSSettingsViewController.mm; sourceTree = "<group>"; };
F66A8FA61B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMiPhoneLandscapePlacePage.h; sourceTree = "<group>"; };
F66A8FA71B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMiPhoneLandscapePlacePage.mm; sourceTree = "<group>"; };
F66A8FAA1B09F137001B9C97 /* MWMiPadPlacePage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMiPadPlacePage.h; sourceTree = "<group>"; };
@ -2138,6 +2144,10 @@
978F924D183BB5D6000D6C7C /* Cells */,
978F923F183B660F000D6C7C /* SettingsViewController.h */,
978F9239183B660F000D6C7C /* SettingsViewController.mm */,
F668F6541BCD4507002D6FFC /* MWMTTSSettingsViewController.h */,
F668F6551BCD4507002D6FFC /* MWMTTSSettingsViewController.mm */,
F63BA36F1BCD5B520044C504 /* MWMTTSLanguageViewController.h */,
F63BA3701BCD5B520044C504 /* MWMTTSLanguageViewController.mm */,
97508421199522D300A7457D /* SettingsAndMoreVC.h */,
97508422199522D300A7457D /* SettingsAndMoreVC.mm */,
978D4A231996B0EC00D72CA7 /* CommunityVC.h */,
@ -2542,6 +2552,7 @@
349A35851B53E967009677EE /* MWMDownloadMapRequestView.mm in Sources */,
F64F19991AB81A00006EAF7E /* MWMAlertViewController.mm in Sources */,
FAFCB63613366E78001A5C59 /* WebViewController.mm in Sources */,
F63BA3711BCD5B520044C504 /* MWMTTSLanguageViewController.mm in Sources */,
F6FE2C0F1B03A006009814AA /* MWMPlacePageNavigationBar.mm in Sources */,
F64A37D01B9EE24C00180464 /* MWMRouteHelperPanelsDrawer.mm in Sources */,
340F24631B14910500F874CD /* RouteState.mm in Sources */,
@ -2574,6 +2585,7 @@
340E10601B944DAB00D975D5 /* MWMSearchHistoryManager.mm in Sources */,
F6DBF9B61AA8779300F2EC2C /* CALayer+RuntimeAttributes.mm in Sources */,
FA36B80D15403A4F004560CC /* BookmarksVC.mm in Sources */,
F668F6561BCD4507002D6FFC /* MWMTTSSettingsViewController.mm in Sources */,
F6ED135B1B18AA930095C6DE /* MWMExtendedPlacePageView.mm in Sources */,
34B16C451B72655D000D3A0D /* MWMPedestrianShareAlert.mm in Sources */,
347BAC6E1B736BA70010FF78 /* MWMSharePedestrianRoutesToastActivityItem.mm in Sources */,

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8191" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="Wns-nH-AQU">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8191" systemVersion="15A284" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="Wns-nH-AQU">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
@ -17,6 +17,7 @@
<view key="view" clearsContextBeforeDrawing="NO" multipleTouchEnabled="YES" contentMode="scaleToFill" id="USG-6L-Uhw" customClass="EAGLView">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" red="0.8666666666666667" green="0.8666666666666667" blue="0.80000000000000004" alpha="1" colorSpace="calibratedRGB"/>
</view>
<navigationItem key="navigationItem" id="8E8-0f-UV9"/>
@ -33,6 +34,7 @@
<navigationBar key="navigationBar" contentMode="scaleToFill" id="OK2-RC-YDq">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<animations/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
@ -50,7 +52,8 @@
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="zyF-i7-Uoj">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
<animations/>
<color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.95686274509803915" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="checkmark" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="SelectableCell" id="6zO-4O-plh" customClass="SelectableCell">
<rect key="frame" x="0.0" y="113.5" width="600" height="44"/>
@ -61,11 +64,13 @@
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Metrics" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fhF-kM-tcR">
<rect key="frame" x="16" y="11" width="477" height="21"/>
<animations/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<animations/>
<constraints>
<constraint firstItem="fhF-kM-tcR" firstAttribute="leading" secondItem="9W6-2l-MFB" secondAttribute="leadingMargin" constant="8" id="9dS-im-XYl"/>
<constraint firstItem="fhF-kM-tcR" firstAttribute="top" secondItem="9W6-2l-MFB" secondAttribute="topMargin" constant="3" id="JIL-dK-S7R"/>
@ -73,6 +78,7 @@
<constraint firstAttribute="trailingMargin" secondItem="fhF-kM-tcR" secondAttribute="trailing" constant="60" id="u5b-BA-GNg"/>
</constraints>
</tableViewCellContentView>
<animations/>
<connections>
<outlet property="titleLabel" destination="fhF-kM-tcR" id="ivW-qB-zd1"/>
</connections>
@ -86,6 +92,7 @@
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Statistics" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HGH-S1-QeY">
<rect key="frame" x="16" y="11" width="462" height="21"/>
<animations/>
<inset key="insetFor6xAndEarlier" minX="0.0" minY="0.0" maxX="-25" maxY="0.0"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
@ -93,6 +100,7 @@
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="up5-BH-6Ii">
<rect key="frame" x="538" y="6.5" width="51" height="31"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="31" id="o1b-KZ-fJq"/>
<constraint firstAttribute="width" constant="49" id="uJQ-7d-3iY"/>
@ -101,6 +109,7 @@
<color key="onTintColor" red="0.11764705882352941" green="0.58823529411764708" blue="0.94117647058823528" alpha="1" colorSpace="calibratedRGB"/>
</switch>
</subviews>
<animations/>
<constraints>
<constraint firstItem="up5-BH-6Ii" firstAttribute="leading" secondItem="HGH-S1-QeY" secondAttribute="trailing" constant="60" id="NGB-9m-bOa"/>
<constraint firstAttribute="trailingMargin" secondItem="up5-BH-6Ii" secondAttribute="trailing" constant="5" id="QWk-8C-bAG"/>
@ -110,6 +119,7 @@
<constraint firstItem="up5-BH-6Ii" firstAttribute="top" secondItem="egv-pz-GkJ" secondAttribute="topMargin" constant="-1.5" id="nQx-6e-sWH"/>
</constraints>
</tableViewCellContentView>
<animations/>
<connections>
<outlet property="switchButton" destination="up5-BH-6Ii" id="P6t-pI-JJm"/>
<outlet property="titleLabel" destination="HGH-S1-QeY" id="QBW-d4-TKD"/>
@ -124,11 +134,13 @@
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="About" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8jb-wX-P4h">
<rect key="frame" x="16" y="11" width="483" height="21"/>
<animations/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<animations/>
<constraints>
<constraint firstItem="8jb-wX-P4h" firstAttribute="top" secondItem="MYm-HI-oOR" secondAttribute="topMargin" constant="3" id="8Jt-on-XAZ"/>
<constraint firstItem="8jb-wX-P4h" firstAttribute="leading" secondItem="MYm-HI-oOR" secondAttribute="leadingMargin" constant="8" id="Zy7-xE-yIy"/>
@ -136,8 +148,10 @@
<constraint firstAttribute="bottomMargin" secondItem="8jb-wX-P4h" secondAttribute="bottom" constant="3.5" id="ox3-NV-T2v"/>
</constraints>
</tableViewCellContentView>
<animations/>
<connections>
<outlet property="titleLabel" destination="8jb-wX-P4h" id="swZ-rt-c36"/>
<segue destination="XDU-iY-yV9" kind="show" id="6P4-k0-wZ3"/>
</connections>
</tableViewCell>
</prototypes>
@ -154,5 +168,149 @@
</objects>
<point key="canvasLocation" x="1143" y="-338"/>
</scene>
<!--Settings View Controller-->
<scene sceneID="9aS-r5-1zA">
<objects>
<tableViewController id="XDU-iY-yV9" customClass="MWMTTSSettingsViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="UXT-6R-4is">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="checkmark" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="SelectableCell" id="79I-kz-hl4" customClass="SelectableCell">
<rect key="frame" x="0.0" y="113.5" width="600" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="79I-kz-hl4" id="gBB-ji-big">
<rect key="frame" x="0.0" y="0.0" width="561" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Русский" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FSn-fP-n3e">
<rect key="frame" x="16" y="11" width="477" height="21"/>
<animations/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<constraints>
<constraint firstAttribute="bottomMargin" secondItem="FSn-fP-n3e" secondAttribute="bottom" constant="3.5" id="0gT-qS-OJP"/>
<constraint firstAttribute="trailingMargin" secondItem="FSn-fP-n3e" secondAttribute="trailing" constant="60" id="9tn-Wo-rsJ"/>
<constraint firstItem="FSn-fP-n3e" firstAttribute="top" secondItem="gBB-ji-big" secondAttribute="topMargin" constant="3" id="DiX-RQ-foa"/>
<constraint firstItem="FSn-fP-n3e" firstAttribute="leading" secondItem="gBB-ji-big" secondAttribute="leadingMargin" constant="8" id="KXd-hd-5in"/>
</constraints>
</tableViewCellContentView>
<animations/>
<connections>
<outlet property="titleLabel" destination="FSn-fP-n3e" id="CKZ-Gb-7Wa"/>
</connections>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="LinkCell" id="lO6-zb-qb8" customClass="LinkCell">
<rect key="frame" x="0.0" y="157.5" width="600" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="lO6-zb-qb8" id="35k-Nb-XSD">
<rect key="frame" x="0.0" y="0.0" width="567" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Other" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="arm-Sx-diY">
<rect key="frame" x="16" y="11" width="483" height="21"/>
<animations/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<constraints>
<constraint firstItem="arm-Sx-diY" firstAttribute="leading" secondItem="35k-Nb-XSD" secondAttribute="leadingMargin" constant="8" id="8xX-eo-OZI"/>
<constraint firstItem="arm-Sx-diY" firstAttribute="top" secondItem="35k-Nb-XSD" secondAttribute="topMargin" constant="3" id="9Jx-Qg-8qw"/>
<constraint firstAttribute="bottomMargin" secondItem="arm-Sx-diY" secondAttribute="bottom" constant="3.5" id="WH3-ny-wEN"/>
<constraint firstAttribute="trailingMargin" secondItem="arm-Sx-diY" secondAttribute="trailing" constant="60" id="xT2-p0-snO"/>
</constraints>
</tableViewCellContentView>
<animations/>
<connections>
<outlet property="titleLabel" destination="arm-Sx-diY" id="yow-av-5HT"/>
</connections>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="XDU-iY-yV9" id="gTR-kW-qWB"/>
<outlet property="delegate" destination="XDU-iY-yV9" id="jFV-ti-w00"/>
</connections>
</tableView>
<connections>
<segue destination="13e-Bs-Dwh" kind="show" identifier="TTSLanguage" id="Shk-sp-8OS"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="374-fn-hNn" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1881" y="-338"/>
</scene>
<!--Language View Controller-->
<scene sceneID="Fml-K3-2gi">
<objects>
<tableViewController id="13e-Bs-Dwh" customClass="MWMTTSLanguageViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="3eG-G0-XZP">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="SelectableCell" id="6Px-TO-sMc" customClass="SelectableCell">
<rect key="frame" x="0.0" y="113.5" width="600" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="6Px-TO-sMc" id="aqp-aV-B3y">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Русский" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wBg-nH-SXL">
<rect key="frame" x="16" y="11" width="516" height="21"/>
<animations/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
</userDefinedRuntimeAttributes>
</label>
</subviews>
<animations/>
<constraints>
<constraint firstItem="wBg-nH-SXL" firstAttribute="top" secondItem="aqp-aV-B3y" secondAttribute="topMargin" constant="3" id="2dD-fi-Iy3"/>
<constraint firstItem="wBg-nH-SXL" firstAttribute="leading" secondItem="aqp-aV-B3y" secondAttribute="leadingMargin" constant="8" id="C97-Rv-8b2"/>
<constraint firstAttribute="trailingMargin" secondItem="wBg-nH-SXL" secondAttribute="trailing" constant="60" id="jJO-v9-RNP"/>
<constraint firstAttribute="bottomMargin" secondItem="wBg-nH-SXL" secondAttribute="bottom" constant="3.5" id="yh9-ce-ftK"/>
</constraints>
</tableViewCellContentView>
<animations/>
<connections>
<outlet property="titleLabel" destination="wBg-nH-SXL" id="MCZ-tX-MGv"/>
<segue destination="SWt-Am-yp4" kind="unwind" identifier="UnwindToTTSSettings" unwindAction="unwind:" id="bpg-7g-3lb"/>
</connections>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="13e-Bs-Dwh" id="usg-YD-GvD"/>
<outlet property="delegate" destination="13e-Bs-Dwh" id="yy5-Cx-ZaD"/>
</connections>
</tableView>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="qSX-mz-m27" userLabel="First Responder" sceneMemberID="firstResponder"/>
<exit id="SWt-Am-yp4" userLabel="Exit" sceneMemberID="exit"/>
</objects>
<point key="canvasLocation" x="2577" y="-338"/>
</scene>
</scenes>
</document>

View file

@ -1,13 +1,13 @@
#import "SettingsViewController.h"
#import "SwitchCell.h"
#import "MapsAppDelegate.h"
#import "MapViewController.h"
#import "MWMMapViewControlsManager.h"
#import "MWMTextToSpeech.h"
#import "SelectableCell.h"
#import "SettingsViewController.h"
#import "Statistics.h"
#import "SwitchCell.h"
#import "LinkCell.h"
#import "WebViewController.h"
#import "MapViewController.h"
#import "MapsAppDelegate.h"
#import "Statistics.h"
#import "MWMMapViewControlsManager.h"
#include "Framework.h"
@ -16,14 +16,16 @@
#include "platform/preferred_languages.hpp"
extern char const * kStatisticsEnabledSettingsKey;
extern NSString * const kTTSStatusWasChangedNotification = @"TTFStatusWasChangedFromSettingsNotification";
typedef NS_ENUM(NSUInteger, Section)
{
SectionMetrics,
SectionZoomButtons,
SectionRouting,
SectionCalibration,
SectionStatistics,
SectionCount
SectionCount // Must be the latest value!
};
@interface SettingsViewController () <SwitchCellDelegate>
@ -60,7 +62,7 @@ typedef NS_ENUM(NSUInteger, Section)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == SectionMetrics)
if (section == SectionMetrics || section == SectionRouting)
return 2;
else
return 1;
@ -110,7 +112,23 @@ typedef NS_ENUM(NSUInteger, Section)
customCell.titleLabel.text = L(@"pref_calibration_title");
customCell.delegate = self;
}
else if (indexPath.section == SectionRouting)
{
if (indexPath.row == 0)
{
cell = [tableView dequeueReusableCellWithIdentifier:[SwitchCell className]];
SwitchCell * customCell = (SwitchCell *)cell;
customCell.switchButton.on = [[MWMTextToSpeech tts] isNeedToEnable];
customCell.titleLabel.text = L(@"pref_tts_enable_title");
customCell.delegate = self;
}
else
{
cell = [tableView dequeueReusableCellWithIdentifier:[LinkCell className]];
LinkCell * customCell = (LinkCell *)cell;
customCell.titleLabel.text = L(@"pref_tts_language_title");
}
}
return cell;
}
@ -144,6 +162,13 @@ typedef NS_ENUM(NSUInteger, Section)
{
Settings::Set("CompassCalibrationEnabled", (bool)value);
}
else if (indexPath.section == SectionRouting)
{
[[MWMTextToSpeech tts] setNeedToEnable:value];
[[NSNotificationCenter defaultCenter] postNotificationName:kTTSStatusWasChangedNotification
object:nil
userInfo:@{@"on" : @(value)}];
}
}
Settings::Units unitsForIndex(NSInteger index)
@ -166,6 +191,8 @@ Settings::Units unitsForIndex(NSInteger index)
{
if (section == SectionMetrics)
return L(@"measurement_units");
else if (section == SectionRouting)
return L(@"prefs_group_route");
else
return nil;
}

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "آخر";
"pref_tts_how_to_set_up_voice" = "كيفية ضبط الصوت";
"placepage_distance" = "المسافة";
"placepage_coordinates" = "الإحداثيات";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Ostatní";
"pref_tts_how_to_set_up_voice" = "Jak nastavit hlas";
"placepage_distance" = "Vzdálenost";
"placepage_coordinates" = "Souřadnice";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Andet";
"pref_tts_how_to_set_up_voice" = "Sådan indstiller du tale";
"placepage_distance" = "Afstand";
"placepage_coordinates" = "Koordinater";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Weitere";
"pref_tts_how_to_set_up_voice" = "Navi-Stimme einstellen";
"placepage_distance" = "Distanz";
"placepage_coordinates" = "Koordinaten";

View file

@ -520,6 +520,11 @@
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Other";
"pref_tts_how_to_set_up_voice" = "How to set up voice";
"placepage_distance" = "Distance";
"placepage_coordinates" = "Coordinates";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Otros";
"pref_tts_how_to_set_up_voice" = "Cómo configurar la voz";
"placepage_distance" = "Distancia";
"placepage_coordinates" = "Coordenadas";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Egyéb";
"pref_tts_how_to_set_up_voice" = "Így állítsd be a hangot";
"placepage_distance" = "Etäisyys";
"placepage_coordinates" = "Koordinaatit";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Autre";
"pref_tts_how_to_set_up_voice" = "Comment configurer la voix";
"placepage_distance" = "Distance";
"placepage_coordinates" = "Coordonnées";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Egyéb";
"pref_tts_how_to_set_up_voice" = "Így állítsd be a hangot";
"placepage_distance" = "Távolság";
"placepage_coordinates" = "Koordináták";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Lainnya";
"pref_tts_how_to_set_up_voice" = "Cara mengatur suara";
"placepage_distance" = "Jarak";
"placepage_coordinates" = "Koordinat";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Altro";
"pref_tts_how_to_set_up_voice" = "Come impostare la voce";
"placepage_distance" = "Distanza";
"placepage_coordinates" = "Coordinate";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "その他";
"pref_tts_how_to_set_up_voice" = "音声設定の仕方";
"placepage_distance" = "距離";
"placepage_coordinates" = "コーディネート";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "다른 언어";
"pref_tts_how_to_set_up_voice" = "음성 설정 방법";
"placepage_distance" = "거리";
"placepage_coordinates" = "좌표";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Andre";
"pref_tts_how_to_set_up_voice" = "Slik installerer du stemme";
"placepage_distance" = "Avstand";
"placepage_coordinates" = "Koordinater";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Andere";
"pref_tts_how_to_set_up_voice" = "Hoe stel je de stem in";
"placepage_distance" = "Afstand";
"placepage_coordinates" = "Coördinaten";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Inny";
"pref_tts_how_to_set_up_voice" = "Jak skonfigurować usługę głosową";
"placepage_distance" = "Dystans";
"placepage_coordinates" = "Współrzędne";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Outro";
"pref_tts_how_to_set_up_voice" = "Como configurar a voz";
"placepage_distance" = "Distância";
"placepage_coordinates" = "Coordenadas";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Alta";
"pref_tts_how_to_set_up_voice" = "Modalitatea de configurare a vocii";
"placepage_distance" = "Distanță";
"placepage_coordinates" = "Coordonate";

View file

@ -520,6 +520,11 @@
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "Голосовые подсказки недоступны";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Другой";
"pref_tts_how_to_set_up_voice" = "Как настроить голос";
"placepage_distance" = "Расстояние";
"placepage_coordinates" = "Координаты";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Iný";
"pref_tts_how_to_set_up_voice" = "Ako nastaviť hlas";
"placepage_distance" = "Vzdialenosť";
"placepage_coordinates" = "Súradnice";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Övrigt";
"pref_tts_how_to_set_up_voice" = "Hur man ställer in ljud";
"placepage_distance" = "Avstånd";
"placepage_coordinates" = "Koordinater";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "อื่น ๆ";
"pref_tts_how_to_set_up_voice" = "วิธีตั้งค่าเสียง";
"placepage_distance" = "ระยะห่าง";
"placepage_coordinates" = "พิกัด";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Diğer";
"pref_tts_how_to_set_up_voice" = "Ses nasıl ayarlanır";
"placepage_distance" = "Mesafe";
"placepage_coordinates" = "Koordinatlar";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Інша";
"pref_tts_how_to_set_up_voice" = "Як налаштувати голосовий контроль";
"placepage_distance" = "Відстань";
"placepage_coordinates" = "Координати";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Khác";
"pref_tts_how_to_set_up_voice" = "Làm thế nào để thiết lập tiếng nói";
"placepage_distance" = "Khoảng cách";
"placepage_coordinates" = "Tọa độ";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "其他";
"pref_tts_how_to_set_up_voice" = "如何设置语音";
"placepage_distance" = "距离";
"placepage_coordinates" = "坐标";

View file

@ -508,6 +508,23 @@
/* «Map style» entry value */
"pref_map_style_modern_light" = "Modern light";
/* Settings «Route» category: «Tts enabled» title */
"pref_tts_enable_title" = "Voice instructions";
/* Settings «Route» category: «Tts enabled» summary */
"pref_tts_enable_summary" = "Turn instructions";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Voice language";
/* Settings «Route» category: «Tts unavailable» subtitle */
"pref_tts_unavailable" = "TTS unavailable";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "其他";
"pref_tts_how_to_set_up_voice" = "如何設置語音";
"placepage_distance" = "距离";
"placepage_coordinates" = "坐标";

View file

@ -13,37 +13,38 @@ namespace turns
{
namespace sound
{
array<string, 28> const kLanguageList =
array<pair<string, string>, 28> const kLanguageList =
{{
"ar",
"cs",
"da",
"de",
"el",
"en",
"es",
"fi",
"fr",
"hi",
"hr",
"hu",
"id",
"it",
"ja",
"ko",
"nl",
"pl",
"pt",
"ro",
"ru",
"sk",
"sv",
"sw",
"th",
"tr",
"zh-Hans",
"zh-Hant"
{"en", "English"},
{"ru", "Русский"},
{"es", "Español"},
{"de", "Deutsch"},
{"fr", "Français"},
{"zh-Hant", "中文繁體"},
{"zh-Hans", "中文简体"},
{"pt", "Português"},
{"th", "ภาษาไทย"},
{"tr", "Türkçe"},
{"ar", "العربية"},
{"cs", "Čeština"},
{"da", "Dansk"},
{"el", "Ελληνικά"},
{"fi", "Suomi"},
{"hi", "हिंदी"},
{"hr", "Hrvatski"},
{"hu", "Magyar"},
{"id", "Indonesia"},
{"it", "Italiano"},
{"ja", "日本語"},
{"ko", "한국어"},
{"nl", "Nederlands"},
{"pl", "Polski"},
{"ro", "Română"},
{"sk", "Slovenčina"},
{"sv", "Svenska"},
{"sw", "Kiswahili"}
}};
} // namespace sound
} // namespace turns
} // namespace routing

View file

@ -5248,6 +5248,67 @@
en = TTS unavailable
ru = Голосовые подсказки недоступны
[pref_tts_other_section_title]
tags = ios
comment = Title for "Other" section in TTS settings.
en = Other
ru = Другой
fr = Autre
da = Andet
id = Lainnya
ko = 다른 언어
sv = Övrigt
tr = Diğer
uk = Інша
vi = Khác
hu = Egyéb
de = Weitere
fi = Egyéb
cs = Ostatní
it = Altro
nb = Andre
zh-Hant = 其他
zh-Hans = 其他
th = อื่น ๆ
ja = その他
ro = Alta
ar = آخر
sk = Iný
es = Otros
pl = Inny
nl = Andere
pt = Outro
[pref_tts_how_to_set_up_voice]
tags = ios
en = How to set up voice
ru = Как настроить голос
fr = Comment configurer la voix
da = Sådan indstiller du tale
id = Cara mengatur suara
ko = 음성 설정 방법
sv = Hur man ställer in ljud
tr = Ses nasıl ayarlanır
uk = Як налаштувати голосовий контроль
vi = Làm thế nào để thiết lập tiếng nói
hu = Így állítsd be a hangot
de = Navi-Stimme einstellen
fi = Így állítsd be a hangot
cs = Jak nastavit hlas
it = Come impostare la voce
nb = Slik installerer du stemme
zh-Hant = 如何設置語音
zh-Hans = 如何设置语音
th = วิธีตั้งค่าเสียง
ja = 音声設定の仕方
ro = Modalitatea de configurare a vocii
ar = كيفية ضبط الصوت
sk = Ako nastaviť hlas
es = Cómo configurar la voz
pl = Jak skonfigurować usługę głosową
nl = Hoe stel je de stem in
pt = Como configurar a voz
[placepage_distance]
en = Distance
fr = Distance