Skip to content

Commit

Permalink
add in page edit capability through translation manager and config fo…
Browse files Browse the repository at this point in the history
…r missing key logging using sparse lottery.

Fix search to include missing key,locale combinations when the query matches a key.
  • Loading branch information
vsch committed Mar 22, 2015
1 parent 2d76c9a commit fc84813
Show file tree
Hide file tree
Showing 5 changed files with 275 additions and 170 deletions.
312 changes: 163 additions & 149 deletions scripts/translations-manager.sql
Original file line number Diff line number Diff line change
@@ -1,201 +1,215 @@
DROP FUNCTION IF EXISTS CAPITAL;
DROP FUNCTION IF EXISTS CAPITAL
;

CREATE FUNCTION CAPITAL(input VARCHAR(1024))
RETURNS VARCHAR(1024)
DETERMINISTIC
BEGIN
DECLARE len INT;
DECLARE i INT;

SET len = CHAR_LENGTH(input);
SET input = LOWER(input);
SET i = 0;
SET input = CONCAT(LEFT(input, i), UPPER(MID(input, i + 1, 1)), right(input, len - i - 1));
SET i = i + 1;
DECLARE len INT
;

DECLARE i INT
;

SET len = CHAR_LENGTH(input)
;

SET input = LOWER(input)
;

SET i = 0
;

SET input = CONCAT(LEFT(input, i), UPPER(MID(input, i + 1, 1)), right(input, len - i - 1))
;

SET i = i + 1
;

WHILE (i < len) DO
SET i = LOCATE(' ', input, i);
SET i = LOCATE(' ', input, i)
;

IF i = 0 OR i = len
THEN
SET i = len;
SET i = len
;
ELSE
SET input = CONCAT(LEFT(input, i), UPPER(MID(input, i + 1, 1)), right(input, len - i - 1));
SET i = i + 1;
END IF;
END WHILE;
SET input = CONCAT(LEFT(input, i), UPPER(MID(input, i + 1, 1)), right(input, len - i - 1))
;

RETURN input;
END;
SET i = i + 1
;
END IF
;

END WHILE
;

RETURN input
;

END
;

CREATE OR REPLACE VIEW en_translations AS
SELECT *
FROM ltm_translations
WHERE locale = 'en';
WHERE locale = 'en'
;

CREATE OR REPLACE VIEW ru_translations AS
SELECT *
FROM ltm_translations
WHERE locale = 'ru';
WHERE locale = 'ru'
;


CREATE OR REPLACE VIEW missing_translations AS
SELECT
ru.id,
ru.group,
ru.key,
ru.value ru_value,
en.value en_value
SELECT ru.id, ru.group, ru.key, ru.value ru_value, en.value en_value
FROM ru_translations ru
JOIN en_translations en
ON ru.`group` = en.`group` AND ru.`key` = en.`key`
WHERE 1 = 1
AND ru.value is null or ru.value = en.value
AND concat(en.`group`, '.', en.`key`) NOT IN ('messages.lang_en', 'messages.lang_ru', 'messages.use-site');
AND ru.value IS NULL OR ru.value = en.value
AND concat(en.`group`, '.', en.`key`) NOT IN ('messages.lang_en', 'messages.lang_ru', 'messages.use-site')
;

SELECT *
FROM missing_translations;
FROM missing_translations
;


CREATE OR REPLACE VIEW have_translations AS
SELECT
ru.id,
ru.group,
ru.key,
ru.value ru_value,
en.value en_value
SELECT ru.id, ru.group, ru.key, ru.value ru_value, en.value en_value
FROM ru_translations ru
JOIN en_translations en
ON ru.`group` = en.`group` AND ru.`key` = en.`key`
WHERE 1 = 1
AND ru.value is not null and ru.value <> en.value
AND concat(en.`group`, '.', en.`key`) NOT IN ('messages.lang_en', 'messages.lang_ru', 'messages.use-site');
AND ru.value IS NOT NULL AND ru.value <> en.value
AND concat(en.`group`, '.', en.`key`) NOT IN ('messages.lang_en', 'messages.lang_ru', 'messages.use-site')
;

SELECT *
FROM have_translations;
FROM have_translations
;

DROP TEMPORARY TABLE IF EXISTS ru_missing_translations
;

DROP TEMPORARY TABLE IF EXISTS ru_missing_translations;
CREATE TEMPORARY TABLE ru_missing_translations
AS SELECT *
FROM missing_translations;
FROM missing_translations
;

DROP TEMPORARY TABLE IF EXISTS ru_have_translations
;

DROP TEMPORARY TABLE IF EXISTS ru_have_translations;
CREATE TEMPORARY TABLE ru_have_translations
AS SELECT *
FROM have_translations;
FROM have_translations
;

SELECT *
FROM ru_missing_translations;
FROM ru_missing_translations
;

SELECT *
FROM ru_have_translations;
FROM ru_have_translations
;


