private function resolveProperty(Row $row, $name, $locale, $shadowLocale = null)
    {
        if (array_key_exists(sprintf('node.%s', $name), $row->getValues())) {
            return $row->getValue($name);
        }

        if (null !== $shadowLocale && !in_array($name, self::$nonFallbackProperties)) {
            $locale = $shadowLocale;
        }

        $name = sprintf('%s%s', $locale, str_replace('-', '_', ucfirst($name)));

        try {
            return $row->getValue($name);
        } catch (ItemNotFoundException $e) {
            // the default value of a non existing property in jackalope is an empty string
            return '';
        }
    }