访问Mac OS X用户的日期和时间首选项

时间:2019-04-23 16:34:36

标签: macos electron

我正在使用一个日历应用程序,该应用程序在Mac OS的顶部栏中显示一个简单的日历。目前,此应用已将一周的开始日期硬编码为星期日

我希望能够从电子用户的日期和类型首选项中了解他们一周几号开始

我已经看到Electron使用此方法https://electronjs.org/docs/api/system-preferences#systempreferencesgetuserdefaultkey-type-macos,但是我不确定是否可以从那里知道使用日历的用户的“开始工作日”

如果能的话,我很高兴从Electron那里获得该信息。

以下是有关Github的对话供参考: https://github.com/mike-engel/Barnacal/issues/3

2 个答案:

答案 0 :(得分:0)

确实可以通过使用systemPreferences.getUserDefault(key, type)访问用户的第一个工作日设置。

相关的key'AppleFirstWeekday',其type'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);

答案 1 :(得分:0)

这是独立于Electron的解决方案。它还使用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" 

当然,不应在生产中直接使用它。例如,应该有(更好)错误处理,正则表达式很粗糙,等等。这已经在优胜美地进行了测试。

我特意在没有电子功能systemPreferences.getUserDefault(key, type)的情况下工作,以使此答案更通用。当然,可以轻松地将exec调用交换为Electron函数。