60 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
// Implementation of chrome.i18n.getMessage
 | 
						|
// https://developer.chrome.com/extensions/i18n#method-getMessage
 | 
						|
//
 | 
						|
// Does not implement predefined messages:
 | 
						|
// https://developer.chrome.com/extensions/i18n#overview-predefined
 | 
						|
 | 
						|
import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils';
 | 
						|
 | 
						|
interface Placeholder {
 | 
						|
  content: string;
 | 
						|
  example?: string;
 | 
						|
}
 | 
						|
 | 
						|
const getMessages = (extensionId: number) => {
 | 
						|
  try {
 | 
						|
    const data = ipcRendererUtils.invokeSync<string>('CHROME_GET_MESSAGES', extensionId);
 | 
						|
    return JSON.parse(data) || {};
 | 
						|
  } catch {
 | 
						|
    return {};
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
const replaceNumberedSubstitutions = (message: string, substitutions: string[]) => {
 | 
						|
  return message.replace(/\$(\d+)/, (_, number) => {
 | 
						|
    const index = parseInt(number, 10) - 1;
 | 
						|
    return substitutions[index] || '';
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
const replacePlaceholders = (message: string, placeholders: Record<string, Placeholder>, substitutions: string[] | string) => {
 | 
						|
  if (typeof substitutions === 'string') substitutions = [substitutions];
 | 
						|
  if (!Array.isArray(substitutions)) substitutions = [];
 | 
						|
 | 
						|
  if (placeholders) {
 | 
						|
    Object.keys(placeholders).forEach((name: string) => {
 | 
						|
      let { content } = placeholders[name];
 | 
						|
      const substitutionsArray = Array.isArray(substitutions) ? substitutions : [];
 | 
						|
      content = replaceNumberedSubstitutions(content, substitutionsArray);
 | 
						|
      message = message.replace(new RegExp(`\\$${name}\\$`, 'gi'), content);
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  return replaceNumberedSubstitutions(message, substitutions);
 | 
						|
};
 | 
						|
 | 
						|
const getMessage = (extensionId: number, messageName: string, substitutions: string[]) => {
 | 
						|
  const messages = getMessages(extensionId);
 | 
						|
  if (Object.prototype.hasOwnProperty.call(messages, messageName)) {
 | 
						|
    const { message, placeholders } = messages[messageName];
 | 
						|
    return replacePlaceholders(message, placeholders, substitutions);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
exports.setup = (extensionId: number) => {
 | 
						|
  return {
 | 
						|
    getMessage (messageName: string, substitutions: string[]) {
 | 
						|
      return getMessage(extensionId, messageName, substitutions);
 | 
						|
    }
 | 
						|
  };
 | 
						|
};
 |