Как скопировать шаблон регистра при выполнении замены строки? - PullRequest
3 голосов
/ 01 марта 2011

Например, если слово «Пользователи», а замена - «utilisateurs», есть ли какая-то функция, которая позволит мне преобразовать строку замены в тот же уровень прописных / некапитальных букв, что и в исходном слове?

Это заключительная часть основного языкового перевода с использованием jquery, текстовых узлов, точного и частичного сопоставления строк.

Теперь я просто хочу сделать последний и профессиональный штрих, чтобы сделатьубедитесь, что регистр переведенных / замененных слов совпадает с регистром исходных слов / фраз.

Я не уверен, как применить это как вызов замены.

Я хочу, чтобы этобыть функцией

function CopyCase(original,new) {

    // copy the case of the original to the new
}

Только не уверен, как это сделать.

Ответы [ 3 ]

1 голос
/ 01 марта 2011

Вот функция, которая будет обрабатывать случаи без внутренней заглавной буквы:

function caseWord(word, upper) {
    return String.prototype[ upper ? "toUpperCase" : "toLowerCase"].apply(word[0]) + word.slice(1);
}
function caseReplace(s, fromWord, toWord) {
    return s.replace(caseWord(fromWord), caseWord(toWord))
            .replace(caseWord(fromWord, true), caseWord(toWord, true));
}

console.log(caseReplace("The users have joined the Users union.", "users", "utilisateurs"))
console.log(caseReplace("The lovers have joined the Lovers union.", "lovers", "amants"))

// The utilisateurs have joined the Utilisateurs union.
// The amants have joined the Amants union.
0 голосов
/ 01 марта 2011
function matchCase (word1, word2) {
  //   1) Words starting with two capital letters are assumed to be all caps.
  //   2) Words starting with two lower case letters are assumed to be all lower case.
  //   3) Words starting with an upper case followed by a lowercase letter are
  //      all lower case except the first letter.

   return word1[0] === word1[0].toLowerCase () ? word2.toLowerCase () :
          word1[1] === word1[1].toLowerCase () ? word2[0].toUpperCase () + word2.slice (1).toLowerCase () :
            word2.toUpperCase ();  
}

matchCase ('Word', 'mot')
"Mot"
matchCase ('WOrd', 'mot')
"MOT"
matchCase ('word', 'mot')
"mot"
matchCase ('wOrD', 'mot')
"mot"
matchCase ('woRD', 'mot')
"mot"

Отредактировано для изменения теста на нижний регистр, который теперь должен быть независимым от языка (если в основе лежит функция toLowerCase)

0 голосов
/ 01 марта 2011

Метод String.replace принимает функцию обратного вызова в качестве второго аргумента. В этом обратном вызове вы можете выполнить любую специальную обработку, которая вам нужна, прежде чем возвращать замещающую строку.

var translations = {
    users: "utilisateurs",
    apples: "pommes",
    ...
};

// You could generate the regular expression from the object above
// or if the number of words is high, not use regular expressions at all.
s = s.replace(/users|apples|oranges/gi, function (match) {
    return matchCase(translations[match], match);
});

function getCase(ch) {
    return ch == ch.toUpperCase()
        ? "Upper"
        : "Lower";
}

function convertCase(s, case) {
    return s["to" + case + "Case"]();
}

function matchCase(s, target) {
    return convertCase(s[0], getCase(target[0]))
        + convertCase(s.substr(1), getCase(target[1]));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...