Jump to content

Recommended Posts

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

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

$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-ий раз всё переписываю. Может кто подскажет более изящное решение?

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

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

Edited by Leingard

Share this post


Link to post
Share on other sites
2 minutes ago, Leingard said:

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
foreach ($lang_ar as $code=>$langauge) {

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

}

Не проверял

  • +1 1

Share this post


Link to post
Share on other sites
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)
		{	
			//Китайский перевод отсутствует			
		}
	}
}

 

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites
8 minutes ago, chukcha said:

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

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

Edited by ImLucky

Share this post


Link to post
Share on other sites

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

 

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

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

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

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

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

  • +1 1

Share this post


Link to post
Share on other sites
12 minutes ago, chukcha said:

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

 

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites
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)

}

Не проверял

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

Edited by ImLucky

Share this post


Link to post
Share on other sites
9 минут назад, ImLucky сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.