Merge pull request #2889 from VladiMihaylenko/master

[omim] [ios] Building levels and zip code.
This commit is contained in:
igrechuhin 2016-04-14 16:29:21 +04:00
commit fb299aa763
36 changed files with 336 additions and 82 deletions

View file

@ -830,4 +830,8 @@
<string name="download_over_mobile_header">Загрузить через сотовую связь?</string>
<string name="download_over_mobile_message">На некоторых тарифных планах или в роуминге это может привести к значительным расходам.</string>
<string name="error_enter_correct_house_number">Введите корректный номер дома</string>
<string name="editor_storey_number">Количество этажей (максимум %1$s)</string>
<string name="error_enter_correct_storey_number">Редактируйте здания высотой максимум %1$s этажей.</string>
<string name="editor_zip_code">Почтовый индекс</string>
<string name="error_enter_correct_zip_code">Введите корректный почтовый индекс</string>
</resources>

View file

@ -834,4 +834,6 @@
<string name="download_over_mobile_header">Download by using a cellular network connection?</string>
<string name="download_over_mobile_message">This could be considerably expensive with some plans or if roaming.</string>
<string name="error_enter_correct_house_number">Enter correct house number</string>
<string name="editor_zip_code">ZIP Code</string>
<string name="error_enter_correct_zip_code">Enter correct ZIP Code</string>
</resources>

View file

@ -9,6 +9,9 @@
namespace osm
{
// static
int8_t const EditableMapObject::kMaximumLevelsEditableByUsers = 25;
bool EditableMapObject::IsNameEditable() const { return m_editableProperties.m_name; }
bool EditableMapObject::IsAddressEditable() const { return m_editableProperties.m_address; }
@ -185,12 +188,16 @@ void EditableMapObject::SetFlats(string const & flats)
m_metadata.Set(feature::Metadata::FMD_FLATS, flats);
}
// static
bool EditableMapObject::ValidateBuildingLevels(string const & buildingLevels)
{
uint64_t levels;
return strings::to_uint64(buildingLevels, levels) && levels <= kMaximumLevelsEditableByUsers;
}
void EditableMapObject::SetBuildingLevels(string const & buildingLevels)
{
auto constexpr kMaximumLevelsEditableByUsers = 50;
uint64_t levels;
if (strings::to_uint64(buildingLevels, levels) && levels <= kMaximumLevelsEditableByUsers)
m_metadata.Set(feature::Metadata::FMD_BUILDING_LEVELS, buildingLevels);
m_metadata.Set(feature::Metadata::FMD_BUILDING_LEVELS, buildingLevels);
}
LocalizedStreet const & EditableMapObject::GetStreet() const { return m_street; }

View file