select *
from ru_missing_translations rm JOIN ru_have_translations rh on rm.key = rh.key;# and rm.en_value = rh.en_value;


# SELECT *
# FROM ltm_translations lt JOIN on lt.id = st.id;

/* select all missing translations that have a pretty good match somewhere else*/
SELECT
st.id,
st.ru_value,
st.en_value,
ht.en_value,
ht.ru_value
FROM
ru_missing_translations st JOIN ru_have_translations ht
ON st.en_value LIKE BINARY ht.en_value
ORDER BY st.id;

/* update all missing translations that have a pretty good match somewhere else*/
UPDATE ltm_translations lt
JOIN (
SELECT
st.id,
ht.ru_value
FROM
ru_missing_translations st JOIN ru_have_translations ht
ON st.en_value LIKE BINARY ht.en_value
) tr ON tr.id = lt.id
SET lt.value = tr.ru_value, lt.status = 1;

/* select all missing translations that have a descent match somewhere else*/
SELECT
st.id,
st.ru_value,
st.en_value,
ht.en_value ht_en_value,
CAPITAL(ht.ru_value) ht_ru_value
FROM
ru_missing_translations st JOIN ru_have_translations ht
ON /*st.key = ht.key AND*/ st.en_value LIKE BINARY CAPITAL(ht.en_value)
ORDER BY st.id;

/* update all missing translations that have a pretty good match somewhere else*/
UPDATE ltm_translations lt
JOIN (
SELECT
st.id,
ht.ru_value
FROM
ru_missing_translations st JOIN ru_have_translations ht
ON /*st.key = ht.key AND*/ st.en_value LIKE BINARY CAPITAL(ht.en_value)
) tr ON tr.id = lt.id
SET lt.value = CAPITAL(tr.ru_value), lt.status = 1;

SELECT
st.id,
st.ru_value,
st.en_value,
ht.en_value ht_en_value,
CAPITAL(ht.ru_value) ht_ru_value
SELECT *
FROM ru_missing_translations rm JOIN ru_have_translations rh ON rm.key = rh.key
;

# and rm.en_value = rh.en_value;


SELECT mt.locale, mt.`group`, mt.`key`, mt.value, ht.value
FROM (SELECT ht.`group`, ht.locale, ht.`key`, ht.value
FROM
(SELECT DISTINCT ht.`key`, ht.locale
FROM ltm_translations ht WHERE `group` = 'page-titles') kt
JOIN ltm_translations ht
ON ht.`group` = 'messages' AND kt.`key` = ht.`key` AND kt.locale = ht.locale) ht
LEFT OUTER JOIN ltm_translations mt
ON mt.`group` = ht.`group` AND mt.`key` = ht.`key` AND mt.locale = ht.locale
;

##
# get missing keys
SET @group = 'page-titles'
;

#list missing translations that are in messages.
SELECT kt.`group`, kt.locale, kt.`key`, ht.value
FROM
ru_missing_translations st JOIN ru_have_translations ht
ON st.key = ht.key AND st.en_value LIKE CONCAT('%',ht.en_value,'%')
ORDER BY st.id;

/* update all missing translations that have a pretty good match somewhere else, ignoring case*/
UPDATE ltm_translations lt
JOIN (
SELECT
st.id,
ht.ru_value
(SELECT kt.`key`, lt.locale, @group `group`
FROM
(SELECT DISTINCT ht.`key`
FROM ltm_translations ht WHERE `group` LIKE BINARY @group) kt
CROSS JOIN (SELECT DISTINCT ht.locale
FROM ltm_translations ht WHERE `group` LIKE BINARY @group) lt) kt
LEFT JOIN ltm_translations ht
ON ht.`group` = 'messages' AND kt.`key` = ht.`key` AND kt.locale = ht.locale
WHERE NOT exists(SELECT *
FROM ltm_translations lt WHERE lt.locale = kt.locale AND lt.`group` LIKE BINARY kt.`group` AND lt.`key` = kt.`key`)
;

# copy ones that exist
UPDATE
ltm_translations mt JOIN ltm_translations ht
ON mt.`group` = 'page-titles' AND ht.`group` = 'messages' AND mt.`key` = ht.`key` AND mt.locale = ht.locale
SET
mt.value = ht.value,
mt.status = 1
WHERE mt.value IS NULL
;

# now insert missing ones
INSERT INTO ltm_translations
(
SELECT NULL, 1 status, ht.locale, @group `group`, ht.`key`, ht.value, ht.created_at, ht.updated_at, ht.source, NULL saved_value
FROM
(SELECT kt.`key`, lt.locale, @group `group`
FROM
ru_missing_translations st JOIN ru_have_translations ht
ON st.key = ht.key AND st.en_value LIKE CONCAT('%',ht.en_value,'%')
) tr ON tr.id = lt.id
SET lt.value = CAPITAL(tr.ru_value), lt.status = 1;

DROP TEMPORARY TABLE IF EXISTS ru_missing_translations;
CREATE TEMPORARY TABLE ru_same_translations
AS SELECT *
FROM missing_translations;

DROP TEMPORARY TABLE IF EXISTS ru_have_translations;
CREATE TEMPORARY TABLE ru_have_translations
AS SELECT *
FROM have_translations;

(SELECT DISTINCT ht.`key`
FROM ltm_translations ht WHERE `group` LIKE BINARY @group) kt
CROSS JOIN (SELECT DISTINCT ht.locale
FROM ltm_translations ht WHERE `group` LIKE BINARY @group) lt) kt
LEFT JOIN ltm_translations ht
ON ht.`group` = 'messages' AND kt.`key` = ht.`key` AND kt.locale = ht.locale
WHERE ht.`key` IS NOT NULL AND ht.locale IS NOT NULL
AND NOT exists(SELECT *
FROM ltm_translations lt WHERE lt.locale = kt.locale AND lt.`group` LIKE BINARY kt.`group` AND lt.`key` = kt.`key`)
)
;


