Доступ пользователя Mac OS X к настройкам даты и времени - PullRequest
0 голосов
/ 23 апреля 2019

Я использую приложение календаря, которое отображает простой календарь на верхней панели Mac OS. В настоящее время это приложение имеет жестко запрограммированное начало недели до воскресенья

Я бы хотел узнать от даты и типа предпочтений пользователя Electro, чтобы узнать, в какой день они начинают работать неделю

Я видел, что у Electron есть этот метод https://electronjs.org/docs/api/system-preferences#systempreferencesgetuserdefaultkey-type-macos, но я не уверен, смогу ли я узнать "Начать день недели" для пользователя, использующего календарь

Было бы здорово получить эту информацию от Electron, если это возможно.

Вот беседа на Github для справки: https://github.com/mike-engel/Barnacal/issues/3

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Вот решение, не зависящее от Электрон. Он также использует AppleFirstWeekday, но, похоже, он устанавливается только в том случае, если значение отличается от значения по умолчанию для локали.

Решение принимает это во внимание и возвращается к первому дню недели, заданному по умолчанию для локали. Эта функциональность обеспечивается модулем weekstart (по существу, справочная таблица). Локаль пользователя может быть найдена в AppleLocale.

В отличие от первого ответа, это решение также возвращает правильный результат в случаях, когда пользователь не переопределил начало недели, а языковой стандарт определяет день первой недели, отличный от понедельника.

const APPLE_WEEKDAY_MAP = {
    1: "Sunday",
    2: "Monday",
    3: "Tuesday",
    4: "Wednesday",
    5: "Thursday",
    6: "Friday",
    7: "Saturday"
}

const { execSync } = require('child_process')

function getUserFirstWeekday() {
    let stdout = execSync('defaults read -g AppleFirstWeekday',
        {stdio: ['inherit', 'pipe', 'ignore']} ).toString()
    let match = /gregorian = (\d)/g.exec(stdout)
    return parseInt(match[1])
}

function getLocaleFirstWeekday() {
    // this returns 0..6 (Sun..Sat)
    const getWeekStartByLocale = require('weekstart').getWeekStartByLocale
    let apple_locale = execSync('defaults read -g AppleLocale').toString()
    return getWeekStartByLocale(apple_locale)
}

function getFirstWeekday() {
    // Use user override if applicable, else fall back to locale default
    try {
        return getUserFirstWeekday()
    }
    catch (e) {
    }

    // Using locale default
    return getLocaleFirstWeekday()+1
}

Используйте его следующим образом:

console.log( getFirstWeekday() )
// prints 5

console.log( APPLE_WEEKDAY_MAP[ getFirstWeekday() ] )
// prints "Thursday" 

Конечно, это не должно использоваться в производстве как есть. Например, должна быть (лучшая) обработка ошибок, регулярное выражение довольно грубое и т. Д. Это было проверено на Yosemite.

Я намеренно работал без электронной функции systemPreferences.getUserDefault(key, type), чтобы сделать этот ответ более универсальным. Конечно, можно легко поменять вызовы exec на функцию Electron.

0 голосов
/ 23 апреля 2019

Доступ к настройке первого дня недели пользователя действительно возможен с помощью systemPreferences.getUserDefault (ключ, тип) .

Соответствующий key равен 'AppleFirstWeekday', а его type is 'dictionary' (объект);Несмотря на то, что формат данных довольно прост, он немного запутан, поскольку включает в себя получение числового значения из другого ключа, соответствующего текущему календарю, а также словарь будет пустым объектом, если выбран понедельник, поскольку он является значением по умолчанию ISO..

В любом случае, вот код, который работает для меня из процесса рендеринга, как в macOS Yosemite, так и в El Capitan:

const { systemPreferences } = require ('electron').remote;
const weekdays = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
let firstWeekday = weekdays[1]; // ISO week starts with Monday (default)
let firstWeekdayDict = systemPreferences.getUserDefault ('AppleFirstWeekday', 'dictionary');
// console.log (firstWeekdayDict);
let weekdayKeys = Object.keys (firstWeekdayDict);
if (weekdayKeys.length > 0)
{
    firstWeekday = weekdays[firstWeekdayDict[weekdayKeys[0]] - 1];
}
console.log (firstWeekday);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...