@ -54,6 +54,8 @@ struct LocalizedStreet
class EditableMapObject : public MapObject
{
public:
static int8_t const kMaximumLevelsEditableByUsers;
bool IsNameEditable() const;
bool IsAddressEditable() const;
@ -93,6 +95,7 @@ public:
void SetElevation(double ele);
void SetWikipedia(string const & wikipedia);
void SetFlats(string const & flats);
static bool ValidateBuildingLevels(string const & buildingLevels);
void SetBuildingLevels(string const & buildingLevels);
/// @param[in] cuisine is a vector of osm cuisine ids.
void SetCuisines(vector<string> const & cuisine);

View file

@ -39,25 +39,15 @@ vector<MWMPlacePageCellType> const kSectionCategoryCellTypes{MWMPlacePageCellTyp
vector<MWMPlacePageCellType> const kSectionNameCellTypes{MWMPlacePageCellTypeName};
vector<MWMPlacePageCellType> const kSectionAddressCellTypes{
{MWMPlacePageCellTypeStreet, MWMPlacePageCellTypeBuilding}};
vector<MWMPlacePageCellType> const kSectionDetailsCellTypes{
{MWMPlacePageCellTypeOpenHours, MWMPlacePageCellTypePhoneNumber, MWMPlacePageCellTypeWebsite,
MWMPlacePageCellTypeEmail, MWMPlacePageCellTypeCuisine, MWMPlacePageCellTypeWiFi}};
using CellTypesSectionMap = pair<vector<MWMPlacePageCellType>, MWMEditorSection>;
vector<CellTypesSectionMap> const kCellTypesSectionMap{
{kSectionCategoryCellTypes, MWMEditorSectionCategory},
{kSectionNameCellTypes, MWMEditorSectionName},
{kSectionAddressCellTypes, MWMEditorSectionAddress},
{kSectionDetailsCellTypes, MWMEditorSectionDetails}};
MWMPlacePageCellTypeStreet, MWMPlacePageCellTypeBuilding, MWMPlacePageCellTypeZipCode};
MWMPlacePageCellTypeValueMap const kCellType2ReuseIdentifier{
{MWMPlacePageCellTypeCategory, "MWMEditorCategoryCell"},
{MWMPlacePageCellTypeName, "MWMEditorNameTableViewCell"},
{MWMPlacePageCellTypeStreet, "MWMEditorSelectTableViewCell"},
{MWMPlacePageCellTypeBuilding, "MWMEditorTextTableViewCell"},
{MWMPlacePageCellTypeZipCode, "MWMEditorTextTableViewCell"},
{MWMPlacePageCellTypeBuildingLevels, "MWMEditorTextTableViewCell"},
{MWMPlacePageCellTypeOpenHours, "MWMPlacePageOpeningHoursCell"},
{MWMPlacePageCellTypePhoneNumber, "MWMEditorTextTableViewCell"},
{MWMPlacePageCellTypeWebsite, "MWMEditorTextTableViewCell"},
@ -72,6 +62,57 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
ASSERT(haveCell, ());
return haveCell ? @(it->second.c_str()) : @"";
}
vector<MWMPlacePageCellType> cellsForProperties(vector<osm::Props> const & props)
{
using namespace osm;
vector<MWMPlacePageCellType> res;
for (auto const p : props)
{
switch (p)
{
case Props::OpeningHours:
res.push_back(MWMPlacePageCellTypeOpenHours);
break;
case Props::Phone:
res.push_back(MWMPlacePageCellTypePhoneNumber);
break;
case Props::Website:
res.push_back(MWMPlacePageCellTypeWebsite);
break;
case Props::Email:
res.push_back(MWMPlacePageCellTypeEmail);
break;
case Props::Cuisine:
res.push_back(MWMPlacePageCellTypeCuisine);
break;
case Props::Internet:
res.push_back(MWMPlacePageCellTypeWiFi);
break;
case Props::Wikipedia:
case Props::Fax:
case Props::Stars:
case Props::Operator:
case Props::Elevation:
case Props::Flats:
case Props::BuildingLevels:
break;
}
}
return res;
}
void registerCellsForTableView(vector<MWMPlacePageCellType> const & cells, UITableView * tv)
{
for (auto const c : cells)
{
NSString * identifier = reuseIdentifier(c);
if (UINib * nib = [UINib nibWithNibName:identifier bundle:nil])
[tv registerNib:nib forCellReuseIdentifier:identifier];
else
ASSERT(false, ("Incorrect cell"));
}
}
} // namespace
@interface MWMEditorViewController() <UITableViewDelegate, UITableViewDataSource,
@ -205,81 +246,60 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
return cell;
}
// TODO(Vlad): This code can be much better.
- (bool)hasField:(feature::Metadata::EType)field
{
auto const & editable = m_mapObject.GetEditableFields();
return editable.end() != find(editable.begin(), editable.end(), field);
}
// TODO(Vlad): This code can be much better.
- (bool)isEditable:(MWMPlacePageCellType)cellType
{
switch (cellType)
{
case MWMPlacePageCellTypePostcode: return [self hasField:feature::Metadata::FMD_POSTCODE];
case MWMPlacePageCellTypePhoneNumber: return [self hasField:feature::Metadata::FMD_PHONE_NUMBER];
case MWMPlacePageCellTypeWebsite: return [self hasField:feature::Metadata::FMD_WEBSITE];
// TODO(Vlad): We should not have URL field in the UI. Website should always be used instead.
case MWMPlacePageCellTypeURL: return [self hasField:feature::Metadata::FMD_URL];
case MWMPlacePageCellTypeEmail: return [self hasField:feature::Metadata::FMD_EMAIL];
case MWMPlacePageCellTypeOpenHours: return [self hasField:feature::Metadata::FMD_OPEN_HOURS];
case MWMPlacePageCellTypeWiFi: return [self hasField:feature::Metadata::FMD_INTERNET];
case MWMPlacePageCellTypeCuisine: return [self hasField:feature::Metadata::FMD_CUISINE];
// TODO(Vlad): return true when we allow coordinates editing.
case MWMPlacePageCellTypeCoordinate: return false;
case MWMPlacePageCellTypeName: return m_mapObject.IsNameEditable();
case MWMPlacePageCellTypeStreet: return m_mapObject.IsAddressEditable();
case MWMPlacePageCellTypeBuilding: return m_mapObject.IsAddressEditable();
case MWMPlacePageCellTypeCategory: return self.isCreating;
default: NSAssert(false, @"Invalid cell type %@", @(cellType)); return false;
}
}
- (void)configTable
{
self.offscreenCells = [NSMutableDictionary dictionary];
self.invalidCells = [NSMutableArray array];
m_sections.clear();
m_cells.clear();
for (auto const & cellsSection : kCellTypesSectionMap)
{
for (auto cellType : cellsSection.first)
{
if (![self isEditable:cellType])
continue;
m_sections.emplace_back(cellsSection.second);
m_cells[cellsSection.second].emplace_back(cellType);
NSString * identifier = reuseIdentifier(cellType);
if (UINib * nib = [UINib nibWithNibName:identifier bundle:nil])
[self.tableView registerNib:nib forCellReuseIdentifier:identifier];
else
NSAssert(false, @"Incorrect cell");
if (self.isCreating)
{
m_sections.push_back(MWMEditorSectionCategory);
m_cells[MWMEditorSectionCategory] = kSectionCategoryCellTypes;
registerCellsForTableView(kSectionCategoryCellTypes, self.tableView);
}
if (m_mapObject.IsNameEditable())
{
m_sections.push_back(MWMEditorSectionName);
m_cells[MWMEditorSectionName] = kSectionNameCellTypes;
registerCellsForTableView(kSectionNameCellTypes, self.tableView);
}
if (m_mapObject.IsAddressEditable())
{
m_sections.push_back(MWMEditorSectionAddress);
m_cells[MWMEditorSectionAddress] = kSectionAddressCellTypes;
if (m_mapObject.IsBuilding())
m_cells[MWMEditorSectionAddress].push_back(MWMPlacePageCellTypeBuildingLevels);
registerCellsForTableView(kSectionAddressCellTypes, self.tableView);
}
if (!m_mapObject.GetEditableProperties().empty())
{
auto const cells = cellsForProperties(m_mapObject.GetEditableProperties());
if (!cells.empty())
{
m_sections.push_back(MWMEditorSectionDetails);
m_cells[MWMEditorSectionDetails] = cells;
registerCellsForTableView(cells, self.tableView);
}
}
sort(m_sections.begin(), m_sections.end());
m_sections.erase(unique(m_sections.begin(), m_sections.end()), m_sections.end());
}
- (MWMPlacePageCellType)cellTypeForIndexPath:(NSIndexPath *)indexPath
{
MWMEditorSection const section = m_sections[indexPath.section];
MWMPlacePageCellType const cellType = m_cells[section][indexPath.row];
return cellType;
return m_cells[m_sections[indexPath.section]][indexPath.row];
}
- (NSString *)cellIdentifierForIndexPath:(NSIndexPath *)indexPath
{
MWMPlacePageCellType const cellType = [self cellTypeForIndexPath:indexPath];
return reuseIdentifier(cellType);
return reuseIdentifier([self cellTypeForIndexPath:indexPath]);
}
#pragma mark - Fill cells with data
- (void)fillCell:(UITableViewCell * _Nonnull)cell atIndexPath:(NSIndexPath * _Nonnull)indexPath
{
MWMPlacePageCellType const cellType = [self cellTypeForIndexPath:indexPath];
switch (cellType)
BOOL const isValid = ![self.invalidCells containsObject:indexPath];
switch ([self cellTypeForIndexPath:indexPath])
{
case MWMPlacePageCellTypeCategory:
{
@ -361,10 +381,38 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
text:@(m_mapObject.GetHouseNumber().c_str())
placeholder:L(@"house_number")
errorMessage:L(@"error_enter_correct_house_number")
isValid:![self.invalidCells containsObject:indexPath]
isValid:isValid
keyboardType:UIKeyboardTypeDefault];
break;
}
case MWMPlacePageCellTypeZipCode:
{
MWMEditorTextTableViewCell * tCell = static_cast<MWMEditorTextTableViewCell *>(cell);
[tCell configWithDelegate:self
icon:nil
text:@(m_mapObject.GetPostcode().c_str())
placeholder:L(@"editor_zip_code")
errorMessage:L(@"error_enter_correct_zip_code")
isValid:isValid
keyboardType:UIKeyboardTypeDefault];
break;
}
case MWMPlacePageCellTypeBuildingLevels:
{
NSString * placeholder = [NSString stringWithFormat:L(@"editor_storey_number"),
osm::EditableMapObject::kMaximumLevelsEditableByUsers];
NSString * errorMessage = [NSString stringWithFormat:L(@"error_enter_correct_storey_number"),
osm::EditableMapObject::kMaximumLevelsEditableByUsers];
MWMEditorTextTableViewCell * tCell = static_cast<MWMEditorTextTableViewCell *>(cell);
[tCell configWithDelegate:self
icon:nil
text:@(m_mapObject.GetBuildingLevels().c_str())
placeholder:placeholder
errorMessage:errorMessage
isValid:isValid
keyboardType:UIKeyboardTypeNumberPad];
break;
}
case MWMPlacePageCellTypeCuisine:
{
MWMEditorSelectTableViewCell * tCell = (MWMEditorSelectTableViewCell *)cell;
@ -385,7 +433,9 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
- (UITableViewCell * _Nonnull)tableView:(UITableView * _Nonnull)tableView cellForRowAtIndexPath:(NSIndexPath * _Nonnull)indexPath
{
NSString * reuseIdentifier = [self cellIdentifierForIndexPath:indexPath];
return [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
[self fillCell:cell atIndexPath:indexPath];
return cell;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView * _Nonnull)tableView
@ -395,8 +445,7 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
- (NSInteger)tableView:(UITableView * _Nonnull)tableView numberOfRowsInSection:(NSInteger)section
{
MWMEditorSection const sec = m_sections[section];
return m_cells[sec].size();
return m_cells[m_sections[section]].size();
}
#pragma mark - UITableViewDelegate
@ -404,6 +453,7 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
- (CGFloat)tableView:(UITableView * _Nonnull)tableView heightForRowAtIndexPath:(NSIndexPath * _Nonnull)indexPath
{
NSString * reuseIdentifier = [self cellIdentifierForIndexPath:indexPath];
UITableViewCell * cell = [self offscreenCellForIdentifier:reuseIdentifier];
// TODO(Vlad, IGrechuhin): It's bad idea to fill cells here.
// heightForRowAtIndexPath is called way too often for the table.
@ -428,11 +478,6 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
}
}
- (void)tableView:(UITableView * _Nonnull)tableView willDisplayCell:(UITableViewCell * _Nonnull)cell forRowAtIndexPath:(NSIndexPath * _Nonnull)indexPath
{
[self fillCell:cell atIndexPath:indexPath];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch (m_sections[section])
@ -525,6 +570,15 @@ NSString * reuseIdentifier(MWMPlacePageCellType cellType)
if (!osm::EditableMapObject::ValidateHouseNumber(val))
[self markCellAsInvalid:indexPath];
break;
case MWMPlacePageCellTypeZipCode:
m_mapObject.SetPostcode(val);
// TODO: Validate postcode.
break;
case MWMPlacePageCellTypeBuildingLevels:
m_mapObject.SetBuildingLevels(val);
if (!osm::EditableMapObject::ValidateBuildingLevels(val))
[self markCellAsInvalid:indexPath];
break;
default: NSAssert(false, @"Invalid field for changeText");
}
}

View file

@ -105,7 +105,7 @@ namespace
return c.m_name == category;
});
NSAssert(it != all.end(), @"Incorrect category!");
self.selectedIndexPath = [NSIndexPath indexPathForRow:(it - all.begin())
self.selectedIndexPath = [NSIndexPath indexPathForRow:(distance(all.begin(), it))
inSection:m_categories.m_lastUsed.empty() ? 0 : 1];
}

View file

@ -59,7 +59,7 @@ namespace
}
else
{
self.selectedStreet = it - m_streets.begin();
self.selectedStreet = distance(m_streets.begin(), it);
}
}
else

