or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

core-translation.mdindex.mdinitialization.mdjquery-integration.mdlanguage-management.mdresource-management.md
tile.json

jquery-integration.mddocs/

jQuery Integration

DOM localization features and jQuery plugin methods for automatic translation of HTML elements using data attributes.

Capabilities

jQuery Translation Shortcut

Direct jQuery integration providing the translation function as a jQuery method.

/**
 * jQuery shortcut for translation function (available when jQuery is loaded)
 * @param key - Translation key or array of keys
 * @param options - Translation options
 * @returns Translated string
 */
$.t(key, options): string;

Usage Examples:

// Basic jQuery translation
console.log($.t('welcome')); // "Welcome"

// With interpolation
console.log($.t('greeting', { name: 'John' })); // "Hello John"

// With pluralization
console.log($.t('item', { count: 5 })); // "5 items"

// Use in jQuery chains
$('#message').text($.t('welcome.message'));
$('#greeting').html($.t('user.greeting', { name: userName }));

// Conditional translations
if ($.t('optional.feature') !== 'optional.feature') {
  $('#feature').show().text($.t('optional.feature'));
}

jQuery DOM Localization Plugin

jQuery plugin for automatic translation of DOM elements using data attributes.

/**
 * jQuery plugin for DOM localization using data-i18n attributes
 * @param options - Translation options to apply to all elements
 * @returns jQuery object for chaining
 */
$.fn.i18n(options): jQuery;

Usage Examples:

<!-- HTML with data-i18n attributes -->
<h1 data-i18n="page.title">Page Title</h1>
<p data-i18n="page.description">Description text</p>
<button data-i18n="buttons.save">Save</button>

<!-- Attribute-specific translations -->
<input type="text" data-i18n="[placeholder]forms.email.placeholder" placeholder="Email">
<img data-i18n="[alt]images.logo.alt" alt="Logo" src="logo.png">

<!-- Multiple attributes -->
<button data-i18n="[title]buttons.save.tooltip;buttons.save" title="Save tooltip">Save</button>
// Initialize localization for all elements
$('[data-i18n]').i18n();

// Localize specific container and children
$('#content').i18n();

// Localize with options
$('[data-i18n]').i18n({
  lng: 'es',
  count: itemCount
});

// Localize on language change
i18n.setLng('fr', function() {
  $('[data-i18n]').i18n(); // Re-translate all elements
});

// Localize dynamically added content
function addContent() {
  const newElement = $('<p data-i18n="dynamic.content">Loading...</p>');
  $('#container').append(newElement);
  newElement.i18n(); // Translate the new element
}

Data Attribute Syntax

Basic Translation

<!-- Basic key translation -->
<span data-i18n="welcome">Welcome</span>

<!-- Nested key with dot notation -->
<h2 data-i18n="user.profile.title">User Profile</h2>

<!-- Namespace-specific key -->
<button data-i18n="common:buttons.submit">Submit</button>

Attribute-Specific Translation

<!-- Translate specific attributes -->
<input data-i18n="[placeholder]forms.search.placeholder" type="text">
<img data-i18n="[alt]images.header.alt" src="header.jpg">
<a data-i18n="[title]links.home.tooltip" href="/">Home</a>

<!-- Multiple attributes -->
<button data-i18n="[title]buttons.delete.confirm;buttons.delete">Delete</button>

<!-- HTML content -->
<div data-i18n="[html]content.rich">Rich HTML content</div>

<!-- Data attributes -->
<div data-i18n="[data-value]config.theme">Theme</div>

<!-- Prepend/append content -->
<div data-i18n="[prepend]prefix.text">Existing content</div>
<div data-i18n="[append]suffix.text">Existing content</div>

Translation Options in Data Attributes

<!-- Inline options as JSON -->
<span data-i18n="greeting" 
      data-i18n-options='{"name": "John", "count": 5}'>Hello</span>

<!-- Options via data attributes -->
<span data-i18n="item" 
      data-count="3">Items</span>

<!-- Default value from content -->
<span data-i18n="missing.key">Default Content</span>

jQuery Integration Patterns

Form Localization

<form id="loginForm">
  <label data-i18n="forms.login.email">Email:</label>
  <input type="email" 
         data-i18n="[placeholder]forms.login.email.placeholder"
         placeholder="Enter email">
  
  <label data-i18n="forms.login.password">Password:</label>
  <input type="password" 
         data-i18n="[placeholder]forms.login.password.placeholder"
         placeholder="Enter password">
  
  <button type="submit" data-i18n="forms.login.submit">Login</button>
  <a href="#" data-i18n="forms.login.forgot">Forgot password?</a>
</form>
// Localize form
$('#loginForm').i18n();

// Localize with validation messages
$('#loginForm').i18n().find('input').on('invalid', function(e) {
  const field = $(this).attr('name');
  const message = $.t(`validation.${field}.required`);
  this.setCustomValidity(message);
});

Dynamic Content Localization

