Перейти к содержанию

Рекомендуемые сообщения

Добрый вечер. Вопрос не совсем про стандартный функционал Опенкарта, но может здешние коллеги смогут помочь...

Нужно сделать "переводчик" названий товара исходя из содержимого массива. Есть большой массив с переводами... Вот для примера маленькая часть его, чтобы было понятно:

$lang_ar['en']['часы'] = 'watches';
$lang_ar['zh']['часы'] = '时钟';
$lang_ar['en']['часы наручные'] = 'Wrist watch';
$lang_ar['zh']['часы наручные'] = '手表';
$lang_ar['en']['наручные часы'] = 'Wrist watch';
$lang_ar['zh']['наручные часы'] = '手表';
$lang_ar['en']['золото 585'] = '14K Gold';
$lang_ar['zh']['золото 585'] = '14K金';
$lang_ar['en']['золото 750'] = '18K gold';
$lang_ar['zh']['золото 750'] = '18K金';
$lang_ar['en']['серебро 925'] = 'Sterling silver';
$lang_ar['zh']['серебро 925'] = '标准纯银';
$lang_ar['en']['платина'] = 'Platinum';
$lang_ar['zh']['платина'] = '铂金';
$lang_ar['en']['титан'] = 'Titanium';
$lang_ar['zh']['титан'] = '钛';

 

Алгоритм работы должен быть такой. Берется название товара -> прогоняется по массиву для перевода -> делается транслитерация с китайского на латиницу -> профит. Использовать для этой цели всякие API гугл-переводчиков - нельзя. Только эти массивы. С транслитерацией и чем либо еще не возникает проблем. Проблемы возникают с переводом.

 

Есть название товара: 

Часы наручные "Petroff" серебро 925* 21,80гр.

Очевидно, что в массиве нету полного названия товара, поэтому название товара надо будет разбивать по кускам и искать совпадения. Причем нужно еще учесть, что фразы могут встречаться как одним словов, так и фразами целиком. Я предполагаю такой вариант действий, но сдаётся мне, что это извращение:

Скрипт ищет самую большу часть, то есть всё название товара:
Часы наручные "Petroff" серебро 925* 21,80гр



Далее он должен обрезать часть фразы до первого пробела, предположим, что обрезать будем с конца. Тогда получается:
Часы наручные "Petroff" серебро 925*
Часы наручные "Petroff" серебро
Часы наручные "Petroff"
Часы наручные  

Тут нашли совпадение "Часы наручные". Эту часть переводим и вырезаем из сходной строки. Ищем по новой, но строка уже такая:



 "Petroff" серебро 925* 21,80гр
 "Petroff" серебро 925*
 "Petroff" серебро
 "Petroff"

Хотя даже такое извращение не выходит по-человечески написать... 6-ой час уже сижу и 3-ий раз всё переписываю. Может кто подскажет более изящное решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жесть)) Если делать перебором по массиву, то фразу "Часы пацанские" сначала найдет -  $lang_ar['en']['часы'] = 'watches'; и переименует в watches, а вот "часы наручные" уже не найдет ;) Т.к. будет watches наручные) Можно конечно использовать полное соответствие, но это чесн говоря жестко как-то))

 

18 минут назад, ImLucky сказал:

Использовать для этой цели всякие API гугл-переводчиков - нельзя.

 

Ну можно использовать переводчик гугла и без API ;) 

К примеру https://translate.google.ru/#ru/en/Вася через парс можно взять перевод ;) Где Вася - ваше название товара) 

Изменено пользователем Leingard

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 minutes ago, Leingard said:

Жесть)) Если делать перебором по массиву, то фразу "Часы пацанские" сначала найдет -  $lang_ar['en']['часы'] = 'watches'; и переименует в watches, а вот "часы наручные" уже не найдет ;) Т.к. будет watches наручные)

 

Ну можно использовать переводчик гугла и без API ;) 

К примеру https://translate.google.ru/#ru/en/Вася через парс можно взять перевод ;) Где Вася - ваше название товара) 

 

Да в том и дело, что нельзя никакими переводчиками пользоваться, кроме этого массива. Потому что там вроде как все эти переводы вручную вписывались и вылизывались. Онлайн-переводу не доверяют. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
foreach ($lang_ar as $code=>$langauge) {

ksort($language);
str_replace(array_key($languge), $languge, $mytext)

}

Не проверял

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 minutes ago, chukcha said:

foreach ($lang_ar as $code=>$langauge) {

ksort($language);
str_replace(array_key($languge), $languge, $mytext)

}

