Files
gallery3/core/js/l10n_client.js
Andy Staudacher dce6548431 Add local localization functionality. Local = no means to upload / download translations to a translation server yet.
- Added an outgoing_translations table to store translations from the local translation UI.
 - I18n class is checking incoming_ and outgoing_translations for translations, giving the latter priority.
 - Not handling plural strings in the translations UI yet.
2009-02-09 08:42:13 +00:00

196 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Fork from Drupal's l10n_client module, originally written by:
// G‡bor Hojtsy http://drupal.org/user/4166 (original author)
// Young Hahn / Development Seed - http://developmentseed.org/ (friendly user interface)
var Gallery = Gallery || { 'behaviors': {} };
Gallery.attachBehaviors = function(context) {
context = context || document;
// Execute all of them.
jQuery.each(Gallery.behaviors,
function() {
this(context);
});
};
$(document).ready(function() {
Gallery.attachBehaviors(this);
});
// Store all l10n_client related data + methods in its own object
jQuery.extend(Gallery, {
l10nClient: new (function() {
// Set "selected" string to unselected, i.e. -1
this.selected = -1;
// Keybindings
this.keys = {'toggle':'ctrl+shift+s', 'clear': 'esc'}; // Keybindings
// Keybinding functions
this.key = function(pressed) {
switch(pressed) {
case 'toggle':
// Grab user-hilighted text & send it into the search filter
userSelection = window.getSelection ? window.getSelection() : document.getSelection ? document.getSelection() : document.selection.createRange().text;
userSelection = String(userSelection);
if(userSelection.length > 0) {
Gallery.l10nClient.filter(userSelection);
Gallery.l10nClient.toggle(1);
$('#l10n-client #gL10nSearch').focus();
} else {
if($('#l10n-client').is('.hidden')) {
Gallery.l10nClient.toggle(1);
if(!$.browser.safari) {
$('#l10n-client #gL10nSearch').focus();
}
} else {
Gallery.l10nClient.toggle(0);
}
}
break;
case 'clear':
this.filter(false);
break;
}
}
// Toggle the l10nclient
this.toggle = function(state) {
switch(state) {
case 1:
$('#l10n-client-string-select, #l10n-client-string-editor, #l10n-client .labels .label').show();
$('#l10n-client').height('22em').removeClass('hidden');
$('#l10n-client .labels .toggle').text('X');
/*
* This CSS clashes with Gallery's CSS, probably due to
* YUI's grid / floats.
if(!$.browser.msie) {
$('body').css('border-bottom', '22em solid #fff');
}
*/
$.cookie('Gallery_l10n_client', '1', {expires: 7, path: '/'});
break;
case 0:
$('#l10n-client-string-select, #l10n-client-string-editor, #l10n-client .labels .label').hide();
$('#l10n-client').height('2em').addClass('hidden');
// TODO: Localize this message
$('#l10n-client .labels .toggle').text('Translate Text');
/*
if(!$.browser.msie) {
$('body').css('border-bottom', '0px');
}
*/
$.cookie('Gallery_l10n_client', '0', {expires: 7, path: '/'});
break;
}
}
// Get a string from the DOM tree
this.getString = function(index, type) {
return l10n_client_data[index][type];
}
// Set a string in the DOM tree
this.setString = function(index, data) {
l10n_client_data[index]['translation'] = data;
}
// Filter the the string list by a search string
this.filter = function(search) {
if(search == false || search == '') {
$('#l10n-client #l10n-search-filter-clear').focus();
$('#l10n-client-string-select li').show();
$('#l10n-client #gL10nSearch').val('');
$('#l10n-client #gL10nSearch').focus();
} else {
if(search.length > 0) {
$('#l10n-client-string-select li').hide();
$('#l10n-client-string-select li:contains('+search+')').show();
$('#l10n-client #gL10nSearch').val(search);
}
}
}
})
});
// Attaches the localization editor behavior to all required fields.
Gallery.behaviors.l10nClient = function(context) {
switch($.cookie('Gallery_l10n_client')) {
case '1':
Gallery.l10nClient.toggle(1);
break;
default:
Gallery.l10nClient.toggle(0);
break;
}
// If the selection changes, copy string values to the source and target fields.
// Add class to indicate selected string in list widget.
$('#l10n-client-string-select li').click(function() {
$('#l10n-client-string-select li').removeClass('active');
$(this).addClass('active');
var index = $('#l10n-client-string-select li').index(this);
$('#l10n-client-string-editor .source-text').text(Gallery.l10nClient.getString(index, 'source'));
$("#gL10nClientSaveForm input[name='l10n-message-source']").val(Gallery.l10nClient.getString(index, 'source'));
$('#gL10nClientSaveForm #l10n-edit-target').val(Gallery.l10nClient.getString(index, 'translation'));
Gallery.l10nClient.selected = index;
});
// When l10n_client window is clicked, toggle based on current state.
$('#l10n-client .labels .toggle').click(function() {
if($('#l10n-client').is('.hidden')) {
Gallery.l10nClient.toggle(1);
} else {
Gallery.l10nClient.toggle(0);
}
});
// Register keybindings using jQuery hotkeys
// TODO: Either remove hotkeys code or add query.hotkeys.js.
if($.hotkeys) {
$.hotkeys.add(Gallery.l10nClient.keys['toggle'], function(){Gallery.l10nClient.key('toggle')});
$.hotkeys.add(Gallery.l10nClient.keys['clear'], {target:'#l10n-client #gL10nSearch', type:'keyup'}, function(){Gallery.l10nClient.key('clear')});
}
// Custom listener for l10n_client livesearch
$('#l10n-client #gL10nSearch').keyup(function(key) {
Gallery.l10nClient.filter($('#l10n-client #gL10nSearch').val());
});
// Clear search
$('#l10n-client #l10n-search-filter-clear').click(function() {
Gallery.l10nClient.filter(false);
return false;
});
// Send AJAX POST data on form submit.
$('#gL10nClientSaveForm').ajaxForm({
dataType: "json",
success: function(data) {
// Store string in local js
Gallery.l10nClient.setString(Gallery.l10nClient.selected, $('#gL10nClientSaveForm #l10n-edit-target').val());
// Mark string as translated.
$('#l10n-client-string-select li').eq(Gallery.l10nClient.selected).removeClass('untranslated').removeClass('active').addClass('translated').text($('#gL10nClientSaveForm #l10n-edit-target').val());
// Empty input fields.
$('#l10n-client-string-editor .source-text').html('');
$('#gL10nClientSaveForm #l10n-edit-target').val('');
$("#gL10nClientSaveForm input[name='l10n-message-source']").val('');
},
error: function(xmlhttp) {
// TODO: Localize this message
alert('An HTTP error @status occured (or empty response).'.replace('@status', xmlhttp.status));
}
});
// Copy source text to translation field on button click.
$('#gL10nClientSaveForm #l10n-edit-copy').click(function() {
$('#gL10nClientSaveForm #l10n-edit-target').val($('#l10n-client-string-editor .source-text').text());
});
// Clear translation field on button click.
$('#gL10nClientSaveForm #l10n-edit-clear').click(function() {
$('#gL10nClientSaveForm #l10n-edit-target').val('');
});
};