diff --git a/data/data_dev.js b/data/data_dev.js index f20fca45e..ce8273867 100644 --- a/data/data_dev.js +++ b/data/data_dev.js @@ -17,7 +17,8 @@ iD.data = { path + 'data/feature-icons.json', path + 'data/operations-sprite.json', path + 'data/locales.json', - path + 'dist/locales/en.json' + path + 'dist/locales/en.json', + path + 'data/name-suggestions.json' ], d3.json, function (err, data) { iD.data = { @@ -35,7 +36,8 @@ iD.data = { featureIcons: data[9], operations: data[10], locales: data[11], - en: data[12] + en: data[12], + suggestions: data[13] }; callback(); diff --git a/js/id/ui/preset/localized.js b/js/id/ui/preset/localized.js index 0a4034705..ab49ed4ec 100644 --- a/js/id/ui/preset/localized.js +++ b/js/id/ui/preset/localized.js @@ -1,4 +1,4 @@ -iD.ui.preset.localized = function(field) { +iD.ui.preset.localized = function(field, context) { var event = d3.dispatch('change'), wikipedia = iD.wikipedia(), @@ -18,6 +18,8 @@ iD.ui.preset.localized = function(field) { .on('blur', change) .on('change', change); + input.call(d3.combobox().fetcher(suggestNames)); + var translateButton = selection.selectAll('.localized-add') .data([0]); @@ -89,6 +91,35 @@ iD.ui.preset.localized = function(field) { event.change(t); } + function suggestNames(value, callback) { + var suggest = [], + s9s = iD.data.suggestions; + if (value && value.length > 2) { + var selected = context.selectedIDs(), + entity = context.entity(selected), + preset = context.presets().match(entity, context.graph()); + preset = preset.id.split('/', 2); + var k = preset[0], + v = preset[1]; + if (s9s[k] && s9s[k][v]) { + for (var sugg in s9s[k][v]) { + var dist = iD.util.editDistance(value, sugg.substring(0, value.length)); + if (dist < 5) { + suggest.push({ + title: sugg, + value: sugg, + dist: dist + }); + } + } + } + suggest.sort(function(a, b) { + return a.dist - b.dist; + }); + } + callback(suggest); + } + function fetcher(value, cb) { var v = value.toLowerCase();