Не проверял

 

Спасибо за отклик, но к сожалению не совсем понимаю как это должно работать и почему именно так.

 

$lang_ar['zh']['настольные часы'] = '桌钟';
$lang_ar['en']['колье'] = 'necklace';
$lang_ar['zh']['колье'] = '项链';
$lang_ar['en']['украшение'] = 'decoration';
$lang_ar['zh']['украшение'] = '装饰';
$lang_ar['en']['золотые часы'] = 'golden watch';
$lang_ar['zh']['золотые часы'] = '黄金紫金手表';




$iclang->lang_ar = $lang_ar;


if($_GET['product'] == "all")
{
	$products_id = $db->query("SELECT `product_id` FROM `oc_product` WHERE 1");
	$count_products = count((array)$products_id->rows); //Сколько всего продуктов
	for ($i = 0; $count_products > $i; $i++)  //Перебираем продукты
	{	
		$product_id = $products_id->rows[$i]['product_id']; //Текущий ID продукта
		$product = $db->query("SELECT `product_id`,`name`, `language_id`  FROM `oc_product_description` WHERE `product_id`=".$product_id); //Получаем языки в названии проукта
		$product_name = $product->rows[0]['name']; // Русское название
		if($product->rows[1]['name'] == '' or $product->rows[1]['name'] == NULL) 
		{	
			//Английский перевод отсутствует			
		}

		if($product->rows[2]['name'] == '' or $product->rows[2]['name'] == NULL)
		{	
			//Китайский перевод отсутствует			
		}
	}
}

 

Как мне ваш вариант приспособить к своим реалиям? 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага, сейчас я буду делать за вас..

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я за меня делать не прошу, но и кость собаке тоже кидать не надо. 

Если бы решалось двумя строчками, как вы написали, то я и не спрашивал бы совета. 

А так получается "сумничали", под предлогом "не проверял" и получается как раз из мультика "и так сойдет".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Умничать? В каком виде?
Вы показали ТЗ в упрощенном варианте
Я показал алгоритм, а не решение, в упрощенном варианте

 

Далее вы даете живой код, и хотите чтоб вам показали это на живом коде..

Вы разберите  мой код и внедрите его в живой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 minutes ago, chukcha said:

Я показал алгоритм, а не решение, в упрощенном варианте

Опять же, я и не прошу решения, а наоборот - я сказал, что я не понимаю почему именно так, с вашей точки зрения, нужно решать эту задачу. Прямо не попросил подсказать, но из предложения вроде уже очевидно, что если вы подсказали решение, то можно его и объяснить. Если лень, гордость берет, денег хотите, то так и скажите. Но ради бога, только не говорите что я хочу халявы. "Живой код" - как вы сказали, я привел лишь потому, что мне показалось что вы сами не понимаете что за всем этим стоит и что так просто это не решится.  По крайней мере в контексте моего примера.

Изменено пользователем ImLucky

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я посмотрел на живой код, и как раз он и решается приведенным  алгоритмом

 

А что там  объяснять?

Там все написано..

То что у вас и живой код кривой, то ладно...

А решение простое - сортировка и замена

Скорей всего нужен не ksort(), а krsort (но это не важно)
 

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 minutes ago, chukcha said:

Я посмотрел на живой код, и как раз он и решается приведенным  алгоритмом

 

А что там  объяснять?

Там все написано..

То что у вас и живой код кривой, то ладно...

А решение простое - сортировка и замена

Скорей всего нужен не ksort(), а krsort (но это не важно)
 

 

Кривой, не спорю, потому что без сна уже часов 30 из которых 8 на эту задачу уходило. Много чего было сделано до этого, а тут силенок уже не хватает. Надо отдыхать видимо. Утро-вечера мудренее. Но это.. всё равно, будьте попроще) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
On 30.01.2018 at 8:18 PM, chukcha said:

foreach ($lang_ar as $code=>$langauge) {

ksort($language);
str_replace(array_key($languge), $languge, $mytext)

}

Не проверял

Спасибо, был не прав, вариант рабочий. Отложил эту задачу до лучших времен, отдохнул, потом взялся по новой, на свежую голову, и всё понял. По вашему примеру получилось буквально "сходу", вместо тех костылей, что я делал до этого и как описывал в первом посте. Малость не совсем так, как вы написали, но подход именно такой. Напишите в личку куда, в знак признательности,  отправить "на пиво". 

Изменено пользователем ImLucky

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, ImLucky сказал:

Напишите в личку куда, в знак признательности,  отправить "на пиво".

Купите девушке щоколадку..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.