function addNotification(type, messageKey, options) {
  const notification = $(`
    <div class="notification ${type}">
      <span data-i18n="${messageKey}">Loading...</span>
      <button data-i18n="buttons.close" class="close">×</button>
    </div>
  `);
  
  $('#notifications').append(notification);
  
  // Localize the new notification
  notification.i18n(options);
  
  return notification;
}

// Usage
addNotification('success', 'messages.saved', { filename: 'document.pdf' });
addNotification('error', 'errors.network');

Table Localization

<table id="dataTable">
  <thead>
    <tr>
      <th data-i18n="table.headers.name">Name</th>
      <th data-i18n="table.headers.email">Email</th>
      <th data-i18n="table.headers.status">Status</th>
      <th data-i18n="table.headers.actions">Actions</th>
    </tr>
  </thead>
  <tbody>
    <!-- Dynamic rows -->
  </tbody>
</table>
function addTableRow(user) {
  const row = $(`
    <tr>
      <td>${user.name}</td>
      <td>${user.email}</td>
      <td data-i18n="status.${user.status}">Status</td>
      <td>
        <button data-i18n="buttons.edit" data-user-id="${user.id}">Edit</button>
        <button data-i18n="buttons.delete" data-user-id="${user.id}">Delete</button>
      </td>
    </tr>
  `);
  
  $('#dataTable tbody').append(row);
  row.i18n(); // Localize the new row
}

Modal Dialog Localization

function showModal(titleKey, contentKey, options) {
  const modal = $(`
    <div class="modal">
      <div class="modal-content">
        <h2 data-i18n="${titleKey}">Loading...</h2>
        <p data-i18n="${contentKey}">Loading...</p>
        <div class="modal-actions">
          <button data-i18n="buttons.ok" class="primary">OK</button>
          <button data-i18n="buttons.cancel" class="secondary">Cancel</button>
        </div>
      </div>
    </div>
  `);
  
  $('body').append(modal);
  modal.i18n(options);
  modal.show();
  
  return modal;
}

// Usage
showModal('dialogs.confirm.title', 'dialogs.confirm.message', {
  action: 'delete',
  item: 'user account'
});

Advanced jQuery Integration

Custom Data Attributes

// Configure custom selector attribute
i18n.init({
  selectorAttr: 'data-translate', // Use data-translate instead of data-i18n
  // ... other options
});

// Use custom attribute
$('[data-translate]').i18n();

Targeted Element Translation

<div data-i18n="content.main" data-i18n-target=".inner">
  <div class="wrapper">
    <div class="inner">This will be translated</div>
  </div>
</div>

Conditional Translation

function conditionalTranslate(selector, condition) {
  $(selector).each(function() {
    const $element = $(this);
    const key = $element.data('i18n');
    
    if (condition) {
      $element.text($.t(key));
    } else {
      $element.text($.t(key + '.disabled'));
    }
  });
}

// Usage
conditionalTranslate('[data-i18n^="premium."]', user.isPremium);

Language Switcher with jQuery

function createLanguageSwitcher(languages) {
  const switcher = $('<div class="language-switcher"></div>');
  
  languages.forEach(lang => {
    const button = $(`
      <button class="lang-button" data-lang="${lang.code}">
        ${lang.name}
      </button>
    `);
    
    if (lang.code === i18n.lng()) {
      button.addClass('active');
    }
    
    button.on('click', function() {
      const newLang = $(this).data('lang');
      
      i18n.setLng(newLang, function() {
        // Update all translated content
        $('[data-i18n]').i18n();
        
        // Update active state
        $('.lang-button').removeClass('active');
        $(this).addClass('active');
        
        // Update text direction
        $('html').attr('dir', i18n.dir());
      }.bind(this));
    });
    
    switcher.append(button);
  });
  
  return switcher;
}

// Usage
const languages = [
  { code: 'en', name: 'English' },
  { code: 'es', name: 'Español' },
  { code: 'fr', name: 'Français' }
];

$('#header').append(createLanguageSwitcher(languages));

Performance Considerations

// Efficient batch translation
function batchTranslate() {
  // Collect all elements first
  const $elements = $('[data-i18n]');
  
  // Batch process to avoid repeated DOM queries
  $elements.i18n();
}

// Debounced re-translation
let translateTimeout;
function debouncedTranslate() {
  clearTimeout(translateTimeout);
  translateTimeout = setTimeout(batchTranslate, 100);
}

// Optimized for dynamic content
function addTranslatedContent(html) {
  const $content = $(html);
  $('#container').append($content);
  
  // Only translate the new content
  $content.find('[data-i18n]').addBack('[data-i18n]').i18n();
}

Non-jQuery Alternative

When jQuery is not available, i18next-client provides a native DOM method:

/**
 * Translate DOM elements without jQuery dependency
 * @param element - DOM element or document to translate
 * @param options - Translation options
 */
i18n.translateObject(element, options): void;
// Native DOM translation
i18n.translateObject(document);

// Translate specific element
const container = document.getElementById('content');
i18n.translateObject(container);

// With options
i18n.translateObject(document, { lng: 'es' });