# search query that fills in missing locale,key combinations for a group
SELECT *
FROM ru_missing_translations;

SELECT lt.* from ltm_translations lt
JOIN ru_missing_translations st ON st.id = lt.id;

# finally, set the translations that are the same to NULL so they show up as missing
UPDATE ltm_translations lt
JOIN ru_missing_translations st ON st.id = lt.id
SET lt.value = NULL, lt.status = 1;


COMMIT;


#select * from ltm_translations WHERE value = 'Адрес Электронной Почты';
#update ltm_translations set value = 'е-майл', status = 1 where value = 'Адрес Электронной Почты';

# select * from ltm_translations where value = 'е-майл' and `key` <> 'email';
# update ltm_translations set value = NULL, status = 1 where value = 'е-майл' and `key` <> 'email';
FROM ltm_translations rt
WHERE `key` LIKE '%for-beta%' or value like '%for-beta%'
UNION ALL
SELECT NULL id, 0 status, lt.locale, kt.`group`, kt.`key`, NULL value, NULL created_at, NULL updated_at, NULL source, NULL saved_value
FROM (SELECT DISTINCT locale
FROM ltm_translations) lt
CROSS JOIN (SELECT DISTINCT `key`, `group`
FROM ltm_translations) kt
WHERE NOT exists(SELECT *
FROM ltm_translations tr WHERE tr.`key` = kt.`key` AND tr.`group` = kt.`group` AND tr.locale = lt.locale)
AND `key` LIKE '%for-beta%'
;

# insert missing keys for other locales to reduce hit on the database for missing keys
INSERT into ltm_translations
SELECT NULL id, 0 status, lt.locale, kt.`group`, kt.`key`, NULL value, NULL created_at, NULL updated_at, NULL source, NULL saved_value
FROM (SELECT DISTINCT locale
FROM ltm_translations) lt
CROSS JOIN (SELECT DISTINCT `key`, `group`
FROM ltm_translations) kt
WHERE NOT exists(SELECT * FROM ltm_translations tr WHERE tr.`key` = kt.`key` AND tr.`group` = kt.`group` AND tr.locale = lt.locale)
;


# TRUNCATE table ltm_translations;
23 changes: 22 additions & 1 deletion src/Barryvdh/TranslationManager/Controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,28 @@ function getIndex($group = null)
function getSearch()
{
$q = \Input::get('q');
$translations = Translation::where('key', 'like', "%$q%")->orWhere('value', 'like', "%$q%")->orderBy('group', 'asc')->orderBy('key', 'asc')->get();

if ($q === '') $translations = [];
else
{
if (strpos($q, '%') === false) $q = "%$q%";

//$translations = Translation::where('key', 'like', "%$q%")->orWhere('value', 'like', "%$q%")->orderBy('group', 'asc')->orderBy('key', 'asc')->get();

// need to fill-in missing locale's that match the key
$translations = DB::select(<<<SQL
SELECT * FROM ltm_translations rt WHERE `key` LIKE ? OR value LIKE ?
UNION ALL
SELECT NULL id, 0 status, lt.locale, kt.`group`, kt.`key`, NULL value, NULL created_at, NULL updated_at, NULL source, NULL saved_value
FROM (SELECT DISTINCT locale FROM ltm_translations) lt
CROSS JOIN (SELECT DISTINCT `key`, `group` FROM ltm_translations) kt
WHERE NOT exists(SELECT * FROM ltm_translations tr WHERE tr.`key` = kt.`key` AND tr.`group` = kt.`group` AND tr.locale = lt.locale)
AND `key` LIKE ?
ORDER BY `key`, `group`, locale
SQL
, [$q, $q, $q,]);
}

$numTranslations = count($translations);

return \View::make('laravel-translation-manager::search')->with('translations', $translations)->with('numTranslations', $numTranslations);
Expand Down
Loading

0 comments on commit fc84813

Please sign in to comment.