View file

@ -20,6 +20,8 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageCellType)
MWMPlacePageCellTypeName,
MWMPlacePageCellTypeStreet,
MWMPlacePageCellTypeBuilding,
MWMPlacePageCellTypeZipCode,
MWMPlacePageCellTypeBuildingLevels,
MWMPlacePageCellTypeCuisine,
MWMPlacePageCellTypeCount
};

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "قد يكون هذا مكلفا جدا لبعض الخطط أو عند التجوال.";
"error_enter_correct_house_number" = "أدخل رقم منزل صحيح";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Toto by mohli být s některými tarify nebo roamingem výrazně dražší.";
"error_enter_correct_house_number" = "Zadejte správné číslo domu";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "This could be considerably expensive with some plans or if roaming.";
"error_enter_correct_house_number" = "Skriv det rigtige husnummer";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Das könnte mit einigen Tarifen oder beim Roaming sehr teuer werden.";
"error_enter_correct_house_number" = "Richtige Hausnummer eingeben";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "This could be considerably expensive with some plans or if roaming.";
"error_enter_correct_house_number" = "Enter correct house number";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Podría ser muy caro con ciertos planes o con itinerancia de datos.";
"error_enter_correct_house_number" = "Introducir el número de domicilio correcto";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Tämä vaihtoehto saattaa olla huomattavasti kalliimpi tietyillä sopimuksilla tai roaming-yhteydellä.";
"error_enter_correct_house_number" = "Syötä oikea talon numero";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Cela pourrait être très cher avec certains abonnements ou si vous êtes en déplacement.";
"error_enter_correct_house_number" = "Saisir un numéro de maison correct";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Ez jelentősen drága lehet némely előfizetés vagy roaming keretein belül.";
"error_enter_correct_house_number" = "Helyes házszámot adjon meg";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Ini bisa menjadi jauh mahal pada beberapa paket atau jika roaming.";
"error_enter_correct_house_number" = "Masukkan nomor rumah yang benar";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Quest'operazione potrebbe essere piuttosto costosa con alcuni piani o in roaming.";
"error_enter_correct_house_number" = "Inserisci numero civico corretto";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "プランによって、またはローミングしている場合、非常に高額になる可能性があります。";
"error_enter_correct_house_number" = "正しい番地を入力してください";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "이는 일부 플랜이나 로밍할 경우에 비싸다고 간주될 수 있습니다.";
"error_enter_correct_house_number" = "올바른 집 번호 입력";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "This could be considerably expensive with some plans or if roaming.";
"error_enter_correct_house_number" = "Skriv riktig husnummer";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Met sommige abonnementen of bij roaming kan dit behoorlijk duur zijn.";
"error_enter_correct_house_number" = "Een juist huisnummer invoeren";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Może to być kosztowne przy niektórych planach taryfowych lub w roamingu.";
"error_enter_correct_house_number" = "Wprowadź poprawny numer domu";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Isto pode ser significativamente caro, com alguns planos ou se roaming.";
"error_enter_correct_house_number" = "Introduzir um número de casa correto";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Aceasta poate fi destul de costisitoare în cazul unor abonamente sau dacă sunteți pe roaming.";
"error_enter_correct_house_number" = "Introduceți numărul corect al casei";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,11 @@
"download_over_mobile_message" = "На некоторых тарифных планах или в роуминге это может привести к значительным расходам.";
"error_enter_correct_house_number" = "Введите корректный номер дома";
"editor_storey_number" = "Количество этажей (максимум %1$@)";
"error_enter_correct_storey_number" = "Редактируйте здания высотой максимум %1$@ этажей.";
"editor_zip_code" = "Почтовый индекс";
"error_enter_correct_zip_code" = "Введите корректный почтовый индекс";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "V prípade niektorých plánov alebo použitím roamingu by to mohlo byť značne nákladné.";
"error_enter_correct_house_number" = "Zadajte správne číslo domu";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Detta kan vara mycket dyrt med vissa abonnemang och vid roaming.";
"error_enter_correct_house_number" = "Ange korrekt husnummer";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "มันอาจมีราคาสูงมากหากใช้แผนโทรศัพท์บางประเภทหรือหากทำการโรมมิ่ง";
"error_enter_correct_house_number" = "กรอกบ้านเลขที่ให้ถูกต้อง";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Bu işlem bazı planlarla ya da dolaşım ise büyük ölçüde pahalı olabilir.";
"error_enter_correct_house_number" = "Doğru ev numarası girin";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Це може бути задорого за деякими планами або за умовами роумінгу.";
"error_enter_correct_house_number" = "Введіть правильний номер будинку";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "Như vậy sẽ rất đắt tiền với một số gói dữ liệu hoặc khi chuyển vùng.";
"error_enter_correct_house_number" = "Nhập số nhà chính xác";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "用一些方案或漫游的话这可能相当昂贵。";
"error_enter_correct_house_number" = "输入正确的房屋号";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -1373,3 +1373,9 @@
"download_over_mobile_message" = "用某些方案或漫遊的話這可能相當昂貴。";
"error_enter_correct_house_number" = "輸入正確的門牌號碼";
"editor_zip_code" = "ZIP Code";
"error_enter_correct_zip_code" = "Enter correct ZIP Code";

View file

@ -16236,3 +16236,21 @@
pl = Wprowadź poprawny numer domu
nl = Een juist huisnummer invoeren
pt = Introduzir um número de casa correto
[editor_storey_number]
tags = ios, android
ru = Количество этажей (максимум %1$@)
[error_enter_correct_storey_number]
tags = ios, android
ru = Редактируйте здания высотой максимум %1$@ этажей.
[editor_zip_code]
tags = ios, android
en = ZIP Code
ru = Почтовый индекс
[error_enter_correct_zip_code]
tags = ios, android
en = Enter correct ZIP Code
ru = Введите корректный почтовый индекс